括号中的数字在 readelf 输出中意味着什么?

dea*_*nix 3 linux readelf

在可执行文件上使用 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 的符号名称后面有一个。这是什么意思?

Zan*_*Jie 5

它是版本符号,@GLIBC_2.2.5来自哪里。

引用.gnu.version_r部分条目的编号

ELF 符号版本控制是 ELF 的 GNU 扩展。使用版本解析符号时,如果目标符号也有版本,则版本必须匹配,否则可以解析符号。

为了保持兼容性,版本不存储在.dynsym节内。相反,它存储在.gnu.version节内。

.gnu.version具有与.dynsym节完全相同的条目数,每个条目存储相应的符号版本(0 表示没有版本要求)。

version 是一个字符串,并.gnu.version存储引用该.gnu.version_r表的索引。符号名称后面的数字是索引。

下面介绍如何查找符号的版本字符串:

  1. 假设解析T符号
  2. 符号位于.dynsym节的第 n 个条目
  3. 查看第 n 个条目.gnu.version,获取版本号 m
  4. 遍历.gnu.version_r部分,找到版本号为 m 的条目
  5. .gnu.version_rsection 中的条目包含相应的版本字符串(对.dynstrsection的索引引用)

符号名称后面的数字是数字 m