我现在正试图从ELF对象中提取源C文件名,该文件是通过clang从以下C代码编译而成的。
const {
pathContext: { category },
data: {
allMarkdownRemark: { totalCount, edges: markdownEdges },
site: {
siteMetadata: { facebook }
},
allJupyterNotebook: { edges: notebookEdges }
}
} = props;
当我将amd64指定为后端时,铛会生成如下所示的symtab
#include <stdint.h>
uint64_t test(uint64_t a) {
return a + 1;
}
我们可以看到源文件名在那里。但是,当我将BPF指定为后端时,会看到类似下面的输出。
$ 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
我们看不到源文件名。
有人知道为什么吗?我该如何解决这个问题?
工作环境为Ubuntu18.04-LTS,clang版本为6.0.0-1ubuntu2(标签/ RELEASE_600 / final),可通过apt安装。
答案 0 :(得分:0)
看起来这是LLVM中的简单配置问题。 lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
中的HasSingleParameterDotFile
变量控制ELF文件是否包含源文件符号。自LLVM中的the first commit for the BPF backend起,它就没有更改,并且在提交消息中也没有说明。
当我打开布尔值并重新编译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