在可执行文件上使用 readelf 时,我在一些符号名称后的括号中得到一个数字。例如:
Num: Value Size Type Bind Vis Ndx Name
49: 00000000002052a0 8 OBJECT GLOBAL DEFAULT 27 stderr@GLIBC_2.2.5 (3)
Run Code Online (Sandbox Code Playgroud)
(3)在这种情况下,stderr 的符号名称后面有一个。这是什么意思?
它是版本符号,@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,获取版本号 m.gnu.version_r部分,找到版本号为 m 的条目.gnu.version_rsection 中的条目包含相应的版本字符串(对.dynstrsection的索引引用)符号名称后面的数字是数字 m