gpt4 book ai didi

c - 来自 c 的汇编函数调用

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:45 25 4
gpt4 key购买 nike

我无法合并我的 kernel_entry.asm 和 main.c。我的 main.c 调用一个 asm 函数 Sum。 nasm 和 gcc 都编译各自的文件。但是,链接器给出错误。

内核入口.asm:

[bits 32]
[extern _start]
[global _Sum]

....

_Sum:
push ebp
mov ebp, esp
mov eax, [ebp+8]
mov ecx, [ebp+12]
add eax, ecx
pop ebp
ret

主.c:

....
extern int Sum();

void start() {
....
int x = Sum(4, 5);
....
}

要编译源文件,我使用以下命令:

nasm kernel_entry.asm -f win32 -o kernel_entry.o
gcc -ffreestanding -c main.c -o main.o
....
ld -T NUL -o kernel.tmp -Ttext 0x1000 kernel_entry.o main.o mem.o port_in_out.o screen.o idt.o

链接器给出以下错误:main.o:main.c:(.text+0xa82): undifened reference to 'Sum'。我尝试了一切但找不到任何解决方案。当我从 main.c 中删除 asm 函数调用时,它起作用了。

最佳答案

答案的 TL;DR 版本是混合 nasm 的 -f win32 生成一个与 Windows 上的 GNU 工具链不兼容的目标文件 - 你需要使用 -f elf 如果您想使用 ld 进行链接。这在 NASM 的文档中有所描述 here在第 7.5 和 7.9 节下。

给我的提示是,通过运行 nm kernel_entry.o 生成:

00000000 a .absolut
00000000 t .text
00000001 a @feat.00
U _start
U _Sum

这基本上将 Sum 显示为 undefined symbol 。编译为 ELF 后,我得到:

         U _start
00000000 T _Sum

在文本部分将 Sum 指示为可识别的符号。

关于c - 来自 c 的汇编函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25355998/

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