关于基本装配程序的“非法指令” - 甚至不是你好世界 - 为什么需要链接?

时间:2012-03-22 03:05:00

标签: macos assembly osx-snow-leopard 32-bit att

我只是想出了这个问题,但我没有将我的新问题(“为什么?”)拆分成另一个问题,如果解决这个问题和解释的方法保持在同一页上,我认为这是最好的。 /强>

我正在编写一个基本的汇编程序,只需启动并立即使用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步骤,尽管没有其他文件要链接到? 是的我

编辑:请允许我重新解释一下我的问题,为什么在没有图书馆或任何要链接的内容时需要链接?

2 个答案:

答案 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或类似的东西,您可以在一个命令行步骤中直接从汇编到二进制。