我只是想出了这个问题,但我没有将我的新问题(“为什么?”)拆分成另一个问题,如果解决这个问题和解释的方法保持在同一页上,我认为这是最好的。 /强>
我正在编写一个基本的汇编程序,只需启动并立即使用int 0x80
处的内核中断退出。我目前的代码如下:
/* Simple exit via kern-interrupt */
.globl start
start:
pushl $0x0
movl $0x1, %eax
subl $4, %esp
int $0x80
与
组装as -arch i386 <file>.s
执行后我得到一行错误:
Illegal instruction
虽然根本没有任何指示,但即使是对所有内容进行评论仍会产生Illegal instruction
,这仍然很奇怪。我错过了linking
步骤,尽管没有其他文件要链接到? 是的我
编辑:请允许我重新解释一下我的问题,为什么在没有图书馆或任何要链接的内容时需要链接?
答案 0 :(得分:3)
您做需要链接它以创建可执行文件。默认情况下,as
只会为您提供一个目标文件,您可以将其链接到可执行文件(与其他目标文件或单独使用),但它本身不是有效的可执行文件。尝试:
as -arch i386 -o file.o file.s
ld -o file file.o
回答你的问题:
为什么在没有图书馆或任何要链接的内容时需要链接?
因为汇编程序没有知道您不会与其他内容链接。
与假设您想要程序的gcc
编译器不同,除非另有说明(使用-c
选项),as
默认情况下会为您提供一个目标文件。从联机帮助页:
使用
"as"
主要用于汇编GNU C编译器"gcc"
的输出以供链接器"ld"
如果您需要一步命令,可以创建一个脚本,例如asld
:
as -arch i386 -o $1.o $1.s
ld -o $1 $1.o
然后只使用asld file
。
或者,你可以设置makefile来为你做所有繁重的工作。
答案 1 :(得分:1)
你可以对C程序做出相同的论证,我没有使用任何库,为什么我必须链接。
因为这就是工具链的设计方式。一组工具将您从源代码(任何/多种语言)带到大多数时间不完整的目标文件。链接阶段,即使是paxdiablo显示,只需要获取目标文件并使其成为可执行文件,这是必需的。如果没有别的.text地址是(通常)需要的,并且来自链接器阶段。
以这种方式这样做很有意义,链接阶段很复杂,制作一个完成该工作并且擅长该工作的工具。进行系统工程并定义该工具的界面。语言工具有一个复杂的工作,让他们只做这项工作,输出是一个目标文件,只要他们可以解决而不必成为一个链接器。
如果您不想使用此工具链,并且可能使用nasm或类似的东西,您可以在一个命令行步骤中直接从汇编到二进制。