Windows下x86-64汇编程序GCC链接报错,如何修复?
Windows 11下x86-64汇编HelloWorld程序错误修复
你遇到的两个错误分别是地址重定位失败和入口函数未找到,以下是具体修复方案:
错误原因与代码修复
1. relocation truncated to fit: IMAGE_REL_AMD64_ADDR32 against '.text'
原代码采用32位汇编的调用逻辑,而x86-64(AMD64)架构使用64位地址空间,且Win64平台遵循fastcall调用约定:前4个参数通过寄存器传递(rcx/rdx/r8/r9),调用函数前需预留32字节的阴影空间(shadow space)并保证栈16字节对齐。
修改后的汇编代码:
; ---------------------------------------------------------------------------- ; Hello_world.asm ; ; Win64控制台程序,输出"Hello, World"后退出,需链接C库 ; ---------------------------------------------------------------------------- global main extern printf section .text main: sub rsp, 40 ; 预留32字节阴影空间 + 8字节栈对齐 lea rcx, [message] ; printf第一个参数放入rcx寄存器 call printf add rsp, 40 ; 恢复栈空间 xor rax, rax ; main函数返回0(int类型返回值) ret message: db 'Hello, World', 10, 0
2. undefined reference to WinMain
GCC在Windows平台默认优先链接GUI程序,会寻找WinMain作为入口函数。我们的程序是控制台程序,需通过参数明确指定编译模式。
修复后的编译链接命令
nasm -fwin64 Hello_world.asm gcc -mconsole Hello_world.obj
-mconsole参数告诉编译器链接控制台程序,此时链接器会寻找main作为入口,与我们定义的global main匹配。
内容的提问来源于stack exchange,提问作者Obsidian Gnome
相关产品推荐
相关产品推荐

