這個值實際上應該是_start的主偏移量,對不對?
錯誤。你不能從_start
跳到main
- 後者預計參數爲argc
和argv[]
,但是沒有人設置它們。這是libc
初始化代碼工作:
- 初始化的libc本身,創建標準
FILE
句柄(stdout
等),設置環境等,並
- 呼叫
main
使用正確的參數,並
- 如果/當
main
返回時,用正確的退出代碼安排程序到exit(2)
。
你們看到的其實是一個PLT
呼叫__libc_start_main
,這將做到以上的,以及然後呼叫main
。你可以用objdump -dr a.out
看到這一點,這將類似於此:
00000000004003d0 <_start>:
4003d0: 31 ed xor %ebp,%ebp
4003d2: 49 89 d1 mov %rdx,%r9
4003d5: 5e pop %rsi
4003d6: 48 89 e2 mov %rsp,%rdx
4003d9: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
4003dd: 50 push %rax
4003de: 54 push %rsp
4003df: 49 c7 c0 50 05 40 00 mov $0x400550,%r8
4003e6: 48 c7 c1 c0 04 40 00 mov $0x4004c0,%rcx
4003ed: 48 c7 c7 b4 04 40 00 mov $0x4004b4,%rdi
4003f4: e8 c7 ff ff ff callq 4003c0 <[email protected]>
4003f9: f4 hlt
4003fa: 90 nop
4003fb: 90 nop
怎樣的st_value領域得到初始化?
你可以閱讀有關如何動態符號解析的實際細節工作here(搜索「過程鏈接表」;要注意:很少有人真正理解它是如何工作的詳細)。
有什麼方法可以靜態確定'main'的地址是什麼? – RouteMapper
我仍然想知道我的問題的答案。 – RouteMapper