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

标签 linux readelf

在可执行文件上使用 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 表。符号名称后面的数字是索引。

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

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

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

关于linux - 括号中的数字在 readelf 输出中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46744260/

相关文章:

linker - 如何使用 GDB 调试加载器/链接器问题

c++ - 用于 Visual Studio C++ ABI 和 VS 编译对象的 readelf 实用程序?

c - 从 ELF 二进制文件中仅提取我的函数名称

python - 将标准输出重定向到文件显示错误内容

gcc - ELF 文件中的 VirtualAddress、LoadAddress 和 PhysicalAddress?

c - linux:select的第一个参数

linux - Bash - 从一种模式替换为另一种模式以及介于两者之间的所有内容

linux - 链接器如何将程序头添加到可重定位文件?

linux - 如何在不弹出 CDROM 的情况下在 Linux 中更新 CDROM 大小?

linux - 我正在尝试创建一个自定义 $PS1 来显示我所在的每个目录中有多少文件并打印结果