0

我试图理解 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 并且其中一些大小 = 0?

问题:

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

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

4

1 回答 1

0

您应该注意到符号的类型 STT_FILE来自我所熟悉的,这意味着符号与提取符号的 oject 文件相关。a 无论如何你是正确的,value通常在包含它的部分中标记符号的索引并size表示符号的大小

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

于 2016-10-19T23:08:29.210 回答