Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт окт 19, 2017 6:32 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 4 сообщения ] 
Автор Сообщение
СообщениеДобавлено: Вс сен 10, 2017 10:53 pm 
Не в сети

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

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


Вернуться к началу
СообщениеДобавлено: Пн сен 11, 2017 12:38 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 83
Формат очень простой.

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

1) версия

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

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

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

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

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

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

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

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


Вернуться к началу
СообщениеДобавлено: Пн сен 11, 2017 9:53 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Если интересует, то в одном из моих проектов заголовок исполняемого файла KolibriOS определён вот так:
Код:
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
Код:
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
Код:
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:


Вернуться к началу
СообщениеДобавлено: Пн сен 11, 2017 4:34 pm 
Не в сети

Зарегистрирован: Вт июл 04, 2017 5:14 pm
Сообщения: 2
Понял, всем спасибо!


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 4 сообщения ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB