2012-03-22 12 views
3

我只是想到了这一点,而不是将我的新问题(“为什么?”)分解成另一个问题,我认为最好的解决方案是将问题和解释保存在同一页面上。基本程序集“非法指令” - 甚至没有hello world - 为什么需要链接?

我正在编写一个基本的汇编程序来立即启动并立即退出使用内核中断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 

它的bizzare,连评论都出来仍产生尽管没有说明,但在Illegal instruction。我错过了linking步骤,尽管没有其他文件要链接到? 是的,我是

编辑:允许我重新说明我的问题,为什么你需要链接时,没有库或任何链接?

回答

3

需要链接它来创建一个可执行文件。默认情况下,as只是给你一个目标文件,你可以链接到一个可执行文件(或者与其他目标文件一起使用,或者独立使用),但本身并不是有效的可执行文件。尝试:

as -arch i386 -o file.o file.s 
ld -o file file.o 

在回答你的问题:

Why do you need to link when there is no library or anything to link to?

因为汇编程序不知道是你不会用别的东西联系起来。

gcc编译器不同,它假定您想要程序,除非另有说明(使用-c选项),as默认为您提供目标文件。从手册页:

"as" is primarily intended to assemble the output of the GNU C compiler "gcc" for use by the linker "ld"

如果你想一步到位的命令,你可以创建一个脚本,如asld

as -arch i386 -o $1.o $1.s 
ld -o $1 $1.o 

,然后只用asld file

或者,您可以设置makefiles为您完成所有繁重工作。

+0

如果它只是一个目标文件,它有什么不同? – Hawken 2012-03-22 03:21:49

+0

@Hawken,您不能运行或链接源文件或编译数据库索引时运行一个目标文件:-)目标文件的格式已准备好链接到可执行文件,但本身不是自身的可执行文件。 – paxdiablo 2012-03-22 03:26:01

+0

那么链接器添加的神秘代码是什么?我看到'hexdump'中的文件大小几乎翻了一番。前十二个字节是相同的。 – Hawken 2012-03-22 03:31:46

1

你可以对C程序进行相同的争论,我没有使用任何库,为什么我必须链接。

因为这就是工具链的设计。一组工具将您从源代码(任何/多种语言)转换为大部分时间不完整的对象文件。链接阶段,即使paxdiablo显示,只需要您的目标文件,并使其成为可执行文件,是必需的。如果没有其他的.text地址(通常)需要并且来自链接器阶段。

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

如果你不想使用这个工具链,也许使用nasm或类似的东西,你可以在一个命令行步骤中直接从汇编到二进制。

+0

从我所了解的正常C程序使用标准库,即使你不说,因此为什么C程序集不包括内核中断,而是返回_main子程序,它被链接到一些神秘的代码所调用。 – Hawken 2012-03-22 03:40:28

+0

取决于你的“正常C程序”的定义。让我说,就像这个ASM程序一样,你可以编写不使用库的C代码,除了编译后的C代码版本进入链接二进制代码。 main()甚至不需要(_start的某些味道是gnu工具的)。大多数C程序,几乎所有的,肯定都会做一些有趣/有用的事情,需要一个C库或者希望在一个操作系统上运行,并且在main()之前需要一些启动代码,或者需要一些其他原因链接在。 – 2012-03-22 03:47:59

相关问题