使用x86汇编编译.exe时出现‘undefined reference to printf’错误求助
解决汇编程序链接时
undefined reference to printf的问题 错误原因
你遇到的链接错误是因为printf函数的实现不在你的汇编代码里,它属于C标准库,而你直接用ld链接时没有告诉链接器要链接这个库,所以链接器找不到该函数的定义。
解决方案
方案1:修改ld链接命令,手动添加依赖库
将原来的链接命令:
ld -m i386pe -o hello.exe hello.obj
替换为:
ld -m i386pe -o hello.exe hello.obj -lmsvcrt -lgcc
-lmsvcrt:链接微软C运行时库(msvcrt.dll对应的静态库),printf的实现就在这个库中-lgcc:链接GCC支持库,为C标准库函数提供必要的底层支持
方案2:改用gcc链接(更简便,自动处理库依赖)
gcc会自动识别并链接所需的标准库,只需把ld命令换成:
gcc -m32 hello.obj -o hello.exe
-m32:指定生成32位程序,和你用nasm -f elf32编译的目标文件匹配
额外优化(可选)
如果用gcc链接,建议将程序入口从_start改为_main,因为C运行时会自动处理程序初始化和退出逻辑(比如调用exit),避免直接用_start可能导致的异常退出问题:
修改汇编代码:
extern _printf section .text global _main ; 把_start改成_main _main: ; 入口点改为_main push ebp mov ebp, esp push msg call _printf add esp, 4 leave ret section .data msg db "Hello, world!", 13, 10, 0
之后再用上述gcc命令链接即可。
内容的提问来源于stack exchange,提问作者Chromegism
相关产品推荐
相关产品推荐

