LLVM BPF后端未在符号表上放置源文件名

时间:2018-08-21 09:20:18

标签: clang llvm llvm-clang bpf

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

1 个答案:

答案 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