如何获取ELF符号表的条目数?
考虑使用 GCC 编译的标准 hello world 程序,无需任何开关。正如 readelf -s 所说,它包含 64 个符号。它还表示 .symtab
部分的长度为 1024 字节。然而每个符号表条目有 18 个字节,那么它怎么可能包含 64 个条目呢?应该是 56 个条目。我正在构建自己的程序,该程序读取符号表,并且在读取到部分结束时不会看到那些“丢失”的条目。 readelf 如何知道阅读多长时间?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
正如在 elf.h 中看到的,符号条目结构如下:
Elf32_Word
和Elf32_Addr
是 32 位值,“Elf32_Half”是 16 位,字符是 8 位。这意味着结构体的大小是 16 个字节而不是 18 个字节。因此,1024 字节长的部分正好提供 64 个条目。As one can see in elf.h, symbol entry structure looks like that:
Elf32_Word
andElf32_Addr
are 32 bit values, `Elf32_Half' is 16 bit, chars are 8 bit. That means that size of structure is 16 not 18 bytes. Therefore 1024 bytes long section gives exactly 64 entries.条目彼此对齐并用空格填充,因此大小不匹配。查看此邮件线程进行类似的讨论。
至于你的代码,我建议查看 readelf 的源代码,尤其是函数
binutils/readelf.c 中的 >process_symbol_table()
。The entries are aligned to each other and padded with blanks, therefore the size mismatch. Check out this mailthread for a similar discussion.
As for your code, I suggest to check out the source for readelf, especially the function
process_symbol_table()
in binutils/readelf.c.ELF 数据类型的文件大小可能与其内存中表示形式的大小不同。
您可以使用 elf32_fsize() 和 elf64_fsize() libelf 检索 ELF 数据类型的文件大小。
The file size of an ELF data type can differ from the size of its in-memory representation.
You can use the elf32_fsize() and elf64_fsize() functions in libelf to retrieve the file size of an ELF data type.