gpt4 book ai didi

c - linux中汇编和C的混合编程

转载 作者:可可西里 更新时间:2023-11-01 11:49:47 26 4
gpt4 key购买 nike

只有两个文件,main.ckernel.asm,我尝试使用 NASM 和 GCC 编写一个程序。内容如下:

ma​​in.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文件:./final,但结果令人沮丧:

bash: ./final: No such file or directory

但是,当前目录确实有文件final,对于命令ls,它显示:

final  kernel.asm  kernel.o  main.c  main.o

那么为什么它找不到文件final?有什么问题吗?任何帮助表示赞赏!

最佳答案

它本身并不是找不到它。该错误消息有些误导。动态链接器无法解析其依赖项,因此您的程序镜像不可加载(且不可执行)

问题是您在没有任何其他工具的情况下针对 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

关于c - linux中汇编和C的混合编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14867331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com