Почему я должен использовать ld, чтобы связать мой бинарный файл? - PullRequest
2 голосов
/ 31 октября 2019

Я делаю небольшую программу "Hello World" в NASM для запуска на моей машине с Ubuntu (вывод uname -a включен ниже):

 $uname -a
Linux desk069 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Теперь, после сохранения этого файла, я имеюзапустить

nasm -f elf64 ./test. ./test.nasm -o test.o
ld -o test test.o -m elf_x86_64

Для того, чтобы мой код работал. Попытка запустить test.o дает мне

bash: ./test.o: cannot execute binary file: Exec format error

, а попытка заставить NASM сгенерировать bin-файл дает мне:

$nasm -f bin ./test.nasm -o test.bin
$chmod +x ./test.bin
$./test.bin
bash: ./test.bin: cannot execute binary file: Exec format error

У меня вопрос, я не использую никаких библиотек. Почему я должен использовать компоновщик ld? Что именно не так с файлом bin? Могу ли я что-то сделать, чтобы он работал без ld?

Мой код указан ниже.

section .text
    global _start

section .data
msg db 'Hello, world!', 0xa 
len equ $- msg 

section .text

_start:

    mov edx, len 
    mov ecx, msg 
    mov ebx, 1
    mov eax, 4
    int 0x80

    mov ebx, 0
    mov eax, 1
    int 0x80

1 Ответ

2 голосов
/ 03 ноября 2019

Почему я должен использовать компоновщик ld?

Вам не нужно использовать ld, но использовать его гораздо проще, чем нет (см. Ниже).

Что именно не так с файлом bin?

Ничто в файле .bin не указывает ОС , как загрузить и запустить ее.

По какому адресу ОС должна отобразить этот файл в память? Где он должен установить регистр RIP, чтобы начать его выполнение?

Когда вы создаете программу, которая будет работать в «голой железной» системе, вы можете организовать загрузку этой программы точно при перезагрузке процессораадреса, и процессор начнет получать и выполнять инструкции с этого адреса, когда он включен.

Но вы не пытаетесь это сделать - вы используете Linux, и ему нужно указать, кудазагрузить программу и как ее запустить.

Обычно эта информация предоставляется заголовком файла ELF и заголовками программы (которые готовит компоновщик), хотя Linux может выполнять и другие форматы файлов.

Можно ли что-то сделать, чтобы он работал без ld?

Конечно. Вы можете предоставить все ELF заголовок и биты заголовка программы без с участием компоновщика. * * Пример тысяча тридцать-четырь . Просто намного сложнее сделать правильно и отлаживать, когда что-то идет не так.

...