Page 1 of 1
Где можно найти спецификацию исполняемых файлов Колибри ОС?
Posted: Sun Sep 10, 2017 10:53 pm
by mkostoevr
Ну, то есть, какие байты должны быть первыми, какие следующие за что они отвечают, из чего вообще состоит исполняемый файл, есть ли в ней что-то вроде сегментов, если есть - сколько, как их правильно создавать, есть ли заголовки, и что с ними да как, и т. д. и т. п., ну Вы поняли
Хочу написать маленький кросс компилятор.
Re: Где можно найти спецификацию исполняемых файлов Колибри ОС?
Posted: Mon Sep 11, 2017 12:38 am
by akron1
Формат очень простой.
Первые 8 байт -- это символы "MENUET01",
дальше следуют семь четырехбайтовых полей в таком порядке:
1) версия
2) адрес точки старта программы (адрес машинной инструкции с которой начнется выполнение)
3) размер файла
4) потребное количество памяти для загрузки программы, сумма складывается из:
- размер файла
- размер глобальных переменных
- размер стэка -- разработчик может определить размер стэка по своему усмотрению (я задаю 1 Мб)
- размер двух текстовых строк: для параметров и для имени исполняемого файла (argv[0] в языке C) -- разработчик определяет длину строк по своему усмотрению (я задаю 2048 байт для каждой). После запуска программы ОС запишет туда параметры и путь исп. файла
- "на всякий случай", я добавляю еще 4096 байт
5) начальное значение регистра esp (т. к. стэк в x86 растет в сторону меньших адресов, начальное значение должно быть адресом конца области стэка)
6) адрес строки параметров
7) адрес строки пути исполняемого файла
Все адреса задаются относительно начала файла (адрес загрузки = 0).
Это создает некоторые проблемы: нулевой адрес считается корректным.
Если программа прочитает данные по адресу 0x0, то там будет текст "MENUET01".
Никаких секций, сегментов -- нет. Есть только вышеописанный заголовок (36 байт). После него следуют код и данные в произвольном порядке.
Re: Где можно найти спецификацию исполняемых файлов Колибри ОС?
Posted: Mon Sep 11, 2017 9:53 am
by 0CodErr
Если интересует, то в одном из моих проектов заголовок исполняемого файла
KolibriOS определён вот так:
Code: Select all
Type
AppHeader = Packed Record
Signature: Packed Array [0..7] Of Char;
Version: Dword;
EntryPoint: Dword;
EndImage: Dword;
Memory: Dword;
StackTop: Dword;
CmdLine: Dword;
FilePath: Dword;
End;
Возможно, также интересен будет линкер-скрипт.
Для примера линкер-скрипт из
BigSample http://board.kolibrios.org/viewtopic.php?f=2&t=3587 Code: Select all
PATH_SIZE = 1024;
PARAMS_SIZE = 256;
STACK_SIZE = 1024;
SECTIONS
{
.all : AT(0){
LONG(0x554e454D);
LONG(0x31305445);
LONG(1);
LONG("@Main");
LONG(END);
LONG($END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
LONG($END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
LONG($END + PATH_SIZE);
LONG($END);
*(.text)
*(code)
*(.rdata)
*(const)
*(CONST)
*(.data)
*(data)
}
END = .;
.bss ALIGN(16) : {*(.bss)}
$END = .;
}
А вот из исходника программы
Timer http://websvn.kolibrios.org/filedetails ... sm#line-39 Code: Select all
STACK_SIZE equ 256
...
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END + STACK_SIZE
program.stack dd END + STACK_SIZE
program.params dd 0
program.path dd 0
...
START:
...
END:
Re: Где можно найти спецификацию исполняемых файлов Колибри ОС?
Posted: Mon Sep 11, 2017 4:34 pm
by mkostoevr
Понял, всем спасибо!
Re: Где можно найти спецификацию исполняемых файлов Колибри ОС?
Posted: Sat Dec 07, 2019 12:47 pm
by Boppan
akron1 wrote:6) адрес строки параметров
Уточню, что программист записывает туда адрес буфера, в который будут скопированы аргументы командной строки при старте программы. А буфер должен быть выделен где-то внутри самой программы при помощи resb или как-то так.
Я сначала подумал, что при запуске система сама записывает туда непосредственно указатель на строку с аргументами.
И еще, в буфер копируются только аргументы, без имени файла, просто строка аргументов.
Re: Где можно найти спецификацию исполняемых файлов Колибри ОС?
Posted: Sun Dec 20, 2020 3:28 pm
by mkostoevr
mkostoevr wrote:Хочу написать маленький кросс компилятор.
Кросс-компилятора нет, на за то есть кое-что по-лучше: линкер кросс-компилятора!