Object ';ld86:无起始符号';当我尝试合并2个对象文件时

Object ';ld86:无起始符号';当我尝试合并2个对象文件时,object,ubuntu,assembly,kernel,ld,Object,Ubuntu,Assembly,Kernel,Ld,所以对于我的操作系统课程中的一个小项目,我们应该制作一个非常小的内核。我们提供了一些汇编文件等等;基本上,对于这一部分,我们应该使用以下行: bcc -ansi -c -o kernel.o kernel.c as86 kernel.asm -o kernel_asm.o ld86 -o kernel -d kernel.o kernel_asm.o dd if=kernel of=floppya.img bs=512 conv=notrunc seek=3 ld86应该链接kernel.o和

所以对于我的操作系统课程中的一个小项目,我们应该制作一个非常小的内核。我们提供了一些汇编文件等等;基本上,对于这一部分,我们应该使用以下行:

bcc -ansi -c -o kernel.o kernel.c
as86 kernel.asm -o kernel_asm.o
ld86 -o kernel -d kernel.o kernel_asm.o
dd if=kernel of=floppya.img bs=512 conv=notrunc seek=3
ld86应该链接kernel.o和kernel_asm.o,这就是它出错的地方。它在标题中发出错误(ld86:无开始符号),如果我尝试使用dd实用程序,它会告诉我无法打开内核(因为该文件从未由ld86创建)


我已经试着查找错误一个多小时了,但什么也没找到。任何帮助(甚至推测)都将不胜感激。

如果另一方面,代码的入口点在C文件中,则需要定义一个名为
main
的函数。如果没有,那么您将得到相同的错误。这实际上是ld86的限制,因为
-d
会剥离标题,因此入口点信息没有任何用处。@Jester:没错,
-d
会剥离标题,但ld86仍然要求标签存在,尽管它实际上是无用的。为了简化我的描述,我省略了这一部分。您应该注意@OmarA.Yousry,因为您的ld86命令行在
kernel\u asm.o
之前先列出
kernel.o
,所以在对ld86使用
-d
选项并创建内核时,需要将
main
放在
kernel.c
中。由于内核将使用
-d
选项剥离,并输出到一个普通二进制文件,因此请确保您的函数
main
是出现在
kernel.c
顶部的第一个函数。链接器将按列出的顺序将代码放入二进制文件中。第一个文件中的第一条指令(
kernel.o
在您的情况下)将是
kernel