我正在尝试了解 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
我有以下问题:
据我所知,r_info 的最低 3 个字节用作 .dynsym 部分的无符号索引以指向该符号。那么,如何解释以下所有以 0000007 作为索引到 .dynsym 部分的重定位部分条目?
谁能告诉我“Sym.Value”是什么?它是符号的实际值(即地址)吗?如果是这样,为什么它们都是零?
最佳答案
没有。在Elf32文件中,
r_info
的高3字节是符号索引,低字节是重定位类型。在 Elf64 文件中,r_info
被拆分为两个 32 位部分。高位部分的值0f83
等为符号索引。显示的符号值不是重定位表的一部分,而是来自重定位引用的动态符号表。只有在该模块(共享库)中实际定义了符号时,才会有符号值。如果它未定义并且依赖于另一个模块的定义,您只会看到零。
如果我明白你在问什么,如何完成解析是一个实现细节,可能超出了 SO 问题的范围。对于您不了解特定实现的部分,您可能应该重新提出具体问题。
关于c - 如何理解 Relocation section '.rela.plt' 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48942103/