2013-12-23 59 views
2

測試平臺是32位Linux。爲什麼我的代碼會在啓動函數結束時崩潰?

基本上,我做了修改,以產生所述入口點從如下開始改變彙編代碼的gcc:

彙編代碼:

 .file "test.c" 
    .intel_syntax noprefix 
    .section  .rodata 
.LC0: 
    .string "%d\n" 
    .text 
    .globl start 
    .type start, @function 
start: 
    push ebp 
    mov  ebp, esp 
    call main 
    mov  eax, 0 
    leave 
    ret 
    .size start, .-start 

    .globl main 
    .type main, @function 
main: 
    push ebp 
    mov  ebp, esp 
    and  esp, -16 
    sub  esp, 32 
    mov  DWORD PTR [esp+28], 1 
    mov  eax, OFFSET FLAT:.LC0 
    mov  edx, DWORD PTR [esp+28] 
    mov  DWORD PTR [esp+4], edx 
    mov  DWORD PTR [esp], eax 
    call printf 
    mov  eax, 0 

然後我使用這些編譯和鏈接:

as test.s -g -o test.o 
ld -o test test.o -lc -dynamic-linker /lib/ld-linux.so.2 -e start 

當使用gdb進行調試時,它可以成功地運行ķ直到月底開始功能, 然後從調試信息似乎$ EIP不知道從哪裏下跳,和 段發生故障時...

任何人都可以給我一些這方面的幫助問題..? 非常感謝!

回答

4

您應該調用exit而不是將eax設置爲0並返回,因爲您不使用C主函數(C-runtime),所以無處可返。

+0

是的!謝謝secmask! – computereasy