【问题标题】:GCC-Assemby Error: Relocation R_X86_64_32S against '.data'GCC 程序集错误:针对“.data”重定位 R_X86_64_32S
【发布时间】:2015-11-02 11:02:43
【问题描述】:

情况


  1. 环境

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

  2. 海合会

    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 使用上面 Command 部分中的命令编译上面 Code 部分中的程序,结果在 Command 部分中出现错误strong>错误部分。

注意不是编译共享库。

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

【问题讨论】:

    标签: gcc assembly linker elf relocation


    【解决方案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
    

    【讨论】:

    • 对于32位代码,CALL之后的栈清理也需要从8改为4。
    • 糟糕,确实如此。即使在这里没有区别:)
    • @Jester,我找不到任何关于 x64 的 GAS asm 的书。只有32位。正如我从示例中看到的,x64 和 32 中的“hello world”完全不同。 (例如,对于 fd、syscall 等没有立即推送)。那么我在哪里可以找到 x64 asm 的好书或资源?另外,我想学习用于内核系统调用和驱动器开发的 x64,但实际上内核在他的 *.S 文件中使用 x64 asm 或 32bit 吗?实际使用中 32 位 asm 与 x64 有何不同?
    • 64 位内核使用 64 位 asm。驱动程序不使用 asm。调用约定和其他低级内容在x86-64 abi pdf 中定义。系统调用和参数在内核源代码或online tables 中描述。
    猜你喜欢
    • 2020-01-26
    • 2018-06-19
    • 2013-11-15
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多