如何获得ELF符号表中的条目数?

时间:2011-09-03 11:40:50

标签: elf

考虑在没有任何开关的情况下使用GCC编译的C中的标准hello world程序。正如readelf -s所述,它包含64个符号。它还说.symtab部分长度为1024字节。但是每个符号表条目有18个字节,那么它如何包含64个条目呢?它应该是56个条目。我正在构建我自己的程序,它读取符号表,它不会看到那些“缺失”的条目,因为它读到节结束。 readelf怎么知道读多长时间?

3 个答案:

答案 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_WordElf32_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数据类型的文件大小。