在可执行文件上使用 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
表。符号名称后面的数字是索引。
下面介绍如何查找符号的版本字符串:
- 假设解析
T
符号 - 该符号位于
.dynsym
部分的第 n 个条目 - 查看
.gnu.version
段的第n个条目,得到版本号m - 遍历
.gnu.version_r
段,找到版本号为m的条目 .gnu.version_r
部分中的条目包含相应的版本字符串(对.dynstr
部分的索引引用)
符号名称后面的数字是数字m
关于linux - 括号中的数字在 readelf 输出中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46744260/