文章目录
error: failed to run custom build command for blazesym v0.1.0 (/root/ebpf/libbpf-bootstrap/blazesym)
在Ubuntu22.04下编译libbpf-bootstrap时报错
报错分析
报错信息
报错信息如下:
error: failed to run custom build command for `blazesym v0.1.0 (/root/ebpf/libbpf-bootstrap/blazesym)`
Caused by:
process didn't exit successfully: `/root/ebpf/libbpf-bootstrap/blazesym/target/release/build/blazesym-da3a0b26ab96acaa/build-script-build` (exit status: 101)
--- stdout
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test.c
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test-no-debug.bin
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test.c
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test-dwarf-v4.bin
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test-gsym.ld
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test-gsym.c
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test-gsym.bin
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test-gsym.bin
cargo:rerun-if-changed=/root/ebpf/libbpf-bootstrap/blazesym/data/test.gsym
--- stderr
thread 'main' panicked at 'failed to run `llvm-gsymutil`: failed to run `llvm-gsymutil --convert /root/ebpf/libbpf-bootstrap/blazesym/data/test-gsym.bin --out-file /root/ebpf/libbpf-bootstrap/blazesym/data/test.gsym`
Caused by:
No such file or directory (os error 2)', build.rs:104:6
报错分析
原因是我的系统安装了rust环境(有cargo).
根据example/c/Makefile中的代码,如果检测到cargo则会编译blazesym项目。
根据报错信息,说是没找到llvm-gsymutil
命令,根据最后的Caused by,去检测build.rs:104行代码
91 /// Convert debug information contained in `src` into GSYM in `dst` using
92 /// `llvm-gsymutil`.
93 fn gsym(src: &Path, dst: &str) {
94 let dst = src.with_file_name(dst);
95 println!("cargo:rerun-if-changed={}", src.display());
96 println!("cargo:rerun-if-changed={}", dst.display());
97
98 let gsymutil = env::var_os("LLVM_GSYMUTIL").unwrap_or_else(|| OsString::from("llvm-gsymutil"));
99
100 run(
101 gsymutil,
102 ["--convert".as_ref(), src, "--out-file".as_ref(), &dst],
103 )
104 .expect("failed to run `llvm-gsymutil`")
105 }
let gsymutil = env::var_os("LLVM_GSYMUTIL").unwrap_or_else(|| OsString::from("llvm-gsymutil"));
该行代码通过环境变量去找llvm-gsymutil
命令,然后赋值给gsymutil,没找到则会报错。
错误解决
查找系统中的llvm-gsymutil
该命令随llvm一起发布,我的系统安装了llvm,理论上应该有这个命令。
whereis一下:
~# whereis llvm-gsymutil
llvm-gsymutil:
我去,确实没有??
不慌,去llvm的bin目录看一下:
# ll /usr/lib/llvm-14/bin/ |grep llvm-gsymutil
-rwxr-xr-x 1 root root 69024 Mar 24 2022 llvm-gsymutil*
命令存在,说明环境变量$PATH中没有包含该路径。
解决办法
都分析到这儿了,自然也就好办了。
- 临时解决办法
export PATH=/usr/lib/llvm-14/bin/:$PATH
- 持久解决办法
vim ~/.bashrc
export PATH="/usr/lib/llvm-14/bin/:$PATH"
source ~/.bashrc