error: failed to run custom build command for `blazesym v0.1.0`

文章目录

  • error: failed to run custom build command for `blazesym v0.1.0 (/root/ebpf/libbpf-bootstrap/blazesym)`
    • 报错分析
      • 报错信息
      • 报错分析
    • 错误解决
      • 查找系统中的llvm-gsymutil
      • 解决办法

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

你可能感兴趣的:(eBPF,开发语言,后端,linux)