Компиляция программ для Kolibri.
Компиляция программ в простейшем случае, осуществляется в 3 этапа (если где-то ошибаюсь, поправьте!):
1. Инструментом "
kos32-gcc" создаётся объектный файл с именем "имя_программы.o".
2. Инструментом "
kos32-ld", производится встраивание заголовка исполняемого файла
Kolibri и связывание объектного файла с библиотеками в единый файл..
3. Инструментом "
kos32-objcopy", происходит вырезание исполняемого файла
Kolibri из файла, который на выходе выдаёт "
kos32-ld".
Настройка kos32-gcc.Далее, будет приведено описание обязательных и необязательных, но полезных ключей.
Описание ключей kos32-gcc (обязательные ключи):-c - компилировать файл(ы), но не линковать.
-U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 - Отменяет предыдущее определение имени, либо встроенное, либо снабженное опцией
-D.
-I /usr/local/kos32/sdk/sources/newlib/libc/include - добавляет директорию "
/usr/local/kos32/sdk/sources/newlib/libc/include" в список директорий с заголовочными файлами.
Данный ключ можно использовать для переопределения файла заголовка системы, подставляя вашу собственную версию, поскольку
эти директории просматриваются перед директориями файлов заголовков системы. Если вы используете более одного параметра
-I, каталоги сканируются в порядке слева направо.
-o имя_программы.o - Расположить выходной файл в файле "
имя_программы.o".
Более подробное описание ключей можно посмотреть в man-странице командой "
man gcc".
Командная строка для kos32-gcc:
Code:
kos32-gcc -c -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I /usr/local/kos32/sdk/sources/newlib/libc/include -o имя_программы.o имя_программы.c
Описание ключей kos32-gcc (необязательные ключи):-m32 - генерировать код только для 32 битного процессора.
-march=тип_процессора - сгенерировать инструкции для указанного типа процессора.
типы процессоров:
native - использовать инструкции всех доступных процессоров.
i386,
i486,
i586/
pentium,
pentium-mmx,
pentiumpro,
i686,
pentium2,
pentium3,
pentium4 и т.д.
-mtune=тип процессора - настройка на процессор.
тип процессора:
generic - генерировать оптимизированный код для большинства процессоров IA32/AMD64/EM64T.
pentium4 - генерировать код настроенный на процессор pentium4.
и т.д.
-std=языковой стандарт - определяет стандарт языка.
Стандарты:
c99,
с90,
с89 и т.д.
-O2 - оптимизация кода по скорости компиляции и по скорости исполнения.
-Os - оптимизация кода по размеру.
-fomit-frame-pointer - не держать указатель кадра в регистре для функций, который им не нужен. Это позволяет избежать сохранение
инструкций, настройку и восстановление указателей кадров; также делает дополнительный регистр доступным во многих функциях. Так же, на
некоторых машинах, делает отладку невозможной.
Более подробное описание ключей можно посмотреть в man-странице командой "
man gcc".
Командная строка для kos32-gcc:
Code:
kos32-gcc -m32 -march=native -mtune=generic -std=c99 -c -O2 -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
-I /usr/local/kos32/sdk/sources/newlib/libc/include -o имя_программы.o имя_программы.c
Настройка kos32-ld.Настройка kos32-ld чуть сложнее, но если разобраться, то всё просто.
Описание ключей kos32-ld:
-static - не линковать с динамическими библиотеками.
-call_shared - ссылка на динамические библиотеки.
-nostdlib - только поиск библиотек, явно указанных в командной строке. Библиотечные каталоги, указанные в сценариях компоновщика
(включая скрипты компоновщика, указанные в командной строке), игнорируются.
--subsystem подсистема - Определяет подсистему, под которой будет выполняться ваша программа. Параметр "
подсистема"
в ключе "
--subsystem" для программ Kolibri, может быть: для графических - "
native", "
windows" или "
posix", для консольных - "
console".
--image-base 0 - Использовать значение
0 в качестве базового адреса вашей программы или dll. Это самая нижняя область памяти,
которая будет использоваться при загрузке вашей программы или dll.
-T /usr/local/kos32/sdk/sources/newlib/static.lds - использовать скриптовый файл "
static.lds" в качестве скрипта для линкера "
kos32-ld".
-Map=mapfile - распечатать карту ссылок в файл "
mapfile".
-L searchdir - добавляет путь "
searchdir" в список путей, которые "
kos32-ld" будет искать в архивных библиотеках и
ld-скриптах управления.
Вы можете использовать эту опцию любое количество раз. Поиск директорий осуществляется в том порядке, в котором они указаны в
командной строке. Каталоги, указанные в командной строке, просматриваются перед каталогами по умолчанию. Все опции
-L применяются ко всем параметрам
-l, независимо от порядка отображения параметров. Параметры
-L не влияют на то, как "
ld" ищет скрипт компоновщика, если не указана опция
-T.
-o имя_программы - расположить выходной файл в файле "
имя_программы". Если опция "
имя_программы" не указана, то по умолчанию используется имя "
a.out".
-lc - добавить файл архива или объекта, указанный в указателе имен, в список файлов для ссылки. В нашем случае - "
libc.a".
-lc.dll - добавить файл архива или объекта, указанный в указателе имен, в список файлов для ссылки. В нашем случае - "
libc.dll.a".
-lgcc - добавить файл архива или объекта, указанный в указателе имен, в список файлов для ссылки. В нашем случае - "
libgcc.a".
Более подробное описание ключей можно посмотреть в man-странице командой "
man ld".
Командная строка для kos32-ld (статическая линковка):
Code:
kos32-ld -static -nostdlib --subsystem native --image-base 0 -T /usr/local/kos32/sdk/sources/newlib/static.lds -Map=$app_name.map -L /usr/local/kos32/sdk/lib
-L /usr/local/kos32/lib -o имя_программы имя_программы.o -lc -lgcc -lc
Порядок расположения ключей
-lc и
-lgcc, имеет значение, и должен совпадать с порядком указания путей, ключём
-L.
Командная строка для kos32-ld (динамическая линковка):
Code:
kos32-ld -call_shared -nostdlib --subsystem native --image-base 0 -T /usr/local/kos32/sdk/sources/newlib/app-dynamic.lds -Map=$app_name.map
-L /usr/local/kos32/sdk/lib -L /usr/local/kos32/lib -o имя_программы имя_программы.o -lgcc -lc.dll
Порядок расположения ключей
-lgcc и
-lc.dll, имеет значение, и должен совпадать с порядком указания путей, ключём
-L.
Настройка kos32-objcopy.Тут, всё просто и особо настраевать нечего.
Командная строка для kos32-objcopy:Code:
kos32-objcopy имя_программы -O binary
Подробное описание ключей kos32-objcopy в "
man objcopy".
Две простые программы для теста.Первая рограмма
hello.c (консольная):
Code:
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
};

Вторая программа
window.c (графическая):
Code:
#include <kos32sys.h>
static char * title="Window";
void create_window(){
BeginDraw();
DrawWindow(100,100,400,200,title,0x80ffffff,0x13);
EndDraw();
}
int main(int argc, char** argv[])
{
create_window();
for (;;)
{
switch(get_os_event())
{
case 1:
create_window();
continue;
case 2:
// key pressed, read it and ignore
get_key();
continue;
case 3:
// button pressed; we have only one button, close
if(get_os_button()==1) return 0;
continue;
}
}
}

Теперь, если всё настроено верно и все ключи введены правильно, то на выходе получим исполняемый(ые) файл(ы) для Kolibri.
На этом, пока всё. Описания минимального набора ключей, вполне достаточно для комфортного компилирования программ для Kolibri, в GNU Linux.
Далее, приведу простой, но удобный Bash скрипт, для компиляции программ для Kolibri.
Продолжение тут.
Дата выпуска: 30.05.2017