2017-04-05 78 views
0

所以我想通过仔细了解一切是如何相关的,并且无法理解为什么符号表条目是它们的大小来了解ELF。ELF中的64位符号表条目的格式

当运行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)总大小或0×90赋予的符号表我们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

那么,为什么是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 
+0

我在想这个名字和shdnx是8字节值,但现在我意识到规格中列出的尺寸是4和2。 – TheThirdOne