You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:22:40