ELF中64位符号表条目的格式

时间:2017-04-05 03:23:25

标签: elf

所以我试图通过仔细研究一切是如何相关来了解ELF,并且无法理解为什么符号表条目的大小。

当我运行readelf -W -S tiny.o时,我得到:

    Section Headers:
      [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
      [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
      [ 1] .bss              NOBITS          0000000000000000 000200 000001 00  WA  0   0  4
      [ 2] .text             PROGBITS        0000000000000000 000200 00002a 00  AX  0   0 16
      [ 3] .shstrtab         STRTAB          0000000000000000 000230 000031 00      0   0  1
      [ 4] .symtab           SYMTAB          0000000000000000 000270 000090 18      5   5  4
      [ 5] .strtab           STRTAB          0000000000000000 000300 000015 00      0   0  1
      [ 6] .rela.text        RELA            0000000000000000 000320 000030 18      4   2  4

显示符号表每个条目有0x18或24个字节,总大小为(0x300-0x270)或0x90,给我们6个条目。

这与readelf -W -s tiny.o所说的匹配:

    Symbol table '.symtab' contains 6 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS tiny.asm
         2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
         3: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 
         4: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 str
         5: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    2 _start

很明显,24字节大小是正确的,但这对应于this 32 bit spec中描述的32位表条目。

32 bit symbol entry

鉴于我在64位系统上并且ELF文件是64位,我希望该条目在this 64 bit spec中描述。

64 bit symbol entry

在查看文件的十六进制转储时,我发现文件中字段的布局似乎是根据这个64位模式。

那么为什么ELF文件看起来似乎使用了尺寸不足的符号表条目,尽管使用64位布局并且是64位文件?

1 个答案:

答案 0 :(得分:1)

  

那么为什么ELF文件似乎使用尺寸不足的符号表条目

是什么让你相信他们的身材矮小?

Elf64_Sym中,我们有:

int    st_name
char   st_info
char   st_other
short  st_shndx
                <--- 8 bytes
long   st_value
                <--- 8 bytes
long   st_size
                <--- 8 bytes.

总共24个字节,正如您所期望的那样。

为了说服自己一切正常,请编译此程序:

#include <elf.h>
#include <stdio.h>

int main()
{
  Elf64_Sym s64;
  Elf32_Sym s32;
  printf("%zu %zu\n", sizeof(s32), sizeof(s64));
  return 0;
}

运行它会产生16 24。您也可以在GDB下运行它,并查看各种字段的偏移量,例如

(gdb) p (char*)&s64.st_value - (char*)&s64
$1 = 8
(gdb) p (char*)&s64.st_size - (char*)&s64
$2 = 16