【发布时间】:2020-10-19 09:35:33
【问题描述】:
我正在尝试了解链接的工作原理。我有一个简单的 C++ 代码
#include "a.h"
int Other() {
return 1;
}
int SomeFunction() {
Other();
Other();
Other();
return 0;
}
生成以下重定位表。
$ readelf -r a.o
Relocation section '.rela.text' at offset 0x240 contains 3 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000018 000900000004 R_X86_64_PLT32 0000000000000000 _Z5Otherv - 4
00000000001d 000900000004 R_X86_64_PLT32 0000000000000000 _Z5Otherv - 4
000000000022 000900000004 R_X86_64_PLT32 0000000000000000 _Z5Otherv - 4
Relocation section '.rela.eh_frame' at offset 0x288 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0
000000000040 000200000002 R_X86_64_PC32 0000000000000000 .text + f
看起来 Other() 函数的调用点都标记为 R_X86_64_PLT32 类型。当我检查 R_X86_64_PLT32 的定义时,它显示 L + A - P,其中L 表示符号的过程链接表条目的位置(部分偏移或地址),A 表示用于计算值的加数可重定位字段的名称,P 表示被重定位的存储单元的位置(节偏移或地址)(使用 r_offset 计算)。
我不确定 PLT 的位置是什么意思。我的问题是
-
在这种情况下,L、A、P 的值是多少?
-
据我了解,PLT 被动态对象使用。为什么即使这只是一个静态函数,Other() 也会被标记为 PLT32。
-
如何找到ELF文件的PLT以及如何在其中找到Other()?
【问题讨论】: