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 的存储结构类似,不过该节区存储的是节区名的字符串。

Last updated