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