来自ELF文档:
SHT_STRTAB 该部分包含一个字符串表。目标文件可能有多个字符串表部分。有关详细信息,请参阅下面的“字符串表”。
(注意:我没有注意到“字符串表”段落中有关多个字符串表部分的任何信息)
多个字符串表部分是否表示部分标题的字符串表和目标文件本身的字符串表?
如果对象本身有多个字符串表(.strtab
),文档中没有提及如何读取字符串。
有关该主题的任何澄清都表示赞赏。
答案 0 :(得分:1)
该联机帮助页仅包含ELF文件格式(某些部分)的概述/摘要,您可能需要查看System V ABI spec。
ELF文件有多个字符串表。通常你有3-4个字符串表:
一个字符串表(通常称为.shstrtab)用于节名称。所有节名称(在节头表中)都取自单个字符串表。此字符串表由节头表中的索引标识:节名称字符串表的索引在ELF标题(e_shstrndx)中指示。
另一个字符串表(通常称为.strtab)用于完整符号表(.symtab)。 .dynamic部分使用相同的字符串表。
另一个字符串表(通常称为.dynstr)用于最小符号表(.dynsym)。
另一个字符串表用于
对于给定的符号表部分,用作字符串表的部分在部分头表的sh_link字段中指示(参见system V ABI spec的图4-12)。
对于执行视图(程序头表),用于符号表(DT_SYMTAB)的字符串表的地址在动态部分的DT_STRTAB条目中给出。
这是一个hello world程序(显示为readelf -a
)。
ELF标题:
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
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。