为什么我的代码会在启动函数结束时崩溃?

时间:2013-12-23 16:20:24

标签: linux gcc assembly compiler-construction linker

测试平台是32位Linux。

基本上,我对生成的asm代码gcc进行了修改,将入口点从 main 更改为 start ,如下所示:

asm代码:

     .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进行调试时,它可以成功运行,直到 start 函数结束, 然后从调试信息看起来$ EIP不知道接下来要跳到哪里,并且 段故障发生......

有谁可以帮我解决这个问题..? 非常感谢你!

1 个答案:

答案 0 :(得分:4)

你应该调用exit而不是将eax设置为0并返回,因为你不使用C main函数(C-runtime),所以无处可回。