【问题标题】:x86-64 assembly program linking fails with gccx86-64 汇编程序链接因 gcc 失败
【发布时间】:2019-05-24 03:50:36
【问题描述】:
From seyfarth's book:

        segment .data
a       dw      175

b       dw      4097

        segment .text
        global  main
main:

        mov     rax, [a]    ; mov a (175)into rax

        add     rax, [b]    ; add b to rax
        xor     rax, rax
        ret

使用 seyfarth 书中给出的命令链接失败:

yasm -P ebe.inc -Worphan-labels -f elf64 -g dwarf2 -l add1.lst add1.asm
gcc -g -o add1 add1.o
/usr/bin/ld: add1.o: relocation R_X86_64_32 against `.data' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Makefile:20: recipe for target 'add1' failed
make: *** [add1] Error 1

如果我用 _start 替换 main ,然后使用 yasm 组装,然后使用 ld 链接它可以工作。

【问题讨论】:

    标签: assembly x86-64 yasm


    【解决方案1】:

    链接到-no-pie

    PIE 是一项相当新的安全功能,它要求您编写与位置无关的代码。您的代码与位置无关,因此您的代码无法链接。关闭该功能是初学者的最佳解决方案。或者,您也可以使用适当的寻址模式使您的代码与位置无关:

    mov rax, [rel a]
    add rax, [rel b]
    

    【讨论】:

    • 我已将其标记为“已接受”。感谢您的“直截了​​当”的回答。请提供您可能对您的答案有任何参考。
    • @SRK 抱歉,我对此没有任何参考。也许this article 作为介绍可能会有所帮助。
    • @SRK:或者更好的是,在文件顶部使用default rel。当 RIP-relative 是一个选项时,您几乎不需要绝对寻址模式。 (但不是当你有 [a + rax] 这样的东西时,所以如果你正在索引静态数组,no-pie 允许稍微更高效的代码。)几乎是 32-bit absolute addresses no longer allowed in x86-64 Linux? 的副本,但 Q&A 主要假设你了解 RIP-相对寻址与绝对寻址。
    • @PeterCordes:这听起来不错。但是相同的文档在哪里?我的意思是如何在 x86-64 程序集中使用 rel 等?
    • @SRK:文档在 NASM 手册中:nasm.us/doc/nasmdoc6.html#section-6.2。有关 RIP 相对寻址的一般工作原理,请参阅 Intel 或 AMD 的手册,或有关 x86-64 的各种其他文档/指南。如果您想了解机器编码,请参阅wiki.osdev.org/…(32 位有 2 种冗余方式来编码 32 位绝对地址。x86-64 RIP-relative 使用较短的一种(无 SIB 字节),留下较长的编码还是[disp32]。)
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2013-03-06
    • 2011-11-19
    • 1970-01-01
    • 2022-10-15
    • 2010-11-21
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多