2017-12-19 1 views
1

커널은 samples/bpf에 많은 예제를 제공합니다. Makefile이 충분히 간단 할 수있는 커널 모듈을 빌드하는 것처럼 트리 외부에서 예제 중 하나를 만드는 데 관심이 있습니다. bpf를 사용하여 동일한 작업을 수행 할 수 있습니까? 나는 samples/bpf/Makefile에서 불필요한 부분을 찢어 내고 libbpf과 그 외의 것들에 대한 종속성을 유지하려고 노력했지만 그렇게 쉽지는 않았다. 다음 명령 줄 커널 트리의 samples/bpf/bpf_tcp_kern.c 외부 구축을 위해 노력 예를 들어 커널 트리에서 BPF 프로그램을 빌드하는 방법

이 ( make samples/bpf V=1의 내가 샘플로 살짝/BPF/메이크뿐만 아니라 출력) :

clang -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/5/include \ 
     -I/home/mark/work/net-next.git/arch/x86/include -I/home/mark/work/net-next.git/arch/x86/include/generated -I./include -I/home/mark/work/net-next.git/arch/x86/include/uapi -I/home/mark/work/net-next.git/arch/x86/include/generated/uapi -I/home/mark/work/net-next.git/include -I/home/mark/work/net-next.git/generated/uapi -I./ \ 
     -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \ 
     -D__TARGET_ARCH_x86 -Wno-compare-distinct-pointer-types \ 
     -Wno-gnu-variable-sized-type-not-at-end \ 
     -Wno-address-of-packed-member -Wno-tautological-compare \ 
     -Wno-unknown-warning-option \ 
     -O2 -emit-llvm -c bpf_tcp_kern.c -o -| llc -march=bpf -filetype=obj -o bpf_tcp_kern.o 
In file included from bpf_tcp_kern.c:15: 
In file included from /home/mark/work/net-next.git/include/uapi/linux/bpf.h:11: 
In file included from /home/mark/work/net-next.git/include/linux/types.h:6: 
In file included from /home/mark/work/net-next.git/include/uapi/linux/types.h:5: 
/home/mark/work/net-next.git/arch/x86/include/uapi/asm/types.h:5:10: fatal error: 'asm-generic/types.h' file not found 
#include <asm-generic/types.h> 
     ^
1 error generated 

이가 clang-llvm 3.8.0

그리고 사용자 측 bpf 응용 프로그램을 빌드하려면 libbpf이 필요합니다. 이 부분은 잘 작동합니다.

내가 누락 된 항목이 있습니까? 나는이 일이 아주 쉬워야한다고 믿는다 ;-)

답변

4

이것을 "eBPF"라고 가정한다. 예, 가능해야합니다. 기본적으로,이 같은 뭔가 간단한 eBPF 프로그램을 컴파일 할 수 있어야한다 :

clang -O2 -emit-llvm -c bpf.c -o - | llc -march=bpf -filetype=obj -o bpf.o 

프로그램이 지역 헤더 파일에서 정의를 사용하는 경우 물론

(tc-bpf(8)에 대한 man 페이지에서 가져온), 당신 그것들을 포함 할 수있는 방법을 찾아야합니다 (즉, 그 밖의 모든 것을 "뽑아 버리더라도"파일을 컴파일하기에 충분한 헤더를 유지해야합니다).

일부 노트 :

  • 그 소리와 LLVM (LLC는) 버전 3.7 이상 (더 높은)에 있어야합니다.
  • 컴파일하려는 eBPF 기능에 따라 프로그램을 지원할 수있을만큼 최신 커널 헤더 (특히 <linux/bpf.h>)가 필요합니다 (this page 참조).
  • libbpf을 (를) 사용 하시려는 분은 확실하지 않습니다. 내가 올바르게 기억하면 eBPF 프로그램에 포함되지 않도록 외부 프로그램에서 eBPF 프로그램을로드하고 관리하는 데 사용됩니까?
  • [편집] 또한 samples/bpf 아래의 eBPF 프로그램은 커널 모듈 인프라로 구축 된 것 같습니다. 모듈은 이 아니고 모듈 자체이지만 커널 헤더에 액세스 할 수있는 것처럼 컴파일됩니다. 당신이 나무의 외부 및 커널 메이크없이 컴파일하려고한다면, 당신은 시도, 일반적인 조언으로 ..

<linux/*.h> 헤더에 대한 액세스를 느슨하게하고, <uapi/linux/*.h> 대신 <linux/*.h>로 교체 할 수 있습니다 컴파일 될 때까지 프로그램을 간소화 한 다음 다시 기능을 추가하십시오. 소스 코드 나 오류 메시지 없이는 더 이상 당신을 도울 수 없습니다. 행운을 빕니다!

[질문 자체가 업데이트 된 후 편집] 내가 명령에 다음 세 줄을 추가하여 예제를 컴파일 할 수 있었다 (당신이 그들을 정돈 경우 make samples/bpf/tcp_bufs_kern.o V=1, 확실하지를 실행하여있어 또는 당신이 가지고있는 경우 다른 것) :

… 
-I/home/mark/work/net-next.git/include/generated/uapi \ 
-I/home/mark/work/net-next.git/tools/testing/selftests/bpf/ \ 
-include /home/mark/work/net-next.git/include/linux/kconfig.h \ 
… 

귀하의 명령이 불만을 제기하는 첫 번째 줄. 두 번째 줄은 "bpf-helpers.h"이고, 대신 작업 디렉토리로 쉽게 복사 할 수 있습니다. 마지막 줄은 제거하기가 더 어려울 수도 있습니다. 이유는 무엇인지 자세히 검색하지 않았기 때문에 kconfig.h이 필요합니다. 조사해 봐야 할 것입니다.

+0

''Makefile'에는 실제로'include/generated/uapi'가 포함되어 있지만'linux/kconfig.h'가 누락되었습니다. 이것이 문제였습니다. 감사. – Mark

+0

하나의 추가 자원 :'kernel/sample/bpf /'에있는 Makefile은 분명히 커널 트리 외부에서 샘플을 빌드하기 위해 파생 된 것입니다 : [link] (https://github.com/netoptimizer/prototype-kernel)/blob/master/kernel/samples/bpf/Makefile) – Qeole

관련 문제