为什么PIC启用二进制文件中的本地函数不使用plt?

时间:2015-10-27 09:47:20

标签: assembly 64-bit

这是我用过的代码行..

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)?

0 个答案:

没有答案