C语言 如何在ELF文件中查找.strtab?

flseospp  于 2023-03-29  发布在  其他
关注(0)|答案(2)|浏览(150)

当运行readelf -S时,我得到:

[27] .strtab           STRTAB           0000000000000000  00001630
       00000000000001d7  0000000000000000           0     0     1
  [28] .shstrtab         STRTAB           0000000000000000  00001807
       0000000000000103  0000000000000000           0     0     1

我怎样才能得到.strtab的索引呢?一开始我试图使用Type字段来检测它,但是你可以看到这不起作用(27和28有相同的类型)。另外,我不能确定它是否是第一个出现的STRTAB类型。
我的结构和一些解释:

/*
 * Section header.
 */
typedef struct {
    Elf64_Word sh_name;    /* Section name (index into the
                       section header string table). */
    Elf64_Word sh_type;    /* Section type. */
    Elf64_Xword sh_flags;    /* Section flags. */
    Elf64_Addr sh_addr;    /* Address in memory image. */
    Elf64_Off sh_offset;    /* Offset in file. */
    Elf64_Xword sh_size;    /* Size in bytes. */
    Elf64_Word sh_link;    /* Index of a related section. */
    Elf64_Word sh_info;    /* Depends on section type. */
    Elf64_Xword sh_addralign;    /* Alignment in bytes. */
    Elf64_Xword sh_entsize;    /* Size of each entry in section. */
} Elf64_Shdr;
ekqde3dh

ekqde3dh1#

如何获取.strtab的索引?
你一个接一个地读Elf64_Shdr,当你读到第28个条目时,你就读到了.strtab,你就知道它的索引了。
通过将其名称与".strtab"字符串文字进行比较,您将知道它是.strtab节。
(You你可能想问一个不同的问题,但如果是这样的话,你没有表达好。)

更新日期:

除了比较字符串我还能做什么吗
也许吧。如果你真实的的问题是找到.strtab部分,那就不是了。
(这有点困难)我能假设它是文件中的第一个STRTAB吗?
不能保证情况会是这样。
注意:如果你担心strcmp()的速度,请注意,你只能在.sh_type == SHT_STRTAB的时候执行strcmp(),因为在任何给定的文件中通常最多有两个这样的部分,所以对strcmp()的速度的担心可能是错误的。你的代码看起来像这样:

if (shdr.sh_type == SHT_STRTAB) {
    const char *sh_name = contents_of_shstrab + shdr.sh_name;
    if (strcmp(sh_name, ".strtab") == 0) {
      /* found .strtab; do whatever you need with it */
    }
  }

更新2:

您的解决方案是错误的,请参见:http://stackoverflow.com/questions/68074508/
你不能说我的解决方案是错的,因为我没有提供一个完整的解决方案。它也是“没有”错的。
下面是完整的代码(省略了大部分错误检查):
x一个一个一个一个x一个一个二个x

vuktfyat

vuktfyat2#

仅供参考,我认为字符串解析是不必要的:
我怎样才能得到.strtab的索引?
Elf64_Shdr-结构体的sh_link-成员指向包含字符串表(.strtab)的节头的索引(如果存在)。

[Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
                                     ...
  [34] .symtab           SYMTAB           0000000000000000  00003790
       0000000000000438  0000000000000018          35    20     8
  [35] .strtab           STRTAB           0000000000000000  00003bc8
       0000000000000283  0000000000000000           0     0     1
  [36] .shstrtab         STRTAB           0000000000000000  00003e4b
       000000000000016a  0000000000000000           0     0     1

在上面的示例中,请注意.symtab节头如何包含sh_link35值,这正好是.strtab的节头索引。
这也是readelf用来计算.strtab的偏移量的方法。

相关问题