考虑在没有任何开关的情况下使用GCC编译的C中的标准hello world程序。正如readelf -s
所述,它包含64个符号。它还说.symtab
部分长度为1024字节。但是每个符号表条目有18个字节,那么它如何包含64个条目呢?它应该是56个条目。我正在构建我自己的程序,它读取符号表,它不会看到那些“缺失”的条目,因为它读到节结束。 readelf怎么知道读多长时间?
答案 0 :(得分:5)
正如人们在elf.h中看到的那样,符号输入结构如下所示:
typedef struct elf32_sym {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;
Elf32_Word
和Elf32_Addr
是32位值,`Elf32_Half'是16位,字符是8位。这意味着结构的大小是16而不是18个字节。因此,1024字节长的部分恰好提供了64个条目。
答案 1 :(得分:1)
条目彼此对齐并用空格填充,因此大小不匹配。查看this mailthread进行类似的讨论。
至于您的代码,我建议您查看source的readelf,尤其是 binutils / readelf.c 中的函数process_symbol_table()
。
答案 2 :(得分:0)
ELF数据类型的文件大小可能与其内存中表示的大小不同。
您可以使用elf32_fsize()中的elf64_fsize()和libelf函数来检索ELF数据类型的文件大小。