ELF对象

时间:2015-08-19 06:37:48

标签: binary elf

来自ELF文档:

  

SHT_STRTAB   该部分包含一个字符串表。目标文件可能有多个字符串表部分。有关详细信息,请参阅下面的“字符串表”。

(注意:我没有注意到“字符串表”段落中有关多个字符串表部分的任何信息)

多个字符串表部分是否表示部分标题的字符串表和目标文件本身的字符串表?

如果对象本身有多个字符串表(.strtab),文档中没有提及如何读取字符串。

有关该主题的任何澄清都表示赞赏。

1 个答案:

答案 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)。

.shtrtab

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。