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

问题描述 投票:0回答:1

测试平台为32位Linux。

基本上,我对 gcc 生成的 asm 代码进行了修改,将入口点从 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 不知道下一步跳到哪里,并且 发生段故障...

有人可以在这个问题上给我一些帮助吗..? 非常感谢!

linux assembly gcc linker
1个回答
4
投票

你应该调用

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

© www.soinside.com 2019 - 2024. All rights reserved.