我正在尝试理解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”是什么?这是符号的真实价值(意味着地址)吗?如果是这样,他们怎么都是零?
答案 0 :(得分:2)
没有。在Elf32文件中,{em>高 3字节r_info
是符号索引,低字节是重定位类型。在Elf64文件中,r_info
被拆分为两个32位部分。高部分中的值0f83
等是符号索引。
显示的符号值不是重定位表的一部分,而是来自重定位引用的动态符号表。如果在此模块(共享库)中实际定义了符号,则只有符号值。如果它未定义并依赖于另一个模块的定义,您只会看到零。
如果我理解你的问题,解决方法是一个实现细节,可能超出了SO问题的范围。您可能应该重新询问有关您对特定实施不了解的部分的具体问题。