所以我试图通过仔细研究一切是如何相关来了解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位表条目。
鉴于我在64位系统上并且ELF文件是64位,我希望该条目在this 64 bit spec中描述。
在查看文件的十六进制转储时,我发现文件中字段的布局似乎是根据这个64位模式。
那么为什么ELF文件看起来似乎使用了尺寸不足的符号表条目,尽管使用64位布局并且是64位文件?
答案 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