LLVM BPF 后端不会将源文件名放在符号上 table
LLVM BPF backend doesn't put source file name on symbol table
我现在正在尝试从 ELF 对象中提取源 C 文件名,该对象是通过 clang 从以下 C 代码编译而来的。
#include <stdint.h>
uint64_t test(uint64_t a) {
return a + 1;
}
当我指定 amd64 作为后端时,clang 生成如下所示的符号表
$ 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安装
看起来这是一个简单的LLVM配置问题。 LLVM 中 lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
controls whether or not the ELF file contains the source file symbol. It hasn't changed since the first commit for the BPF backend 中的 HasSingleParameterDotFile
变量,在提交消息中没有解释。
当我打开布尔值并重新编译 LLVM + Clang 时,我得到以下输出:
$ 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
$ readelf -s test-bpf.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test-bpf.c
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 test
我会试着在邮件中询问为什么它是这样配置的,如果没有特别的原因,我会向 LLVM 提交一个补丁。
正如您注意到的(电子邮件交换),同一 LLVM 文件中的 HasDotTypeDotSizeDirective
变量控制 ELF 文件中符号大小和类型的存在:
# With HasDotTypeDotSizeDirective = true:
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test-bpf.c
2: 0000000000000000 56 FUNC GLOBAL DEFAULT 2 test
我现在正在尝试从 ELF 对象中提取源 C 文件名,该对象是通过 clang 从以下 C 代码编译而来的。
#include <stdint.h>
uint64_t test(uint64_t a) {
return a + 1;
}
当我指定 amd64 作为后端时,clang 生成如下所示的符号表
$ 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安装
看起来这是一个简单的LLVM配置问题。 LLVM 中 lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
controls whether or not the ELF file contains the source file symbol. It hasn't changed since the first commit for the BPF backend 中的 HasSingleParameterDotFile
变量,在提交消息中没有解释。
当我打开布尔值并重新编译 LLVM + Clang 时,我得到以下输出:
$ 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
$ readelf -s test-bpf.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test-bpf.c
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 test
我会试着在邮件中询问为什么它是这样配置的,如果没有特别的原因,我会向 LLVM 提交一个补丁。
正如您注意到的(电子邮件交换),同一 LLVM 文件中的 HasDotTypeDotSizeDirective
变量控制 ELF 文件中符号大小和类型的存在:
# With HasDotTypeDotSizeDirective = true:
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test-bpf.c
2: 0000000000000000 56 FUNC GLOBAL DEFAULT 2 test