为什么ELF文件包含size = 0的symtab部分?

时间:2016-10-09 02:46:51

标签: linux elf symbols readelf

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

$ cat a.c 

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

在ELF中编译并检查其symtab:

$ 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中包含信息毫无意义。

,例如,对于第" 1"包含源文件名" a.c" (我标记为" #Confused),它有Ndx = ABS和Name = a.c的信息,如果这个部分是0大小,那么它是如何存储在ELF中的?我想应该至少有3个字节来保存" a.c"文件名,因此大小应为> = 3。正确?

1 个答案:

答案 0 :(得分:0)

你应该注意到符号的类型是 根据我所熟悉的Intent emailIntent = new Intent(); emailIntent.setAction(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_TEXT, text); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); emailIntent.setType("message/rfc822"); Intent openInChooser = Intent.createChooser(emailIntent,resources.getString(R.string.app_name)); startActivity(openInChooser); 意味着符号与提取的符号的oject文件相关。  一个 无论如何你是正确的,STT_FILE通常标记包含它的部分内的符号索引,value表示符号的大小

您正在查看的符号中的

索引为size,类型为ABS 这是在目标文件的静态链接期间应该使用的信息,并允许链接器知道哪些符号来自哪个源,因此这是一个实际上不存储在目标文件中的抽象符号,因此它没有值且没有大小....希望这有助于你