GCC-Assemby错误:搬迁R_X86_64_32S反对 '数据'(GCC-As

2019-10-29 01:52发布

情况


  1. 环境

    Arch Linux的X86-64(4.2.3-1-ARCH)

  2. GCC

    GCC(GCC)5.2.0

  3. 命令

     gcc -Wall -g -o asm_printf asm_printf.s 
  4. 错误

     /usr/bin/ld: /tmp/cct4fa.o: Relocation R_X86_64_32S against '.data' can not be used when making a shared object; recompile with -fPIC /tmp/cct4fa.o:err adding symbols: Bad value collect2: error: ld returned 1 exit status 
  5.  .section .data msg: .asciz "Printf In Assembly!!\n" .section .text .globl main main: pushq $msg call printf addq $8 %esp pushq $0 call exit 


我试图用gcc在上面的命令部分使用下面的命令来编译程序在上面的代码段和结束了在错误区间一个错误。

请注意 ,我不是编译共享库。

  1. 这是什么错误?
  2. 我该如何解决?

Answer 1:

特定的错误是由于push指令只支持32位的立即和你试图使用一个64位地址。

然而,整个代码是错误的。 目前还不清楚是否要32位或64位的代码。 大部分的代码似乎是32位的,除了pushq所以我假设你真的想要的32位码。 为此,改变所有那些push (这是一个好主意,反正),并使用编译gcc -m32 。 此外,您只需要从堆栈中删除4个字节,所以使用addl $4, %esp (感谢@Employed俄罗斯指出这一点。)

64位调用约定是由32位不同,所以要建立一个64位版本,你必须做出更多的变化。 由于我假设你真的想32位,在这里它只是为了说明:

.section .data
msg:
    .asciz "Printf In Assembly!!\n"

.section .text
.globl main
main:
    subq $8, %rsp
    leaq msg(%rip), %rdi
    xor %al, %al
    call printf

    xor %edi, %edi
    call exit


文章来源: GCC-Assemby Error: Relocation R_X86_64_32S against '.data'