这并不是说它本身找不到它。错误信息有点误导。动态链接程序无法解析其依赖关系,因此您的程序映像无法加载(并且不可执行)
问题是,您正在动态链接libc而不使用任何其他工具来实现动态链接。因此,您剩下一个无法加载的二进制图像。
您可能会发现静态链接与libc更容易。这可以按如下方式完成:
ld -Bstatic -o final kernel.o main.o -lc
注意,您必须在使用它的代码模块main.o之后移动'-lc'位。
如果你试试这个,你会得到一大堆未解决的符号。这是因为您还需要链接libgcc和libgcc_eh。
下面让我相当接近(道歉,在64位系统上工作在这里):
ld -L/usr/lib/gcc/x86_64-linux-gnu/4.4.3/32/ -melf_i386 -Bstatic -lc -o final kernel.o main.o -lc -lgcc -lgcc_eh
这失败我
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/32//libgcc_eh.a(unwind-dw2-fde-glibc.o): In function `_Unwind_Find_FDE':
(.text+0x193b): undefined reference to `dl_iterate_phdr'
这并没有太大的意义。您可能会在32位系统上连接32位的运气更多。
更新
道歉上面的漫游。我再次考虑这一点,当然,可以进行动态链接工作。缺少的部分是指定的动态链接:
在我而言,这是:
ld -dynamic-linker /lib32/ld-linux.so.2 -melf_i386 -o final kernel.o main.o -lc
所以你下面应该工作:
ld -dynamic-linker /lib/ld-linux.so.2 -o final kernel.o main.o -lc
再次更新
为了回应markzar的评论 - 你必须使系统调用干净地退出。这有类似于C中退出(0)的效果:
mov eax,1 ; Syscall #1
mov ebx,0 ; Return code 0 = success
int 80H