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:Хочу написать маленький кросс компилятор.
Кросс-компилятора нет, на за то есть кое-что по-лучше: линкер кросс-компилятора!