Clang LLVM BPF后端不';t将源文件名放在符号表上
我现在正试图从ELF对象中提取源C文件名,ELF对象是由下面的C代码按clang编译而成的Clang LLVM BPF后端不';t将源文件名放在符号表上,clang,llvm,llvm-clang,bpf,ebpf,Clang,Llvm,Llvm Clang,Bpf,Ebpf,我现在正试图从ELF对象中提取源C文件名,ELF对象是由下面的C代码按clang编译而成的 #include <stdint.h> uint64_t test(uint64_t a) { return a + 1; } 我们可以看到源文件名在那里。然而,当我将BPF指定为后端时,我会看到如下输出 $ clang-6.0 -target bpf -c test.c $ readelf -s test.o Symbol table '.symtab' contains 2 ent
#include <stdint.h>
uint64_t test(uint64_t a) {
return a + 1;
}
我们可以看到源文件名在那里。然而,当我将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(标签/发行版\u 600/最终版),通过apt安装。看起来在LLVM中配置很简单。中的
HasSingleParameterDotFile
变量控制ELF文件是否包含源文件符号。自从在LLVM中之后,它就没有改变,在提交消息中也没有解释
当我打开布尔值并重新编译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
我找不到描述BPF生成的ELF中预期字段的文档。这样,负责的方法是
include/llvm/MC/MCAssembler.h
中的addFilename
,llvm中的相关字段是ELF::STT_FILE
,它使用lib/MC/ELFObjectWriter.cpp
中的上述数据。我找不到BPF后端的任何异常。如果您熟悉后端,也许值得一看。谢谢。是的,这就是我现在要找的。然而,正如你所说,我不明白是什么造成了不同。我还发现,即使是其他符号信息,如符号类型或大小,也不会生成。这似乎解决了问题。非常感谢。实际上,我想使用其他符号信息,如符号类型或大小,但它们仍然缺少。但这是另一个问题。我在这个问题中提到的问题通过以下答案得到解决:)我测试了您在电子邮件中提到的解决方案,以获取其他符号信息,并将其附加到我的答案中。
# 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