Как выглядит файл ELF64?

#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. Другая возможность заключается в том, что я просто помещаю все в ассемблерный файл, собираю и связываю его, но это не проблема и, следовательно, не весело.