如何理解重定位部分'.rela.plt'的字段

时间:2018-02-23 06:06:42

标签: 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 个答案:

答案 0 :(得分:2)

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

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

  3. 如果我理解你的问题,解决方法是一个实现细节,可能超出了SO问题的范围。您可能应该重新询问有关您对特定实施不了解的部分的具体问题。