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

6
考虑使用GCC编译的标准Hello World程序,没有使用任何开关。如readelf -s所示,它包含64个符号。它还指出.symtab部分长度为1024字节。然而,每个符号表条目却有18字节,因此它怎么可能包含64个条目呢?应该是56个条目。我正在构建自己的程序来读取符号表,但它读到部分结束时并没有看到那些“缺失”的条目。那么readelf如何知道要读取多长时间呢?
3个回答

6

正如人们可以在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

这些条目已经对齐并用空格填充,因此大小不匹配。请查看此邮件线程以获取类似的讨论。

至于您的代码,我建议查看源代码中的readelf,特别是binutils/readelf.c中的process_symbol_table()函数。


也许我误解了什么,但如果条目被任意填充,1024字节中会包含更少的条目吗?我没有看到任何填充,因为通过直接读取一个接一个的条目,我得到的结果与readelf报告的前56个条目完全相同。如果我再读一些,我也会得到好的结果。问题是:我怎么知道何时结束?在“.symtab”部分头中报告的大小为1024字节,标准关于这个值说:“此成员以字节为单位给出部分的大小。” - Argbart

0

ELF数据类型的文件大小可能与其内存表示的大小不同。

您可以使用elf32_fsize()elf64_fsize()函数在libelf中检索ELF数据类型的文件大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接