Я делаю код сборки (intel) и не понимаю, почему этот код не работает, когда я пытаюсь создать общую библиотеку:
BITS 64
SECTION .text
GLOBAL test
test:
push rbp
mov rbp, rsp
mov rax, 3
mov al, BYTE [rel array + rax]
pop rbp
ret
SECTION .data
array times 256 db 0
Принимая во внимание, что если вы измените строку с помощью «mov», изменив регистр на число, это сработает:
mov al, BYTE [rel array + 3]
У меня нет ошибок с nasm, но когда я пытаюсь связать и создать общую библиотеку с помощью ld:
перемещение R_X86_64_32S против `.data' нельзя использовать при создании общего объекта; перекомпилировать с -fPIC
Я нашел этот ответ для ошибки «R_X86_64_32S»: связать работу на практике?
Но что то я не понимаю, почему я не могу использовать "rax" как смещение, тогда как с числом могу.
Есть ли способ просмотреть массив?
Это команды, которые я использую для создания общей библиотеки:
nasm -f elf64 test.s
ld -shared test.o -o test.so
[array + rax]
, поскольку для этого требуется, чтобы адрес соответствовал 32-битному расширенному знаку значению. Как говорит Джестер, странно, что NASM не предупреждает об[rel array + rax]
, потому что rel не является опцией, поэтому он закодирован как[abs array + rax]
. И, кстати, вы можете использоватьdefault rel
, чтобы NASM использовал RIP-относительно везде, где это возможно. - person Peter Cordes   schedule 21.03.2018