3

When using readelf on executables, I get a number in parenthesis after some symbols names. For instance:

Num:    Value          Size Type    Bind   Vis      Ndx Name
 49: 00000000002052a0     8 OBJECT  GLOBAL DEFAULT   27 stderr@GLIBC_2.2.5 (3)

There is a (3) after the symbol name for stderr in that case. What does this means ?

4

1 回答 1

5

它是版本符号,从何@GLIBC_2.2.5而来。

参考.gnu.version_r部分条目的编号

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

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

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

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

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

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

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

于 2017-10-14T12:16:03.347 回答