【问题标题】:Why ELF file contains symtab sections with size=0?为什么 ELF 文件包含 size=0 的符号表部分?
【发布时间】:2017-02-17 18:23:22
【问题描述】:

我试图理解 ELF 中的符号表,所以我有:

$ cat a.c 

 int i=0; 
 int j; 
 static int l=4; 
 void k(); 
 void d(){ 
   k(); 
 } 

在 ELF 中编译并检查其符号表:

$ gcc -g a.c -c -m32 && readelf -s a.o 

Symbol table '.symtab' contains 18 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS a.c    # Confused
     2: 00000000     0 SECTION LOCAL  DEFAULT    1
     3: 00000000     0 SECTION LOCAL  DEFAULT    3
     4: 00000000     0 SECTION LOCAL  DEFAULT    4
     5: 00000000     4 OBJECT  LOCAL  DEFAULT    3 l
     6: 00000000     0 SECTION LOCAL  DEFAULT    5
     7: 00000000     0 SECTION LOCAL  DEFAULT    7
     8: 00000000     0 SECTION LOCAL  DEFAULT    8
     9: 00000000     0 SECTION LOCAL  DEFAULT   10
    10: 00000000     0 SECTION LOCAL  DEFAULT   12
    11: 00000000     0 SECTION LOCAL  DEFAULT   14
    12: 00000000     0 SECTION LOCAL  DEFAULT   15
    13: 00000000     0 SECTION LOCAL  DEFAULT   13
    14: 00000000     4 OBJECT  GLOBAL DEFAULT    4 i
    15: 00000004     4 OBJECT  GLOBAL DEFAULT  COM j
    16: 00000000    13 FUNC    GLOBAL DEFAULT    1 d
    17: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND k  

真正让我困惑的是: 它说(来自互联网),“值”表示每个部分的偏移量,“大小”表示目标大小。为什么它们的偏移量都为 00000000,其中一些 size=0?

问题:

我想如果 size=0 那么它不应该存在,并且在 ELF 中拥有信息毫无意义。

例如,对于包含源文件名“ac”的行“1”(我标记为“#Confused”),它有Ndx=ABS和Name=ac的信息,如果这个部分是0大小,那么它是如何存储在 ELF 中?我想应该至少有 3 个字节来保存“ac”文件名,所以大小应该 >=3。对吧?

【问题讨论】:

    标签: linux elf symbols readelf


    【解决方案1】:

    你应该注意到符号的类型是 STT_FILE 我熟悉的意思是符号与提取符号的 oject 文件有关。 一种 无论如何你是对的,value 通常在包含它的部分中标记符号的索引,size 代表符号的大小

    在您正在查看的符号中,索引为ABS,类型为STT_FILE 这是在目标文件的静态链接期间应使用的信息,并允许链接器知道哪些符号来自哪个源,因此这是一个实际上并未存储在目标文件中的抽象符号,因此它没有价值也没有大小....希望这对您有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 2012-07-08
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多