【问题标题】:What exactly does <puts@plt> mean?<puts@plt> 究竟是什么意思?
【发布时间】:2014-10-29 07:19:13
【问题描述】:

目前我尝试更接近汇编程序编程,因此查看了一个简单的 hello world 程序的汇编代码:

#include <stdio.h>

int main () 
{
    int i;
    for(i=0; i<10; i++)
    {
        printf("Hello, world!\n");
    }
    return 0;
}

现在我尝试了解几个简单的汇编命令是如何工作的,同时逐步了解汇编代码并分析究竟发生了什么:

   0x000000000040052d <+0>: push   rbp
   0x000000000040052e <+1>: mov    rbp,rsp
   0x0000000000400531 <+4>: sub    rsp,0x10
   0x0000000000400535 <+8>: mov    DWORD PTR [rbp-0x4],0x0
   0x000000000040053c <+15>:    jmp    0x40054c <main+31>
   0x000000000040053e <+17>:    mov    edi,0x4005e4
   0x0000000000400543 <+22>:    call   0x400410 <puts@plt>
   0x0000000000400548 <+27>:    add    DWORD PTR [rbp-0x4],0x1
   0x000000000040054c <+31>:    cmp    DWORD PTR [rbp-0x4],0x9
   0x0000000000400550 <+35>:    jle    0x40053e <main+17>
   0x0000000000400552 <+37>:    mov    eax,0x0
   0x0000000000400557 <+42>:    leave  
   0x0000000000400558 <+43>:    ret 

问题是我真的不明白这一行:

0x0000000000400543 <+22>:   call   0x400410 <puts@plt>

我尝试以各种方式查看地址 0x400410,但我真的不明白它的真正作用:/ 我也不知道这到底意味着什么:&lt;puts@plt&gt;

如果有人能帮助我理解这一行,那就太好了:) 问候瞌睡

【问题讨论】:

标签: c assembly call


【解决方案1】:

PLT 表示过程链接表。它是 ELF 文件中使用的一种特殊技术,用于在加载时本地化修复,在可用相对寻址的机器上进行。

您正在调用的函数位于另一个模块中(通常是 libc.so.x),因此在加载程序执行时必须提供函数的实际地址。

PLT 本质上是可执行文件(或 .so 文件)中的一个区域,所有未完成的引用都集中在一起。它们具有目标机器跳转指令的形式,实际地址未填充。由加载器填充地址。这个过程称为修复。

因为您的模块的其余部分使用相对寻址通过 PLT 进行函数调用,并且 PLT 的偏移量在链接时是已知的,因此无需在那里进行任何修复。这意味着您的大部分模块可能会继续映射到模块文件而不是交换文件。

还必须注意,与 PLT 互补的是 GOT,即全局偏移表。 PLT 用于函数调用,而 GOT 用于数据。

【讨论】:

  • GOT 还包含指向 PLT 存根使用的外部代码的实际指针(尽管有时它们被分组在单独的 .plt.got 部分中)。
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 2016-01-27
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2018-07-27
相关资源
最近更新 更多