我现在正在尝试从 ELF 对象中提取源 C 文件名,该对象是由 clang 从以下 C 代码编译而来的。
#include <stdint.h>
uint64_t test(uint64_t a) {
return a + 1;
}
当我将 amd64 指定为后端时,clang 会生成如下所示的 symtab
$ clang-6.0 -target amd64 -c test.c
$ readelf -s test.o
Symbol table '.symtab' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 2
3: 0000000000000000 21 FUNC GLOBAL DEFAULT 2 test
我们可以看到源文件名在那里。但是,当我将 BPF 指定为后端时,我会看到如下所示的输出。
$ clang-6.0 -target bpf -c test.c
$ readelf -s test.o
Symbol table '.symtab' contains 2 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 test
我们看不到源文件名。
有谁知道为什么会这样,我该如何解决这个问题?
工作环境为 Ubuntu18.04-LTS,clang 版本为 6.0.0-1ubuntu2 (tags/RELEASE_600/final),通过 apt 安装。