web-dev-qa-db-ja.com

__libc_start_mainで何が起こっているのですか?

高水準コード->実行可能ファイルからの手順を本当に理解しようとしていますが、いくつかの問題があります。

空のint main() {} Cファイルを作成し、objdump -dを介して逆アセンブリを解読しようとしています。何が起こっているのか:

  • _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
21
gone

「@plt」で終わる最初のブロックは、プロシージャリンケージテーブルhttps://stackoverflow.com/a/5469334)/99415 )。 _jmp *0x8049658_は間接分岐命令であるため、実際にRAMにロードされる場合は常に___libc_start_main_にジャンプします実行時。

___libc_start_main_の実際のRAMアドレスは、プログラムのロード時にダイナミックローダーによってRAMに作成されるDYNAMICRELOCATIONRECORDSテーブルにあります。

13
Colin D Bennett