gpt4 book ai didi

gcc - MinGW Win32 + nasm : "undefined reference"

转载 作者:行者123 更新时间:2023-12-01 11:37:11 30 4
gpt4 key购买 nike

我目前正在开发一个用于学习目的的操作系统,到目前为止它一直运行良好。然后我尝试从 C 代码调用一个用 nasm, -fwin32 编译的汇编程序函数,但我得到的只是一个“ undefined reference ”错误。我在纯汇编程序中创建了一个小例子,它有同样的问题,但很容易理解并且更小:它包括两个文件:

测试.asm:

[bits 32]
global _testfunc
_testfunc:
ret

test2.asm:

[bits 32]
extern _testfunc
global _testfunc2
_testfunc2:
call _testfunc
ret

这是我的编译器/链接器脚本(使用 Windows 批处理文件):

nasm.exe -f win32 test.asm -o test.o
nasm.exe -f win32 test2.asm -o test2.o
ld test.o test2.o -o output.tmp

这会导致错误:

test2.o:test2.asm:(.text+0x1): undefined reference to `testfunc'

为了扩展问题,从 C 调用函数时也会发生同样的情况:

测试.c:

extern void testfunc(void);
void start()
{
testfunc();
}

使用此链接描述文件:

gcc -ffreestanding -c test.c -o testc.o
nasm.exe -f win32 test.asm -o test.o
ld test.o testc.o -o output.tmp

在test.o、test2.o和testc.o中,它总是说_testfunc,所以错误与前导下划线无关!

最佳答案

在我的 MinGW 设置中,您需要在代码之前添加一个 section 指令。

; foo.asm
[bits 32]
global _testfunc
section .text
_testfunc:
ret

然后汇编成win32格式:

nasm -fwin32 foo.asm -o foo.o

现在您可以检查 testfunc 是否存在:

$ nm foo.o
00000000 a .absolut
00000000 t .text
00000001 a @feat.00
00000000 T _testfunc

T 表示全局文本部分,所以我们可以开始了。

注意我会避免命名任何东西 test 因为这是一个 shell 命令。这会导致无尽的悲痛。

C 函数如您所示,但将文件命名为其他名称:

// main.c
extern void testfunc(void);
int main(void)
{
testfunc();
return 0;
}

然后为了构建可执行文件,让 gcc 完成繁重的工作,因为 ld 有时需要神秘的参数。

gcc -ffreestanding main.c foo.o -o main

关于gcc - MinGW Win32 + nasm : "undefined reference",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576658/

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