0

情况


  1. 环境

    Arch Linux x86-64 (4.2.3-1-ARCH)

  2. 海合会

    海合会 (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. 我该如何解决?

4

1 回答 1

2

具体错误是由于该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
于 2015-11-02T13:12:51.063 回答