跳转至

String Sections

.strtab: String Table

该节区描述默认的字符串表,包含了一系列的以 NULL 结尾的字符串。ELF 文件使用这些字符串来存储程序中的符号名,包括

  • 变量名
  • 函数名

该节在运行的过程中不需要加载,只需要加载对应的子集 .dynstr 节。

一般通过对字符串的首个字母在字符串表中的下标来索引字符串。

字符串表的首尾字节都是NULL。此外,索引为 0 的字符串要么没有名字,要么就是名字为空,其解释依赖于上下文。字符串表也可以为空,相应的,其节区头部的 sh_size 成员将为 0。在空字符串表中索引大于 0 的下标显然是非法的。

一个节区头部的 sh_name 成员的值为其相应的节区头部字符串表节区的索引,此节区由 ELF 头的 e_shstrndx 成员给出。下图给出了一个包含 25 个字节的字符串表,以及与不同索引相关的字符串。

索引 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9
0 \0 n a m e . \0 V a r
10 i a b l e \0 a b l e
20 \0 \0 x x \0

其中包含的字符串有

索引 字符串
0 none
1 name.
7 Variable
11 able
16 able
24 空字符串

可以看出

  • 字符串表索引可以引用节区中任意字节。
  • 字符串可以出现多次。
  • 可以存在对子字符串的引用。
  • 同一个字符串可以被引用多次。
  • 字符串表中也可以存在未引用的字符串。

这部分信息在进行 strip 后就会消失。

.shstrtab: Section Header String Table

该节区与 .strtab 的存储结构类似,不过该节区存储的是节区名的字符串。