来自 ELF 文档:
SHT_STRTAB The section holds a string table. An object file may have multiple string table sections. See ‘‘String Table’’ below for details.
(注意:我没有注意到“字符串表”段落中有关多个字符串表部分的任何信息)
多个字符串表节是否意味着节标题的字符串表和目标文件本身的字符串表?
文档中没有提及如果对象本身有多个字符串表(.strtab
),如何读取字符串。
任何有关该主题的澄清表示赞赏。
最佳答案
联机帮助页仅包含 ELF 文件格式(某些部分)的概述/摘要,您可能需要查看 System V ABI spec .
说明
链接 View
一个ELF文件有多个字符串表。通常你有 3-4 个字符串表:
一个字符串表(通常称为 .shstrtab)用于节名称。所有节名称(在节头表中)均取自单个字符串表。该字符串表通过其在节头表中的索引来标识:节名称字符串表的索引在 ELF 头(e_shstrndx)中指示。
另一个字符串表(通常称为 .strtab)用于完整符号表(.symtab)。 .dynamic 部分使用相同的字符串表。
另一个字符串表(通常称为 .dynstr)用于最小符号表(.dynsym)。
另一个字符串表用于
对于给定的符号表节,用作字符串表的节在节头表的 sh_link 字段中指示(参见 system V ABI spec 的图 4-12)。
执行 View
对于执行 View (程序头表),用于符号表(DT_SYMTAB)的字符串表的地址在动态部分的DT_STRTAB条目中给出。
示例
链接 View
这是一个 hello world 程序(用 readelf -a
显示)。
ELF header :
ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x4003c0 Start of program headers: 64 (bytes into file) Start of section headers: 4624 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 8 Size of section headers: 64 (bytes) Number of section headers: 30 Section header string table index: 27
告诉我们章节名称位于第 27 节中。很方便,这是 .shtrtab:
Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [...] [27] .shstrtab STRTAB 0000000000000000 000008e0 0000000000000108 0000000000000000 0 0 1.dynstr
对于 .dynsym,我们有:
[ 5] .dynsym DYNSYM 0000000000400280 00000280 0000000000000048 0000000000000018 A 6 1 8 ^ HERE
其名称取自第 6 节,即 .dynstr:
[ 6] .dynstr STRTAB 00000000004002c8 000002c8 0000000000000038 0000000000000000 A 0 0 1
这个字符串表也被其他部分使用:
[ 8] .gnu.version_r VERNEED 0000000000400308 00000308 0000000000000020 0000000000000000 A 6 1 8 [21] .dynamic DYNAMIC 0000000000600698 00000698 00000000000001d0 0000000000000010 WA 6 0 8.strtab
对于 .symtab:
[28] .symtab SYMTAB 0000000000000000 000009e8 0000000000000600 0000000000000018 29 45 8 ^ HERE
名称取自第 29 节,恰好是 .strtab:
[29] .strtab STRTAB 0000000000000000 00000fe8 0000000000000224 0000000000000000 0 0 1
执行 View
Dynamic section at offset 0x698 contains 24 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000c (INIT) 0x400370 0x000000000000000d (FINI) 0x400544 0x0000000000000019 (INIT_ARRAY) 0x600680 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) 0x000000000000001a (FINI_ARRAY) 0x600688 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x000000006ffffef5 (GNU_HASH) 0x400260 0x0000000000000005 (STRTAB) 0x4002c8 <= HERE 0x0000000000000006 (SYMTAB) 0x400280 0x000000000000000a (STRSZ) 56 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x600870 0x0000000000000002 (PLTRELSZ) 48 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x400340 0x0000000000000007 (RELA) 0x400328 0x0000000000000008 (RELASZ) 24 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffe (VERNEED) 0x400308 0x000000006fffffff (VERNEEDNUM) 1 0x000000006ffffff0 (VERSYM) 0x400300 0x0000000000000000 (NULL) 0x0
动态链接的字符串表位于程序内存中的0x4002c8处。
注意:这是.dynstr。
关于binary - ELF对象中的多个字符串表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32088140/