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

汇编实现二次方程求根程序的GCC链接错误求助

解决x86_64汇编链接时R_X86_64_32S重定位错误

这个链接错误的核心原因是:在x86_64平台下,GCC默认会生成PIE(位置无关可执行文件),而你的汇编代码里用了32位偏移的方式访问.bss段变量,这种寻址方式和PIE的要求冲突。具体来说,你宏里的movsd xmm0,[%1]是直接用符号的32位偏移地址来访问变量,但PIE程序会被加载到随机内存地址,32位偏移无法覆盖整个64位地址空间,所以链接器报错。

给你两种可行的解决方法:

  • 方法一:链接时关闭PIE模式
    不需要修改任何汇编代码,只需要把你的gcc链接命令改成:

    gcc -no-pie -o assgn10 assgn10.o
    

    关闭PIE后,程序会被加载到固定地址,32位偏移的寻址方式就能正常工作了,这是最快捷的解决办法。

  • 方法二:修改汇编代码为位置无关格式
    如果你需要生成位置无关的可执行文件,可以修改汇编里访问变量的方式,使用相对寻址:
    把宏中的movsd xmm0,[%1]改成:

    movsd xmm0,[rel %1]
    

    然后汇编时加上-fPIC参数:

    nasm -f elf64 -fPIC assgn10.asm
    

    之后再用原来的gcc命令链接即可:

    gcc -o assgn10 assgn10.o
    

简单总结下:PIE是现在GCC的默认行为,目的是提升安全性,但它限制了传统的32位偏移寻址,要么关闭PIE,要么改成符合位置无关要求的寻址方式,二选一就能解决这个问题。

内容的提问来源于stack exchange,提问作者Edmund Fitzgerald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:15