Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Oct 19, 2019 11:00 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 4 posts ] 
Author Message
PostPosted: Sun Sep 10, 2017 10:53 pm 
Offline
User avatar

Joined: Tue Jul 04, 2017 5:14 pm
Posts: 20
Ну, то есть, какие байты должны быть первыми, какие следующие за что они отвечают, из чего вообще состоит исполняемый файл, есть ли в ней что-то вроде сегментов, если есть - сколько, как их правильно создавать, есть ли заголовки, и что с ними да как, и т. д. и т. п., ну Вы поняли :)

Хочу написать маленький кросс компилятор.


Top
   
PostPosted: Mon Sep 11, 2017 12:38 am 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
Формат очень простой.

Первые 8 байт -- это символы "MENUET01",
дальше следуют семь четырехбайтовых полей в таком порядке:

1) версия

2) адрес точки старта программы (адрес машинной инструкции с которой начнется выполнение)

3) размер файла

4) потребное количество памяти для загрузки программы, сумма складывается из:
- размер файла
- размер глобальных переменных
- размер стэка -- разработчик может определить размер стэка по своему усмотрению (я задаю 1 Мб)
- размер двух текстовых строк: для параметров и для имени исполняемого файла (argv[0] в языке C) -- разработчик определяет длину строк по своему усмотрению (я задаю 2048 байт для каждой). После запуска программы ОС запишет туда параметры и путь исп. файла
- "на всякий случай", я добавляю еще 4096 байт

5) начальное значение регистра esp (т. к. стэк в x86 растет в сторону меньших адресов, начальное значение должно быть адресом конца области стэка)

6) адрес строки параметров

7) адрес строки пути исполняемого файла

Все адреса задаются относительно начала файла (адрес загрузки = 0).
Это создает некоторые проблемы: нулевой адрес считается корректным.
Если программа прочитает данные по адресу 0x0, то там будет текст "MENUET01".

Никаких секций, сегментов -- нет. Есть только вышеописанный заголовок (36 байт). После него следуют код и данные в произвольном порядке.


Top
   
PostPosted: Mon Sep 11, 2017 9:53 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Если интересует, то в одном из моих проектов заголовок исполняемого файла KolibriOS определён вот так:
Code:
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 viewtopic.php?f=2&t=3587
Code:
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:
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:


Top
   
PostPosted: Mon Sep 11, 2017 4:34 pm 
Offline
User avatar

Joined: Tue Jul 04, 2017 5:14 pm
Posts: 20
Понял, всем спасибо!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 4 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited