#linux #assembly #compiler-construction #64-bit #elf
#linux #сборка #построение компилятора #64-разрядный #elf
Вопрос:
ОК.
Итак, я возился со сборкой, и мне было интересно: как выглядит файл linkes ELF64, и могу ли я напрямую записать связанный файл в виде обычного текста? (например, создайте файл, например, «main», запишите шестнадцатеричные значения системных вызовов, а затем запустите его без связывания или сборки.)
Я пробовал objdump -x main
, но я не думаю, что это весь ELF-файл, потому что, как я думаю, слишком мало информации.
Здесь вывод:
main: Dateiformat elf64-x86-64
Inhalt von Abschnitt .text:
4000b0 b8040000 00bb0100 0000b9d0 006000ba .............`..
4000c0 0c000000 cd80b801 000000cd 80 .............
Inhalt von Abschnitt .data:
6000d0 48454c4c 4f2c2057 4f524c44 HELLO, WORLD
мой код на ассемблере:
section .data
msg: db "HELLO, WORLD"
len: equ $-msg
section .text
;write
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 80h;
;quit
mov eax, 1
int 80h;
РЕДАКТИРОВАТЬ: мой компилятор завершен, я просто застрял на ассемблере и позволил NASM / ld выполнить эту работу
Комментарии:
1. Вы пытались прочитать документацию о том, как структурирован ELF?
2. вы имеете в виду
man elf
3. Это хороший источник для начала.
4. ОК. теперь: могу ли я просто записать это обычным текстом или мне нужно написать это, например, с помощью шестнадцатеричного редактора?
5. ОК. Спасибо. Это была оригинальная идея, но я хотел сделать ее более сложной. Возможно, я переоценивал себя 🙂
Ответ №1:
Если вы хотите увидеть всю структуру вашего исполняемого файла, попробуйте:
objdump -D some_exe
и если вы хотите увидеть свой файл в шестнадцатеричном формате, сделайте:
xxd some_exe
или
hexdump some_exe
могу ли я напрямую записать связанный файл в виде обычного текста?
Что ж… Теоретически вы можете, если вы точно знаете инструкции исполняемого файла и записываете их в двоичном формате в текстовый файл.
Например, для любого заданного исполняемого exe_file вы можете сделать это:
touch temp_file plaintext_file
xxd -p exe_file > temp_file
xxd -p -r temp_file > plaintext_file
chmod u x plaintext_file
Файл plaintext_file будет исполняемым файлом, точно таким же, как ваш exe_file. Если между шагами 2 и 3 вы изменяете temp_file, вы напрямую изменяете исполняемый файл вручную, хотя маловероятно, что это изменит что-то «конкретное», если только у вас нет очень глубокого понимания формата elf64 (чего у меня нет, и я не уверен, чего можно достичь с помощью этого).
Примечание: я знаю, что шаг 1 является избыточным, я использовал его для демонстрации того, что вы начинаете с 2 простых текстовых файлов.
Комментарии:
1. ОК. Но теперь самое сложное: я хотел создать компилятор, который просто записывает открытый текст, сохраняет его, а затем изменяет его. возможно ли это, или я слишком амбициозен?
2. и еще один вопрос: почему здесь так много пустого места?
3. я имею в виду, почему так много пустого места, когда я запускаю xxd?
4. Я не совсем уверен, что понял, какой компилятор вы хотите написать? Что касается другого вопроса, я полагаю, вы хотите ознакомиться со спецификой формата здесь: en.wikipedia.org/wiki/Executable_and_Linkable_Format
5. я уже заглянул в википедию, но я не вижу, например: как инициировать системный вызов в elf64. Для компилятора: я хочу написать компилятор, который компилирует код в exe. Другая возможность заключается в том, что я просто помещаю все в ассемблерный файл, собираю и связываю его, но это не проблема и, следовательно, не весело.