这是一个以前没有发生过的问题。我非常相信它可能是我的包装回购的一个问题(我最近重新安装了我的Arch系统,而这刚刚开始发生)。
我在x86_64中写了一个小小的hello世界:
.data
str: .asciz "Test"
.text
.globl main
main:
sub $8, %rsp
mov $str, %rdi
call puts
add $8, %rsp
ret
然后我尝试使用GCC进行汇编和链接 - 就像我过去做过很多次一样 - 简单地说:
gcc test.s -o test
然后输出此错误:
/ usr / bin / ld:/tmp/ccAKVV4D.o:针对`.data'重新定位R_X86_64_32S制作共享对象时不能使用;用-fPIC重新编译 / usr / bin / ld:最终链接失败:输出中不可表示的部分 collect2:错误:ld返回1退出状态
此错误从未发生在我身上。我试图通过Google搜索相同的错误消息来解决问题,但它提出的内容非常具体,而我认为这是一个普遍的问题。我尝试重新安装base-devel和整个GCC工具链。我不知道我还能做什么(请不要建议使用nasm, heresy )。
我想我错过了一些显而易见的东西,但我长期以来一直使用GCC来满足我的装配需求。
答案 0 :(得分:5)
解决此错误的方法是生成books = new List<book>();
(非位置独立可执行文件)可执行文件:
no-pie
这种行为的原因如@ Ped7g所述:
Debian以64位模式切换到PIC / PIE二进制文件&amp;在您的情况下,GCC尝试将您的对象链接为PIC,但它将在gcc -no-pie test.s -o test
中遇到绝对地址。