Ну, я использую nasm
для создания test.o
из моего test.s
. Когда я затем запускаю gcc test.o
, это дает мне сообщение об ошибке
/usr/bin/ld: test.o: перемещение R_X86_64_PC32 вместо символа `puts@@GLIBC_2.2.5' нельзя использовать при создании объекта PIE; перекомпилировать с -fPIE /usr/bin/ld: окончательная ссылка не удалась: неверное значение collect2: ошибка: ld вернул 1 статус выхода
test.s:
global main
extern puts
section .text
main:
mov rdi, message
call puts
ret
message:
db "Hello World", 0
Что означает это сообщение об ошибке и как его исправить?
Кроме того, в этом случае я использую gcc
, чтобы связать мой файл object со стандартной библиотекой, но как я могу использовать ld
для выполнения той же работы?
Я использую Ubuntu 20.04 LTS.
-no-pie
. - person fuz   schedule 01.11.2020call
? Почему я нашел в Интернете много фрагментов кодаasm
и использовал такие наборы инструментов, какnasm -felf64 test.s && gcc test.o && ./a.out
, но в моем случае это не сработало? - person mathway   schedule 01.11.2020-pie
стал по умолчанию для gcc. См. также 32-битные абсолютные адреса, которые больше не разрешены в x86-64 Linux? что также может стать потенциальной проблемой, если вы следуете учебные пособия, написанные для ссылок без PIE. - person Peter Cordes   schedule 01.11.2020