测试平台为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 不知道下一步跳到哪里,并且 发生段故障...
有人可以在这个问题上给我一些帮助吗..? 非常感谢!
你应该调用
exit
而不是设置eax为0并返回,因为你不使用C主函数(C-runtime),所以无处返回。