x86-64汇编程序与gcc的链接失败

时间:2018-12-25 13:04:02

标签: assembly x86-64 yasm

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进行链接,则可以正常工作。

1 个答案:

答案 0 :(得分:1)

-no-pie链接。

PIE是一项相当新的安全功能,它要求您编写与位置无关的代码。您的代码不是位置无关的,因此您的代码无法链接。对于新手来说,关闭功能是最好的解决方案。另外,您还可以通过使用适当的寻址模式来使代码独立于位置:

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