括号中的数字在 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 的索引。符号名称后面的数字是索引。

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

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

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