Serge wrote:
Вот такой пример для наглядности
Code:
STACK_SIZE equ 4096
include 'proc32.inc'
org 0
db 'KOLIBRI',0 ;+00 banner + revision 0-255
dd start ;+08 application entry
dd ecode ;+12 end of code and constant data
dd import ;+16 import section, if present
dd eimport ;+20 end of import section
dd edata ;+24 end of initialized data, end of disk image
dd emem ;+28 end of uninitialized data
dd STACKSIZE ;+32 size of stack
dd 0 ;+36 address of tls info structure kernel-defined
dd 0 ;+38 exec_path kernel-defined
dd 0 ;+40 cmdline kernel-defined
dd 0 ;+44 env kernel-defined
Два вопроса:
- Где экспорты? Для библиотек потом еще один формат изобретать? Уж переделывать -- так сразу комплексно, не?
- Зачем указывать начало и конец секций? На уровне формата в файле предполагаются дырки, заполненные чем угодно? Мне кажется, что секции должны быть пригнаны друг к другу плотно, но с учетом выравнивания, которое можно задать и отдельно.
Набросал свой вариант:
Code:
magic db 'KOLIBRI', 0 ; sign, version
alignment db 4 ; power of 2: 3 = 8 bytes, 4 = 16 bytes
reserved db 3 dup 0
imagebase dd 0 ; image base, for better flexibility
entrypoint dd 0 ; entry point, for better flexibility
code dd 0 ; size of code section
import dd 0 ; size of import section, 0 = section is not present
export dd 0 ; size of export section, 0 = application
data_ dd 0 ; size of initialized data section
mem dd 0 ; size of uninitialized memory for application, as the same in MENUET01
stack_ dd 0 ; size of stack
cmdline dd -1 ; command line, kernel-defined; -1 = prompt for params
execpath dd ? ; exec path, kernel-defined
env dd ? ; environment variables, kernel-defined
tls dd ? ; address of thread local storage (TLS), kernel-defined
Тоже 48 байт. Чёрт, я его FASM-ом компилил, он выдал мне 48 байт, отбросив хвост. На самом деле 60 байт. Отличия:
- Выравнивание задается полем alignment, степенью двойки.
- Есть поля imagebase и entrypoint для лучшей совместимости с неродными компиляторами.
- Есть экспорты. Для библиотеки в поле export пишется размер секции, а у приложений оно равно нулю. По этому признаку можно отличить библиотеку от приложения, поэтому дополнительных флагов не требуется.
- Для секций заданы только размеры. Подразумевается, что секции идут друг за другом сплошняком с учетом выравнивания.
- В поле cmdline может стоять -1, что означает: "Мне нужны входные параметры". Пока флаг никак не используется, а в будущих версиях можно добавить автоматический запрос параметров для таких программ. Получится некий аналог консольных приложений, и тоже без дополнительных полей.
Осталось даже 3 неиспользованных байта после alignment, -- на будущие версии.