汇编实现二次方程求根程序的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
相关产品推荐
相关产品推荐

