2

我现在正在尝试从 ELF 对象中提取源 C 文件名,该对象是由 clang 从以下 C 代码编译而来的。

#include <stdint.h>
uint64_t test(uint64_t a) {
  return a + 1;
}

当我将 amd64 指定为后端时,clang 会生成如下所示的 symtab

$ 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 安装。

4

1 回答 1

0

看起来这是 LLVM 中的简单配置问题。HasSingleParameterDotFile变量 inlib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h控制 ELF 文件是否包含源文件符号。自LLVM中 BPF 后端的第一次提交以来,它没有改变,并且没有在提交消息中解释。

当我打开布尔值并重新编译 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 提交一个补丁。


正如您所注意到的(电子邮件交换),HasDotTypeDotSizeDirective同一 LLVM 文件中的变量控制 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
于 2018-09-08T16:18:23.693 回答