__libc_start_main发生了什么?

gon*_*one 18 c linux gcc dynamic-linking

我真的想从高级代码中理解步骤 - >可执行文件......但是我遇到了一些困难.

我写了一个空的int main() {}C文件,并试图解密反汇编objdump -d.这是发生了什么:

  • in _start,设置对齐,在堆栈上推送参数,调用__libc_start_main
  • __libc_start_main,第一行执行是jmp *0x8049658

然而,在使用objdump -R检查出的重定位记录,在价值0x8049658__libc_start_main本身!

我在这里错过了一些东西..

编辑:这是一些来源;

 080482c0 <__libc_start_main@plt>:
 80482c0:       ff 25 58 96 04 08       jmp    *0x8049658
 80482c6:       68 08 00 00 00          push   $0x8
 80482cb:       e9 d0 ff ff ff          jmp    80482a0 <_init+0x2c>

Disassembly of section .text:

080482d0 <_start>:
 80482d0:       31 ed                   xor    %ebp,%ebp
 80482d2:       5e                      pop    %esi
 80482d3:       89 e1                   mov    %esp,%ecx
 80482d5:       83 e4 f0                and    $0xfffffff0,%esp
 80482d8:       50                      push   %eax
 80482d9:       54                      push   %esp
 80482da:       52                      push   %edx
 80482db:       68 50 84 04 08          push   $0x8048450
 80482e0:       68 e0 83 04 08          push   $0x80483e0
 80482e5:       51                      push   %ecx
 80482e6:       56                      push   %esi
 80482e7:       68 d0 83 04 08          push   $0x80483d0
 80482ec:       e8 cf ff ff ff          call   80482c0 <__libc_start_main@plt>
 80482f1:       f4                      hlt
 80482f2:       66 90                   xchg   %ax,%ax



 DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049644 R_386_GLOB_DAT    __gmon_start__
08049654 R_386_JUMP_SLOT   __gmon_start__
08049658 R_386_JUMP_SLOT   __libc_start_main
Run Code Online (Sandbox Code Playgroud)

Col*_*ett 11

以"@plt"结尾的第一个块是过程链接表(/sf/answers/382853411/).这jmp *0x8049658是一个间接分支指令,因此实际上它跳转到实际上最终在运行时加载到RAM中的__libc_start_main任何地方.

真实的RAM地址__libc_start_main可以在DYNAMIC RELOCATION RECORDS表中找到,该表是在加载程序时由动态加载程序在RAM中创建的.

  • 实际上,这些天第一次调用就解决了这个问题,这篇博文展示了如何观察动态链接器在运行时的工作http://dustin.schultz.io/how-is-glibc-loaded-at-runtime.html (2认同)