这是我用过的代码行..
int global_func(int param)
{
return param * 10;
}
int main()
{
int a = global_func(10);
}
使用-c -fPIC选项编译此代码以生成目标文件和来自readelf的一些结果。
readelf -d
0000000000000015 <main>:
15: 55 push %rbp
16: 48 89 e5 mov %rsp,%rbp
19: 48 83 ec 20 sub $0x20,%rsp
1d: 89 7d ec mov %edi,-0x14(%rbp)
20: 48 89 75 e0 mov %rsi,-0x20(%rbp)
24: 8b 45 ec mov -0x14(%rbp),%eax
27: 89 c7 mov %eax,%edi
29: e8 00 00 00 00 callq 2e <main+0x19>
readelf -r
Relocation section '.rela.text' at offset 0x62438 contains 5 entries:
Offset Info Type Sym. Value Sym. Name + Addend
00000000002a 000c00000004 R_X86_64_PLT32 0000000000000000 global_func - 4
它说0x2a应该由运行时加载器填充,它是一个R_X86_64_PLT32类型,但是当我将这个对象编译为可执行文件时。我可以发现可执行文件在调用global_func之前没有调用plt(例如global_func @ plt)
为什么目标文件的ELF指定0x2a应该是R_X86_64_PLT32,它不会调用共享库中调用的任何PLT例程(例如printf @ plt)?