当运行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;
2条答案
按热度按时间ekqde3dh1#
如何获取
.strtab
的索引?你一个接一个地读
Elf64_Shdr
,当你读到第28个条目时,你就读到了.strtab
,你就知道它的索引了。通过将其名称与
".strtab"
字符串文字进行比较,您将知道它是.strtab
节。(You你可能想问一个不同的问题,但如果是这样的话,你没有表达好。)
更新日期:
除了比较字符串我还能做什么吗
也许吧。如果你真实的的问题是找到
.strtab
部分,那就不是了。(这有点困难)我能假设它是文件中的第一个STRTAB吗?
不能保证情况会是这样。
注意:如果你担心
strcmp()
的速度,请注意,你只能在.sh_type == SHT_STRTAB
的时候执行strcmp()
,因为在任何给定的文件中通常最多有两个这样的部分,所以对strcmp()
的速度的担心可能是错误的。你的代码看起来像这样:更新2:
您的解决方案是错误的,请参见:http://stackoverflow.com/questions/68074508/
你不能说我的解决方案是错的,因为我没有提供一个完整的解决方案。它也是“没有”错的。
下面是完整的代码(省略了大部分错误检查):
x一个一个一个一个x一个一个二个x
vuktfyat2#
仅供参考,我认为字符串解析是不必要的:
我怎样才能得到.strtab的索引?
Elf64_Shdr
-结构体的sh_link
-成员指向包含字符串表(.strtab
)的节头的索引(如果存在)。在上面的示例中,请注意
.symtab
节头如何包含sh_link
的35
值,这正好是.strtab
的节头索引。这也是readelf用来计算
.strtab
的偏移量的方法。