高水準コード->実行可能ファイルからの手順を本当に理解しようとしていますが、いくつかの問題があります。
空の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
「@plt」で終わる最初のブロックは、プロシージャリンケージテーブル( https://stackoverflow.com/a/5469334)/99415 )。 _jmp *0x8049658
_は間接分岐命令であるため、実際にRAMにロードされる場合は常に___libc_start_main
_にジャンプします実行時。
___libc_start_main
_の実際のRAMアドレスは、プログラムのロード時にダイナミックローダーによってRAMに作成されるDYNAMICRELOCATIONRECORDSテーブルにあります。