括号中的数字在 readelf 输出中意味着什么?
What does numbers in parenthesis means in readelf outputs?
在可执行文件上使用 readelf 时,我在一些符号名称后的括号中得到一个数字。例如:
Num: Value Size Type Bind Vis Ndx Name
49: 00000000002052a0 8 OBJECT GLOBAL DEFAULT 27 stderr@GLIBC_2.2.5 (3)
在这种情况下,stderr 的符号名称后有一个 (3)
。这是什么意思?
版本号,@GLIBC_2.2.5
出处
.gnu.version_r
部分条目的引用数
ELF 符号版本控制是 ELF 的 GNU 扩展。用版本解析符号时,如果目标符号也有版本,则版本必须匹配,否则可以解析符号。
为了保持兼容性,版本未存储在 .dynsym
部分中。相反,它存储在 .gnu.version
部分。
.gnu.version
与.dynsym
节的条目数完全相同,每个条目存储对应的符号版本(0表示没有版本要求)。
version 是一个字符串,.gnu.version
存储一个引用 .gnu.version_r
table 的索引。符号名称后面的数字是索引。
下面介绍如何查找符号的版本字符串:
- 假设解析
T
符号
- 符号位于
.dynsym
部分的第 n 个条目
- 查找
.gnu.version
节的第n条,得到版本号m
- 遍历
.gnu.version_r
段,找到版本号为m 的条目
.gnu.version_r
部分中的条目包含相应的版本字符串(对 .dynstr
部分的索引引用)
符号名称后面的数字是数字m
在可执行文件上使用 readelf 时,我在一些符号名称后的括号中得到一个数字。例如:
Num: Value Size Type Bind Vis Ndx Name
49: 00000000002052a0 8 OBJECT GLOBAL DEFAULT 27 stderr@GLIBC_2.2.5 (3)
在这种情况下,stderr 的符号名称后有一个 (3)
。这是什么意思?
版本号,@GLIBC_2.2.5
出处
.gnu.version_r
部分条目的引用数
ELF 符号版本控制是 ELF 的 GNU 扩展。用版本解析符号时,如果目标符号也有版本,则版本必须匹配,否则可以解析符号。
为了保持兼容性,版本未存储在 .dynsym
部分中。相反,它存储在 .gnu.version
部分。
.gnu.version
与.dynsym
节的条目数完全相同,每个条目存储对应的符号版本(0表示没有版本要求)。
version 是一个字符串,.gnu.version
存储一个引用 .gnu.version_r
table 的索引。符号名称后面的数字是索引。
下面介绍如何查找符号的版本字符串:
- 假设解析
T
符号 - 符号位于
.dynsym
部分的第 n 个条目 - 查找
.gnu.version
节的第n条,得到版本号m - 遍历
.gnu.version_r
段,找到版本号为m 的条目
.gnu.version_r
部分中的条目包含相应的版本字符串(对.dynstr
部分的索引引用)
符号名称后面的数字是数字m