clean-dns-bpf
clean-dns-bpf copied to clipboard
Linux内核如何支持xdp??
其实一直挺关注BPF的,就是不知道Gnu/Linux内核如何支持xdp.有没有Debian Gnu/Linux下的详细讲解
Debian Gnu/Linux内核默认支持xdp、ebpf、mptcp、wireguard估计还有很长时间啊
XDP (eXpress Data Path) is an eBPF based high performance data path merged in the Linux kernel since version 4.8.
ref: https://en.wikipedia.org/wiki/Express_Data_Path
Debian从9开始就支持了。
ref: https://en.wikipedia.org/wiki/Debian_version_history#Release_table
我的意思是如何开启? OS:Debian Gnu/Linux 11 kernel:Linux localhost 5.10.0-9-amd64 #1 SMP Debian 5.10.70-1 (2021-09-30) x86_64 GNU/Linux 具体步逐有么有相关的文章?
不需要手动开启,默认就能用的(当然要是自己编译的内核另说)
ip link set dev eth0
address allmulticast broadcast dynamic multicast netns trailers up
alias arp down mtu name promisc txqueuelen
没有xdp选项
ip link set dev wlp2s0 xdp obj ./clean-dns.elf
段错误 我想我需要一个完整的过程demo,便于实现然后理解
Oct 9 14:49:21 localhost kernel: [ 5677.121935] ip[12873]: segfault at 10 ip 00007ff3a0e82582 sp 00007ffc4814e560 error 4 in libbpf.so.0.3.0[7ff3a0e6c000+23000] Oct 9 14:49:21 localhost kernel: [ 5677.121941] Code: 49 63 47 60 48 8d 58 01 48 69 c0 d8 00 00 00 48 89 5c 24 18 48 89 44 24 50 49 8b 9f 00 01 00 00 48 b8 ab aa aa aa aa aa aa aa <48> 8b 73 10 48 f7 e6 48 c1 ea 04 48 89 54 24 10 48 83 fe 17 0f 86
ip -force link set dev wlan0 xdp object clean-dns.elf ver libbpf: loading clean-dns.elf libbpf: elf: section(1) prog, size 536, link 0, flags 6, type=1 段错误
我找了个debian10(Linux debian 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux)试了下Release里的elf,没复现问题。 如果是load上去就挂,那可能是内核的兼容性问题。 你可以试下搭建一个rust开发环境,然后使用依次运行 For Developer 章节的 Build 和 Run 部分。
我找了个debian10(Linux debian 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux)试了下Release里的elf,没复现问题。 如果是load上去就挂,那可能是内核的兼容性问题。 你可以试下搭建一个rust开发环境,然后使用依次运行 For Developer 章节的 Build 和 Run 部分。
谢谢你的回复,编译会报如下错误:
cargo bpf build clean-dns
error: no such subcommand: bpf
Did you mean `doc`?
找了互联网所有的帖子,发现没有和这个类似的。不知道具体是那里的问题。祝你开心.
另外在Debian Gnu/Linux 11 中执行
apt-get install -t bullseye-proposed-updates iproute2
会安装最新的iproute2 (5.14.0-1~bpo11+1),该版本包含了xdp选项
我找了个debian10(Linux debian 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux)试了下Release里的elf,没复现问题。 如果是load上去就挂,那可能是内核的兼容性问题。 你可以试下搭建一个rust开发环境,然后使用依次运行 For Developer 章节的 Build 和 Run 部分。
谢谢你的回复,编译会报如下错误:
cargo bpf build clean-dns
error: no such subcommand:
bpf
Did you mean `doc`?
找了互联网所有的帖子,发现没有和这个类似的。不知道具体是那里的问题。祝你开心. 另外在Debian Gnu/Linux 11 中执行
apt-get install -t bullseye-proposed-updates iproute2
会安装最新的iproute2 (5.14.0-1~bpo11+1),该版本包含了xdp选项
cargo install cargo-bpf
manjaro(跟你 arch 差不多的) 5.13 的 kernel 编译时依然 SIGSEGV
确认 5.13 支持 CONFIG_XDP_SOCKETS
[w@ww temp]$ zcat /proc/config.gz | grep CONFIG_XDP_SOCKETS
CONFIG_XDP_SOCKETS=y
CONFIG_XDP_SOCKETS_DIAG=m
[w@ww temp]$ cat /boot/config-$(uname -r) | grep CONFIG_XDP_SOCKETS
cat: /boot/config-5.13.19-2-MANJARO: No such file or directory
[w@ww temp]$ zcat /proc/config.gz | head
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 5.13.19-2 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.1.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=110100
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23601
SIGSEGV 的 backtrace
(lldb) run bpf build
There is a running process, kill it and restart?: [Y/n] y
Process 2103336 exited with status = 9 (0x00000009)
Process 2103417 launched: '/home/w/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo' (x86_64)
Process 2103417 stopped
* thread #1, name = 'cargo-bpf', stop reason = exec
frame #0: 0x00007ffff7fce090 ld-2.33.so`_start
ld-2.33.so`_start:
0x7ffff7fce090 <+0>: movq %rsp, %rdi
0x7ffff7fce093 <+3>: callq 0x7ffff7fcee20 ; _dl_start
ld-2.33.so`_dl_start_user:
0x7ffff7fce098 <+0>: movq %rax, %r12
0x7ffff7fce09b <+3>: movl 0x2dc17(%rip), %eax ; _dl_skip_args
(lldb) settings set target.process.stop-on-exec false
(lldb) run bpf build
There is a running process, kill it and restart?: [Y/n] y
Process 2103417 exited with status = 9 (0x00000009)
Process 2103601 launched: '/home/w/.cargo/bin/cargo-bpf' (x86_64)
Process 2103601 stopped and restarted: thread 1 received signal: SIGCHLD
Compiling clean-dns-bpf v0.1.0 (/home/w/repos/clone_repos/clean-dns-bpf)
warning: due to multiple output types requested, the explicitly specified output file name will be adapted for each output type
warning: ignoring --out-dir flag due to -o flag
warning: `clean-dns-bpf` (bin "clean-dns") generated 2 warnings
Finished release [optimized] target(s) in 0.35s
Process 2103601 stopped and restarted: thread 1 received signal: SIGCHLD
Process 2103601 stopped
* thread #1, name = 'cargo-bpf', stop reason = signal SIGSEGV: invalid address (fault address: 0x1a80)
frame #0: 0x0000555559cdce42 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(unsigned int, (anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 162
cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata:
-> 0x555559cdce42 <+162>: movq (%rax,%rdx,8), %rdx
0x555559cdce46 <+166>: movl $0x0, 0x120(%rbp)
0x555559cdce50 <+176>: movq %rdx, %rax
0x555559cdce53 <+179>: shrq $0x3, %rax
(lldb) bt
* thread #1, name = 'cargo-bpf', stop reason = signal SIGSEGV: invalid address (fault address: 0x1a80)
* frame #0: 0x0000555559cdce42 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(unsigned int, (anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 162
frame #1: 0x0000555559cdd321 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders((anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 657
frame #2: 0x0000555559ce046c cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(llvm::Function&, llvm::SmallVectorImpl<llvm::Instruction*> const&) + 1068
frame #3: 0x0000555559ce0701 cargo-bpf`llvm::MetadataLoader::parseMetadataAttachment(llvm::Function&, llvm::SmallVectorImpl<llvm::Instruction*> const&) + 33
frame #4: 0x0000555559cc553a cargo-bpf`(anonymous namespace)::BitcodeReader::parseFunctionBody(llvm::Function*) + 15642
frame #5: 0x0000555559cc989e cargo-bpf`(anonymous namespace)::BitcodeReader::materialize(llvm::GlobalValue*) + 574
frame #6: 0x0000555559ccf726 cargo-bpf`(anonymous namespace)::BitcodeReader::materializeModule() + 166
frame #7: 0x0000555559e0a1bb cargo-bpf`llvm::Module::materializeAll() + 59
frame #8: 0x0000555559ccf3c9 cargo-bpf`llvm::BitcodeModule::getModuleImpl(llvm::LLVMContext&, bool, bool, bool, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 3929
frame #9: 0x0000555559ccf56b cargo-bpf`llvm::parseBitcodeFile(llvm::MemoryBufferRef, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 267
frame #10: 0x0000555559390ca7 cargo-bpf`llvm::parseIR(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 439
frame #11: 0x0000555559391ccd cargo-bpf`LLVMParseIRInContext + 333
frame #12: 0x00005555576ccd3b cargo-bpf`cargo_bpf_lib::llvm::compile::h408fb3dc4f4ed60b + 331
frame #13: 0x00005555576d6d86 cargo-bpf`cargo_bpf_lib::build::build::hd9adab697c50d350 + 3398
frame #14: 0x00005555576d7d51 cargo-bpf`cargo_bpf_lib::build::cmd_build::h74398175950cebbd + 145
frame #15: 0x00005555576b526f cargo-bpf`cargo_bpf::main::h75f4e3ecde46d0b3 + 4559
frame #16: 0x00005555576b8943 cargo-bpf`std::sys_common::backtrace::__rust_begin_short_backtrace::hb975087f78918ca4 + 3
frame #17: 0x00005555576b61a9 cargo-bpf`std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h3842132363a6eb04 (.llvm.16335996392534242537) + 9
frame #18: 0x000055555a02164a cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] core::ops::function::impls::_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$F$GT$::call_once::ha9408abe89f69dc4 at function.rs:259:13
frame #19: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::do_call::h5b0cc9e9102acb65 at panicking.rs:401
frame #20: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::hddc7f8229138b3ba at panicking.rs:365
frame #21: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panic::catch_unwind::hfa401ff8bab2986e at panic.rs:434
frame #22: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h8163422320d11405 at rt.rs:45
frame #23: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::do_call::hc742cc7bb4f0fb20 at panicking.rs:401
frame #24: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::ha37d8d2dd1acf7d3 at panicking.rs:365
frame #25: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panic::catch_unwind::h8a5381d5ecf437bc at panic.rs:434
frame #26: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 at rt.rs:45
frame #27: 0x00005555576b59c2 cargo-bpf`main + 34
frame #28: 0x00007ffff79aeb25 libc.so.6`__libc_start_main + 213
frame #29: 0x00005555576b2f5e cargo-bpf`_start + 46
manjaro(跟你 arch 差不多的) 5.13 的 kernel 编译时依然 SIGSEGV
确认 5.13 支持 CONFIG_XDP_SOCKETS
[w@ww temp]$ zcat /proc/config.gz | grep CONFIG_XDP_SOCKETS CONFIG_XDP_SOCKETS=y CONFIG_XDP_SOCKETS_DIAG=m [w@ww temp]$ cat /boot/config-$(uname -r) | grep CONFIG_XDP_SOCKETS cat: /boot/config-5.13.19-2-MANJARO: No such file or directory [w@ww temp]$ zcat /proc/config.gz | head # # Automatically generated file; DO NOT EDIT. # Linux/x86 5.13.19-2 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=110100 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23601
SIGSEGV 的 backtrace
(lldb) run bpf build There is a running process, kill it and restart?: [Y/n] y Process 2103336 exited with status = 9 (0x00000009) Process 2103417 launched: '/home/w/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo' (x86_64) Process 2103417 stopped * thread #1, name = 'cargo-bpf', stop reason = exec frame #0: 0x00007ffff7fce090 ld-2.33.so`_start ld-2.33.so`_start: 0x7ffff7fce090 <+0>: movq %rsp, %rdi 0x7ffff7fce093 <+3>: callq 0x7ffff7fcee20 ; _dl_start ld-2.33.so`_dl_start_user: 0x7ffff7fce098 <+0>: movq %rax, %r12 0x7ffff7fce09b <+3>: movl 0x2dc17(%rip), %eax ; _dl_skip_args (lldb) settings set target.process.stop-on-exec false (lldb) run bpf build There is a running process, kill it and restart?: [Y/n] y Process 2103417 exited with status = 9 (0x00000009) Process 2103601 launched: '/home/w/.cargo/bin/cargo-bpf' (x86_64) Process 2103601 stopped and restarted: thread 1 received signal: SIGCHLD Compiling clean-dns-bpf v0.1.0 (/home/w/repos/clone_repos/clean-dns-bpf) warning: due to multiple output types requested, the explicitly specified output file name will be adapted for each output type warning: ignoring --out-dir flag due to -o flag warning: `clean-dns-bpf` (bin "clean-dns") generated 2 warnings Finished release [optimized] target(s) in 0.35s Process 2103601 stopped and restarted: thread 1 received signal: SIGCHLD Process 2103601 stopped * thread #1, name = 'cargo-bpf', stop reason = signal SIGSEGV: invalid address (fault address: 0x1a80) frame #0: 0x0000555559cdce42 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(unsigned int, (anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 162 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata: -> 0x555559cdce42 <+162>: movq (%rax,%rdx,8), %rdx 0x555559cdce46 <+166>: movl $0x0, 0x120(%rbp) 0x555559cdce50 <+176>: movq %rdx, %rax 0x555559cdce53 <+179>: shrq $0x3, %rax (lldb) bt * thread #1, name = 'cargo-bpf', stop reason = signal SIGSEGV: invalid address (fault address: 0x1a80) * frame #0: 0x0000555559cdce42 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(unsigned int, (anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 162 frame #1: 0x0000555559cdd321 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders((anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 657 frame #2: 0x0000555559ce046c cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(llvm::Function&, llvm::SmallVectorImpl<llvm::Instruction*> const&) + 1068 frame #3: 0x0000555559ce0701 cargo-bpf`llvm::MetadataLoader::parseMetadataAttachment(llvm::Function&, llvm::SmallVectorImpl<llvm::Instruction*> const&) + 33 frame #4: 0x0000555559cc553a cargo-bpf`(anonymous namespace)::BitcodeReader::parseFunctionBody(llvm::Function*) + 15642 frame #5: 0x0000555559cc989e cargo-bpf`(anonymous namespace)::BitcodeReader::materialize(llvm::GlobalValue*) + 574 frame #6: 0x0000555559ccf726 cargo-bpf`(anonymous namespace)::BitcodeReader::materializeModule() + 166 frame #7: 0x0000555559e0a1bb cargo-bpf`llvm::Module::materializeAll() + 59 frame #8: 0x0000555559ccf3c9 cargo-bpf`llvm::BitcodeModule::getModuleImpl(llvm::LLVMContext&, bool, bool, bool, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 3929 frame #9: 0x0000555559ccf56b cargo-bpf`llvm::parseBitcodeFile(llvm::MemoryBufferRef, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 267 frame #10: 0x0000555559390ca7 cargo-bpf`llvm::parseIR(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 439 frame #11: 0x0000555559391ccd cargo-bpf`LLVMParseIRInContext + 333 frame #12: 0x00005555576ccd3b cargo-bpf`cargo_bpf_lib::llvm::compile::h408fb3dc4f4ed60b + 331 frame #13: 0x00005555576d6d86 cargo-bpf`cargo_bpf_lib::build::build::hd9adab697c50d350 + 3398 frame #14: 0x00005555576d7d51 cargo-bpf`cargo_bpf_lib::build::cmd_build::h74398175950cebbd + 145 frame #15: 0x00005555576b526f cargo-bpf`cargo_bpf::main::h75f4e3ecde46d0b3 + 4559 frame #16: 0x00005555576b8943 cargo-bpf`std::sys_common::backtrace::__rust_begin_short_backtrace::hb975087f78918ca4 + 3 frame #17: 0x00005555576b61a9 cargo-bpf`std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h3842132363a6eb04 (.llvm.16335996392534242537) + 9 frame #18: 0x000055555a02164a cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] core::ops::function::impls::_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$F$GT$::call_once::ha9408abe89f69dc4 at function.rs:259:13 frame #19: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::do_call::h5b0cc9e9102acb65 at panicking.rs:401 frame #20: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::hddc7f8229138b3ba at panicking.rs:365 frame #21: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panic::catch_unwind::hfa401ff8bab2986e at panic.rs:434 frame #22: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h8163422320d11405 at rt.rs:45 frame #23: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::do_call::hc742cc7bb4f0fb20 at panicking.rs:401 frame #24: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::ha37d8d2dd1acf7d3 at panicking.rs:365 frame #25: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panic::catch_unwind::h8a5381d5ecf437bc at panic.rs:434 frame #26: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 at rt.rs:45 frame #27: 0x00005555576b59c2 cargo-bpf`main + 34 frame #28: 0x00007ffff79aeb25 libc.so.6`__libc_start_main + 213 frame #29: 0x00005555576b2f5e cargo-bpf`_start + 46
确认了下直接装载 github release 的 elf 二进制文件是没啥问题的配上 8.8.8.8 的 DNS server,所以不是我 kernel 的问题
我找了个debian10(Linux debian 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux)试了下Release里的elf,没复现问题。 如果是load上去就挂,那可能是内核的兼容性问题。 你可以试下搭建一个rust开发环境,然后使用依次运行 For Developer 章节的 Build 和 Run 部分。
谢谢你的回复,编译会报如下错误:
cargo bpf build clean-dns
error: no such subcommand:
bpf
Did you mean `doc`?
找了互联网所有的帖子,发现没有和这个类似的。不知道具体是那里的问题。祝你开心. 另外在Debian Gnu/Linux 11 中执行
apt-get install -t bullseye-proposed-updates iproute2
会安装最新的iproute2 (5.14.0-1~bpo11+1),该版本包含了xdp选项cargo install cargo-bpf
error: No suitable version of LLVM was found system-wide or pointed to by LLVM_SYS_120_PREFIX.
Consider using `llvmenv` to compile an appropriate copy of LLVM, and
refer to the llvm-sys documentation for more information.
llvm-sys: https://crates.io/crates/llvm-sys
llvmenv: https://crates.io/crates/llvmenv
--> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/llvm-sys-120.2.1/src/lib.rs:486:1 | 486 | / std::compile_error!(concat!( 487 | | "No suitable version of LLVM was found system-wide or pointed 488 | | to by LLVM_SYS_", 489 | | env!("CARGO_PKG_VERSION_MAJOR"), ... | 496 | | llvmenv: https://crates.io/crates/llvmenv" 497 | | )); | |___^
error: aborting due to previous error
error: could not compile llvm-sys
.
To learn more, run the command again with --verbose. warning: build failed, waiting for other jobs to finish...
manjaro(跟你 arch 差不多的) 5.13 的 kernel 编译时依然 SIGSEGV
确认 5.13 支持 CONFIG_XDP_SOCKETS
[w@ww temp]$ zcat /proc/config.gz | grep CONFIG_XDP_SOCKETS CONFIG_XDP_SOCKETS=y CONFIG_XDP_SOCKETS_DIAG=m [w@ww temp]$ cat /boot/config-$(uname -r) | grep CONFIG_XDP_SOCKETS cat: /boot/config-5.13.19-2-MANJARO: No such file or directory [w@ww temp]$ zcat /proc/config.gz | head # # Automatically generated file; DO NOT EDIT. # Linux/x86 5.13.19-2 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=110100 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23601
SIGSEGV 的 backtrace
(lldb) run bpf build There is a running process, kill it and restart?: [Y/n] y Process 2103336 exited with status = 9 (0x00000009) Process 2103417 launched: '/home/w/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo' (x86_64) Process 2103417 stopped * thread #1, name = 'cargo-bpf', stop reason = exec frame #0: 0x00007ffff7fce090 ld-2.33.so`_start ld-2.33.so`_start: 0x7ffff7fce090 <+0>: movq %rsp, %rdi 0x7ffff7fce093 <+3>: callq 0x7ffff7fcee20 ; _dl_start ld-2.33.so`_dl_start_user: 0x7ffff7fce098 <+0>: movq %rax, %r12 0x7ffff7fce09b <+3>: movl 0x2dc17(%rip), %eax ; _dl_skip_args (lldb) settings set target.process.stop-on-exec false (lldb) run bpf build There is a running process, kill it and restart?: [Y/n] y Process 2103417 exited with status = 9 (0x00000009) Process 2103601 launched: '/home/w/.cargo/bin/cargo-bpf' (x86_64) Process 2103601 stopped and restarted: thread 1 received signal: SIGCHLD Compiling clean-dns-bpf v0.1.0 (/home/w/repos/clone_repos/clean-dns-bpf) warning: due to multiple output types requested, the explicitly specified output file name will be adapted for each output type warning: ignoring --out-dir flag due to -o flag warning: `clean-dns-bpf` (bin "clean-dns") generated 2 warnings Finished release [optimized] target(s) in 0.35s Process 2103601 stopped and restarted: thread 1 received signal: SIGCHLD Process 2103601 stopped * thread #1, name = 'cargo-bpf', stop reason = signal SIGSEGV: invalid address (fault address: 0x1a80) frame #0: 0x0000555559cdce42 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(unsigned int, (anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 162 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata: -> 0x555559cdce42 <+162>: movq (%rax,%rdx,8), %rdx 0x555559cdce46 <+166>: movl $0x0, 0x120(%rbp) 0x555559cdce50 <+176>: movq %rdx, %rax 0x555559cdce53 <+179>: shrq $0x3, %rax (lldb) bt * thread #1, name = 'cargo-bpf', stop reason = signal SIGSEGV: invalid address (fault address: 0x1a80) * frame #0: 0x0000555559cdce42 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(unsigned int, (anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 162 frame #1: 0x0000555559cdd321 cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders((anonymous namespace)::(anonymous namespace)::PlaceholderQueue&) + 657 frame #2: 0x0000555559ce046c cargo-bpf`llvm::MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(llvm::Function&, llvm::SmallVectorImpl<llvm::Instruction*> const&) + 1068 frame #3: 0x0000555559ce0701 cargo-bpf`llvm::MetadataLoader::parseMetadataAttachment(llvm::Function&, llvm::SmallVectorImpl<llvm::Instruction*> const&) + 33 frame #4: 0x0000555559cc553a cargo-bpf`(anonymous namespace)::BitcodeReader::parseFunctionBody(llvm::Function*) + 15642 frame #5: 0x0000555559cc989e cargo-bpf`(anonymous namespace)::BitcodeReader::materialize(llvm::GlobalValue*) + 574 frame #6: 0x0000555559ccf726 cargo-bpf`(anonymous namespace)::BitcodeReader::materializeModule() + 166 frame #7: 0x0000555559e0a1bb cargo-bpf`llvm::Module::materializeAll() + 59 frame #8: 0x0000555559ccf3c9 cargo-bpf`llvm::BitcodeModule::getModuleImpl(llvm::LLVMContext&, bool, bool, bool, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 3929 frame #9: 0x0000555559ccf56b cargo-bpf`llvm::parseBitcodeFile(llvm::MemoryBufferRef, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 267 frame #10: 0x0000555559390ca7 cargo-bpf`llvm::parseIR(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>) + 439 frame #11: 0x0000555559391ccd cargo-bpf`LLVMParseIRInContext + 333 frame #12: 0x00005555576ccd3b cargo-bpf`cargo_bpf_lib::llvm::compile::h408fb3dc4f4ed60b + 331 frame #13: 0x00005555576d6d86 cargo-bpf`cargo_bpf_lib::build::build::hd9adab697c50d350 + 3398 frame #14: 0x00005555576d7d51 cargo-bpf`cargo_bpf_lib::build::cmd_build::h74398175950cebbd + 145 frame #15: 0x00005555576b526f cargo-bpf`cargo_bpf::main::h75f4e3ecde46d0b3 + 4559 frame #16: 0x00005555576b8943 cargo-bpf`std::sys_common::backtrace::__rust_begin_short_backtrace::hb975087f78918ca4 + 3 frame #17: 0x00005555576b61a9 cargo-bpf`std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h3842132363a6eb04 (.llvm.16335996392534242537) + 9 frame #18: 0x000055555a02164a cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] core::ops::function::impls::_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$F$GT$::call_once::ha9408abe89f69dc4 at function.rs:259:13 frame #19: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::do_call::h5b0cc9e9102acb65 at panicking.rs:401 frame #20: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::hddc7f8229138b3ba at panicking.rs:365 frame #21: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panic::catch_unwind::hfa401ff8bab2986e at panic.rs:434 frame #22: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h8163422320d11405 at rt.rs:45 frame #23: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::do_call::hc742cc7bb4f0fb20 at panicking.rs:401 frame #24: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panicking::try::ha37d8d2dd1acf7d3 at panicking.rs:365 frame #25: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 [inlined] std::panic::catch_unwind::h8a5381d5ecf437bc at panic.rs:434 frame #26: 0x000055555a021643 cargo-bpf`std::rt::lang_start_internal::h7e2cee8c90d4a4d3 at rt.rs:45 frame #27: 0x00005555576b59c2 cargo-bpf`main + 34 frame #28: 0x00007ffff79aeb25 libc.so.6`__libc_start_main + 213 frame #29: 0x00005555576b2f5e cargo-bpf`_start + 46
用stable。nightly下会崩我也遇到了,可以看cargo-bpf repo的issue。
在另一个使用ebpf的实践中,我也发现不同kernel版本似乎出现了一定的不兼容。原因没有具体定位到,感觉可能是部分内核的BTF支持问题or bpf helper签名问题。 可能确实需要较高版本的kernel。
Ubuntu 22.04