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

发布于 2024-12-03 07:26:42 字数 225 浏览 0 评论 0 原文

考虑使用 GCC 编译的标准 hello world 程序,无需任何开关。正如 readelf -s 所说,它包含 64 个符号。它还表示 .symtab 部分的长度为 1024 字节。然而每个符号表条目有 18 个字节,那么它怎么可能包含 64 个条目呢?应该是 56 个条目。我正在构建自己的程序,该程序读取符号表,并且在读取到部分结束时不会看到那些“丢失”的条目。 readelf 如何知道阅读多长时间?

Consider standard hello world program in C compiled using GCC without any switches. As readelf -s says, it contains 64 symbols. It says also that .symtab section is 1024 bytes long. However each symbol table entry has 18 bytes, so how it is possible it contains 64 entries? It should be 56 entries. I'm constructing my own program which reads symbol table and it does not see those "missing" entries as it reads till section end. How readelf knows how long to read?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

女皇必胜 2024-12-10 07:26:42

正如在 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 个条目。

As one can see in elf.h, symbol entry structure looks like that:

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 and Elf32_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.

通知家属抬走 2024-12-10 07:26:42

条目彼此对齐并用空格填充,因此大小不匹配。查看此邮件线程进行类似的讨论。

至于你的代码,我建议查看 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.

雨夜星沙 2024-12-10 07:26:42

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文