只有两个文件,main.c和kernel.asm,我尝试使用NASM和GCC制作一个程序.内容如下:
main.c中
#include <stdio.h>
void Print_String() {
printf("Hello World!\n");
}
kernle.asm
extern Print_String
[section .text]
global _start
_start:
call Print_String
编译和链接:
nasm -f elf -o kernel.o kernel.asm
gcc -c -o main.o main.c
ld -s -lc -o final kernel.o main.o
然后我使用以下命令运行最终文件:./ final,但结果令人沮丧:
bash: ./final: No such file or directory
但是,当前目录确实有文件final,对于命令ls,它显示:
final kernel.asm kernel.o main.c main.o
那为什么它找不到文件最终?有什么不对的吗?任何帮助赞赏!
解决方法:
它本身并不能找到它.错误消息有点误导.动态链接器无法解析其依赖关系,因此您的程序映像不可加载(并且不可执行)
问题是你在没有任何其他设备的情况下动态链接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中的exit(0)的效果:
mov eax,1 ; Syscall #1
mov ebx,0 ; Return code 0 = success
int 80H