跳转至

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 的存儲結構類似,不過該節區存儲的是節區名的字符串。