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

6

我正在尝试理解Linux上共享库的动态链接。给出以下'Relocation'部分'.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个回答

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

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

  3. 如果我理解你的问题,解析方式是实现细节,可能超出SO问题的范围。你应该针对特定实现中你不理解的部分重新提问具体问题。


谢谢您的回复。我已经根据您的答案更新了我的帖子,并提出了两个新问题。您介意看一下吗? - techie11
我明白了。.dynstr和.dynsym不同。你的答案是正确的!再次感谢。 - techie11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接