Проблема с привязкой объектного файла к стандартной библиотеке

Ну, я использую 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.


person mathway    schedule 31.10.2020    source источник
comment
Используйте 1_   -  person Michael Petch    schedule 01.11.2020
comment
В качестве альтернативы свяжите с -no-pie.   -  person fuz    schedule 01.11.2020
comment
Вау, это действительно работает... Но что означает этот набор слов после call? Почему я нашел в Интернете много фрагментов кода asm и использовал такие наборы инструментов, как nasm -felf64 test.s && gcc test.o && ./a.out, но в моем случае это не сработало?   -  person mathway    schedule 01.11.2020
comment
Мой ответ на связанный дубликат Невозможно вызвать стандартную библиотечную функцию C в 64-битном Linux из кода сборки (yasm) объясняет, что это делает. Учебники, которые вы найдете, были написаны до того, как -pie стал по умолчанию для gcc. См. также 32-битные абсолютные адреса, которые больше не разрешены в x86-64 Linux? что также может стать потенциальной проблемой, если вы следуете учебные пособия, написанные для ссылок без PIE.   -  person Peter Cordes    schedule 01.11.2020
comment
Хорошо, спасибо всем!!   -  person mathway    schedule 01.11.2020