【问题标题】:How to obtain number of entries in ELF's symbol table?如何获取 ELF 符号表中的条目数?
【发布时间】:2011-11-09 17:02:22
【问题描述】:

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

【问题讨论】:

    标签: elf


    【解决方案1】:

    条目相互对齐并用空格填充,因此大小不匹配。查看this mailthread 进行类似讨论。

    至于您的代码,我建议查看 source 的 readelf,尤其是 binutils/readelf.c 中的函数 process_symbol_table()

    【讨论】:

    • 也许我误解了一些东西,但是如果条目无论如何都被填充了,1024字节中包含的条目数量会更少吗?我没有看到任何填充,因为通过一个接一个地直接读取条目,我得到的结果与 readelf 报告的 56 个第一个条目完全相同。如果我多读一些,我也会有很好的结果。问题是:我怎么知道在哪里结束? .symtab 部分标题中报告的大小为 1024 字节,标准说明此值“此成员以字节为单位给出部分的大小。”
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 2019-06-08
        • 2011-02-11
        • 2011-01-15
        • 2017-03-03
        • 2015-12-20
        相关资源
        最近更新 更多