3

我只是想通了这一点,但与其将我的新问题(“为什么?”)分成另一个问题,我认为最好将这个问题的解决方案和解释保持在同一页面上。

我正在编写一个基本的汇编程序,使用内核中断启动并立即退出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尽管没有其他文件可以链接,但我是否错过了一步?我是

编辑:请允许我重新表述我的问题,当没有图书馆或任何要链接的东西时,为什么需要链接?

4

2 回答 2

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 来为您完成所有繁重的工作。

于 2012-03-22T03:18:33.547 回答
1

您可以对 C 程序提出相同的论点,我没有使用任何库,为什么我必须链接。

因为这就是工具链的设计方式。一组工具将您从源代码(任何/多种语言)带到大多数情况下不完整的目标文件。链接阶段,即使如 paxdiablo 所示,也只需要您的目标文件并使其成为可执行文件,这是必需的。如果没有别的,您的 .text 地址(通常)是必需的,并且来自链接器阶段。

这样做很有意义,链接阶段已经足够复杂,制作一个可以完成这项工作并且擅长这项工作的工具。进行系统工程并定义该工具的接口。语言工具有一项复杂的工作要做,让他们只做那个工作,输出是一个目标文件,这是他们可以解决的,而不必成为链接器。

如果您不想使用此工具链,可能使用 nasm 或类似的工具,您可以在一个命令行步骤中直接从汇编程序转到二进制文件。

于 2012-03-22T03:35:49.397 回答