Выполнение плоского двоичного файла в соответствии с Linux

Какое программирование?

В моем коммерческом опыте, мне не была нужна никакая усовершенствованная математика, но это в большой степени зависит от поля, в котором Вы находитесь.

Компьютерная графика требует большой суммы усовершенствованной математики. Большое академическое программирование требует усовершенствованной математики.

Настолько говорящий имеет тенденцию быть корреляция между людьми, которые способны к математике и людям, которые способны программировать.

я надеюсь, что этот слабый ответ помогает.

6
задан starblue 17 October 2009 в 19:57
поделиться

2 ответа

Есть ли причина, по которой вы не хотите использовать «-f elf» вместо «-f bin»?

Я думаю, что Linux не будет запускать двоичный файл, который не находится в ELF формат. Я не могу найти инструмент, который конвертирует плоские двоичные файлы в ELF, но вы можете обмануть, поместив информацию ELF в foo.asm, используя технику, описанную здесь :

Мы можем посмотреть на ELF спецификация и /usr/include/linux/elf.h и исполняемые файлы, созданные по стандарту инструменты, чтобы выяснить, что наши пустые Исполняемый файл ELF должен выглядеть так. Но, если вы нетерпеливый тип, вы можете просто используйте тот, который я предоставил здесь:

  BITS 32

 org 0x08048000

ehdr:; Elf32_Ehdr
db 0x7F, "ELF", 1, 1, 1, 0; e_ident
 умножить на 8 дБ 0
dw 2; e_type
dw 3; e_machine
дд 1; e_version
dd _start; e_entry
дд пхдр - $$; e_phoff
дд 0; e_shoff
дд 0; e_flags
dw ehdrsize; e_ehsize
dw phdrsize; e_phentsize
dw 1; e_phnum
dw 0; e_shentsize
dw 0; е_шнум
dw 0; e_shstrndx

 ehdrsize equ $ - ehdr

phdr:; Elf32_Phdr
дд 1; p_type
дд 0; p_offset
dd $$; p_vaddr
dd $$; p_paddr
dd размер файла; p_filesz
dd размер файла; p_memsz
дд 5; p_flags
дд 0x1000; p_align

 phdrsize equ $ - phdr

 _Начало:

; ваша программа здесь

 размер файла equ $ - $$

Это изображение содержит заголовок в формате ELF, идентифицируя файл как Intel 386 исполняемый файл без заголовка раздела таблица и таблица заголовков программы содержащий одну запись. Указанная запись инструктирует загрузчик программы загрузить весь файл в память (это нормальное поведение программы для включить его заголовок ELF и программу таблица заголовков в ее образе памяти) начиная с адреса памяти 0x08048000 (который является адресом по умолчанию для исполняемые файлы для загрузки) и начать выполнение кода в _start, который появляется сразу после программы таблица заголовков. Нет сегмента данных, нет .bss сегмент, без комментариев - ничего но самое необходимое.

Итак, давайте добавим в нашу небольшую программу:

 ; tiny.asm
 org 0x08048000

 ;
; (как указано выше)
 ;

_start: mov bl, 42 xor eax, eax inc eax int 0x80 размер файла equ $ - $$

и попробуйте:

  $ nasm -f bin -o a.out tiny.asm
 $ chmod + x a.out
$ ./a.out; эхо $?
 42
7
ответ дан 8 December 2019 в 14:45
поделиться

Ядро Linux может загружать несколько различных двоичных форматов - ELF является наиболее распространенным, хотя формат a.out также довольно хорошо известен.

Поддерживаемые двоичные форматы контролируются Модули binfmt загружаются или компилируются в ядро ​​(они находятся в разделе «Файловая система» конфигурации ядра). Существует binfmt_flat для двоичных файлов в плоском формате uClinux BFLT, которые довольно минимальны - их можно даже сжать zlib, что позволит вам сделать ваш двоичный файл еще меньше, так что это может быть хорошим выбором. Похоже, что nasm изначально поддерживает этот формат, но довольно легко добавить необходимый заголовок вручную, как описывает Джим Льюис для ELF. Описание формата здесь .

9
ответ дан 8 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: