Связывание программы сборки x86-64 завершается с помощью gcc - PullRequest
0 голосов
/ 25 декабря 2018
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

Не удается связать, используя команды, приведенные в книге Сейфарта:

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

Если я заменил main на _start, а затем собрал, используя yasm, а затем связал, используя ld, это работает.

1 Ответ

0 голосов
/ 25 декабря 2018

Связь с -no-pie.

PIE - довольно новая функция безопасности, которая требует от вас написания независимого от позиции кода.Ваш код не зависит от позиции, поэтому ваш код не может ссылаться.Отключение этой функции - лучшее решение для новичка.Кроме того, вы также можете сделать свой код независимым от позиции, используя соответствующие режимы адресации:

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