Linux 使用GNU assember执行系统调用时出现SEGFULT
我试图理解为什么在程序集级别执行系统调用时,Linux 使用GNU assember执行系统调用时出现SEGFULT,linux,assembly,x86,system-calls,gnu,Linux,Assembly,X86,System Calls,Gnu,我试图理解为什么在程序集级别执行系统调用时,as的行为不同于nasm。因为我是个贪吃惩罚的人,所以我用的是英特尔语法。以下是我的节目: .intel_syntax noprefix .section .rodata .LC0: .string "Hello world!\n" .text .globl _start .type _start, @function _start: mov edx, 13 mov ecx,
as
的行为不同于nasm
。因为我是个贪吃惩罚的人,所以我用的是英特尔语法。以下是我的节目:
.intel_syntax noprefix
.section .rodata
.LC0:
.string "Hello world!\n"
.text
.globl _start
.type _start, @function
_start:
mov edx, 13
mov ecx, OFFSET FLAT:.LC0
mov eax, 4
int 0x80
ret
我用as-o prog.o prog.s
组装并链接ld-s-o prog.o
但当我运行它时,我得到:
$ ./prog
Hello world!
Segmentation fault (core dumped)
GDB在这里不是特别有用。当我在ret
上执行stepi
时,它表示无法访问地址0x1处的内存。这是令人费解的,因为ESP
的值是:
(gdb) info registers esp
info registers esp
esp 0xbffff660 0xbffff660
为什么这个程序会出错?因为它永远不会正确退出<代码>\u start
没有父堆栈帧,因此从它返回将导致崩溃
您可以从
main
返回标准库的\u start
实现调用exit
,但是如果您正在编写自己的\u start
,您需要自己调用exit
,因为没有父堆栈帧可返回。,因为它永远不会正确退出<代码>\u start没有父堆栈帧,因此从它返回将导致崩溃
您可以从
main
返回标准库的\u start
实现调用exit
,但是如果您正在编写自己的\u start
,您需要自己调用exit
,因为没有父堆栈帧可返回。您不能从程序中直接调用ret
,您需要退出系统调用。1
是恰好位于堆栈顶部的参数(argc
)的数量,因此ret
尝试将其用作地址,并产生明显的后果。您不能仅从程序中调用ret
,您需要一个exit
系统调用。1
是恰好位于堆栈顶部的参数(argc
)的数量,因此ret
尝试将其用作地址,结果很明显。@DanBarowy大部分是复制的?我在冒险,这可能是问题所在。如果ret
正在工作,那么\u start
将不是入口点,main
将是入口点。由于需要C运行时,链接它的方式也会有所不同。你主要是从书中的哪一页/哪一个例子中复制的?我最后的评论是一条现在看来已被删除的评论;-)@DanBarowy我会更进一步:那本书简直是垃圾,应该扔掉。它看起来像是为DOS程序员编写的,然后在最后一刻匆忙地适应了Linux。(许多Linux细节已经严重过时,因为这本书是在2000年出版的…)还有一个有趣的细节:edlinas
,“排名第一的Linux x86动手汇编程序开发模拟器”(至少根据封面)实际上是一个QBasic程序,只能在DOS下运行。Yes@MichaelPetch和@Dashwuff,在我发表评论后,我意识到我已经用\u start
替换了main
,这导致了我意识到我是这里的白痴的一刻。所以我删除了评论。@DanBarowy大部分是复制的?我在冒险,这可能是问题所在。如果ret
正在工作,那么\u start
将不是入口点,main
将是入口点。由于需要C运行时,链接它的方式也会有所不同。你主要是从书中的哪一页/哪一个例子中复制的?我最后的评论是一条现在看来已被删除的评论;-)@DanBarowy我会更进一步:那本书简直是垃圾,应该扔掉。它看起来像是为DOS程序员编写的,然后在最后一刻匆忙地适应了Linux。(许多Linux细节已经严重过时,因为这本书是在2000年出版的…)还有一个有趣的细节:edlinas
,“排名第一的Linux x86动手汇编程序开发模拟器”(至少根据封面)实际上是一个QBasic程序,只能在DOS下运行。Yes@MichaelPetch和@Dashwuff,在我发表评论后,我意识到我已经用\u start
替换了main
,这导致了我意识到我是这里的白痴的一刻。所以我删除了评论。