c - 如何理解 Relocation section '.rela.plt' 的字段

标签 c linker shared-libraries elf dynamic-linking

我正在尝试了解 Linux 上共享库的动态链接。给定重定位部分“.rela.plt”的以下转储:

     Offset          Info           Type           Sym. Value    Sym. Name + Addend
     000000373f68  0f8300000007 R_X86_64_JUMP_SLO 0000000000000000 _ZN8CashFlowmIERK7Paym + 0
     000000373f70  0f9800000007 R_X86_64_JUMP_SLO 0000000000000000 _Z8printCapPK3CapP8_IO + 0
     000000373f78  0f9900000007 R_X86_64_JUMP_SLO 0000000000000000 _ZN13SharedBaggage16ge + 0
     000000373f80  0f9c00000007 R_X86_64_JUMP_SLO 0000000000000000 _Z11usdCurrencyv + 0

我有以下问题:

  1. 据我所知,r_info 的最低 3 个字节用作 .dynsym 部分的无符号索引以指向该符号。那么,如何解释以下所有以 0000007 作为索引到 .dynsym 部分的重定位部分条目?

  2. 谁能告诉我“Sym.Value”是什么?它是符号的实际值(即地址)吗?如果是这样,为什么它们都是零?

最佳答案

  1. 没有。在Elf32文件中,r_info3字节是符号索引,低字节是重定位类型。在 Elf64 文件中,r_info 被拆分为两个 32 位部分。高位部分的值0f83等为符号索引。

  2. 显示的符号值不是重定位表的一部分,而是来自重定位引用的动态符号表。只有在该模块(共享库)中实际定义了符号时,才会有符号值。如果它未定义并且依赖于另一个模块的定义,您只会看到零。

  3. 如果我明白你在问什么,如何完成解析是一个实现细节,可能超出了 SO 问题的范围。对于您不了解特定实现的部分,您可能应该重新提出具体问题。

关于c - 如何理解 Relocation section '.rela.plt' 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48942103/

相关文章:

c - 通过http链接TP-LINK路由器设置嵌入式设备

c++ - GCC/g++ cout << 与 printf()

创建计算百分比的 C 程序给我一个问题

c - `libc` 和 `crt1.o` 是静态链接还是动态链接?

xcode - Google在iOS中登录SDK给出链接器错误

c++ - 在共享库中使用 std::thread 会导致 SIGSEGV

linux - 在替代系统中安装 OpenBLAS 库

c - 如何在新函数中正确地添加堆栈中的整数值?

c++ - 如何在 Visual C++ 中手动修改名称?

c++ - nm 命令输出中的 '@@' 符号是什么意思?