在linux中混合汇编和C的编程

只有两个文件,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
上一篇:WPF中viewmodel层怎样得到view层的TabControl控件对象?


下一篇:linux – int 0x80是否覆盖寄存器值?