使用GCC进行汇编会导致.data

时间:2017-09-08 19:37:39

标签: gcc assembly gas

这是一个以前没有发生过的问题。我非常相信它可能是我的包装回购的一个问题(我最近重新安装了我的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来满足我的装配需求。

1 个答案:

答案 0 :(得分:5)

解决此错误的方法是生成books = new List<book>(); (非位置独立可执行文件)可执行文件:

no-pie

这种行为的原因如@ Ped7g所述:

Debian以64位模式切换到PIC / PIE二进制文件&amp;在您的情况下,GCC尝试将您的对象链接为PIC,但它将在gcc -no-pie test.s -o test 中遇到绝对地址。