Clang LLVM BPF后端不';t将源文件名放在符号表上

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

我现在正试图从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 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