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