GCC-Assemby错误:针对'.data'重新定位R_X86_64_32S

时间:2015-11-02 11:02:44

标签: gcc assembly linker elf relocation

情况

  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
    
  6. 问题

    我尝试使用gcc使用上面命令部分中的命令编译上述代码部分中的程序,最后出现错误错误部分。

      

    注意编译共享库。

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

1 个答案:

答案 0 :(得分:1)

特定错误是由push指令仅支持32位立即数,并且您尝试将其用于64位地址。

然而,整个代码是错误的。目前还不清楚你是否需要32位或64位代码。大多数代码似乎是32位,除了pushq,所以我假设你真的想要32位代码。为此,将所有这些更改为push(无论如何这是一个好主意)并使用gcc -m32进行编译。此外,您只需要从堆栈中删除4个字节,因此请使用addl $4, %esp。 (感谢 @Employed Russian 指出这一点。)

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