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

how to understand fields of Relocation section '.rela.plt'

我正在尝试了解 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. 显示的符号值不是重定位的一部分 table,而是来自重定位引用的动态符号 table。只有在该模块(共享库)中实际定义了符号时,才会有符号值。如果它是未定义的并且依赖于另一个模块的定义,你只会看到零。

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