测试平台是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不知道接下来要跳到哪里,并且 段故障发生......
有谁可以帮我解决这个问题..? 非常感谢你!
答案 0 :(得分:4)
你应该调用exit
而不是将eax设置为0并返回,因为你不使用C main函数(C-runtime),所以无处可回。