binary - ELF对象中的多个字符串表

标签 binary elf

来自 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 显示)。

.shtrtab

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/

相关文章:

Haskell 二进制解析

c++ - 从 blob SQLite 读取二进制图像并使用 OpenCV imdecode 对其进行解码的最佳方法是什么?

c - 为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?

linux - GDB 符号从哪里来?

c++ - 如何在 C/C++ 中处理二进制数据

binary - "Rest"来自binary_to_term的二进制文件

ubuntu - 使用 pyinstaller 创建二进制文件后 Okular 出现问题

linux - 在 ELF 可执行文件中,指针可以存储在哪些部分?

c - 如何使用c编程从elf文件中提取所有用户定义的函数

gcc - 从a.out文件中提取全局变量