ld MinGW 链接到标准 C 库

Sma*_*vić 4 windows x86 assembly mingw nasm

我对以下代码有问题。

extern printf
global _main
main:
push msg
call printf
ret
msg db "Hello world",0
Run Code Online (Sandbox Code Playgroud)

我使用 NASM 组装它,nasm -fwin32 test.asm然后使用 链接它ld test.obj。它告诉我“ test.obj:test.asm:(text+0x6): undefined reference to 'printf'

如何将我的文件链接到标准 C 库?我有最新的 MinGW 的 ld。

bol*_*eto 5

汇编代码:

nasm -fwin32 test.asm
Run Code Online (Sandbox Code Playgroud)

Microsoft 将使用 cdecl 调用约定为函数添加下划线前缀。
为了与 C 调用约定相匹配,printf应该是_printf.
这同样适用_main于代替main

并链接到:

ld test.obj -lmsvcrt -entry=_main -subsystem=console -o test.exe

这里-entry命令行选项用于调用ld来指定程序的入口点。
然后使用-l选项将msvcrt库传递给ld链接器,否则您将收到错误消息(undefined reference to `printf'),这意味着链接器在 NASM 生成的指定目标文件中没有找到符号 printf 。

这是完整的源代码:

global  _main
extern  _printf
section .text
_main:
push msg
call _printf
add esp, 4 ;adjust the stack
ret
msg db "Hello world",0
Run Code Online (Sandbox Code Playgroud)