Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт авг 21, 2018 10:48 am

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




Начать новую тему  Ответить на тему  [ 5 сообщений ] 
Автор Сообщение
 Заголовок сообщения: C + KolibriOS.lib
СообщениеДобавлено: Ср фев 14, 2018 11:54 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1310
Здесь есть один нюанс: пришлось объявить фиктивный union в некоторых структурах.
В частности
Код:
struct TSize{
  union{
    struct{
      unsigned short Height;
      unsigned short Width;
    };
    unsigned long Value;
  };
};
А так она объявлена изначально
Код:
  TSize = Packed Record
    Height: Word;
    Width:  Word;
  End;

А дело всё в том, что в отличие от си-шных компиляторов, компилятор Delphi ведёт себя более рационально: если возвращаемое значение умещается в регистре, то оно и возвращается в регистре, причём, даже если это структура.
Си-шные же компиляторы структуры в регистре не возвращают.
Было проверено в компиляторах Borland C++, Open Watcom, GCC, MSVC.
В стандарте я ничего не нашёл по этому поводу.

В KolibriOS.lib не так много функций, возвращающих значения в структурах, вот они:
Код:
Function  GetKey: TKeyboardInput; StdCall; External 'KolibriOS';
Function  GetSystemTime: TSystemTime; StdCall; External 'KolibriOS';
Function  GetScreenMax: TPoint; StdCall; External 'KolibriOS';
Function  GetLastDrawnBackgroundRect: TRect; StdCall; External 'KolibriOS';
Function  GetButton: TButtonInput; StdCall; External 'KolibriOS';
Function  GetSystemDate: TSystemDate; StdCall; External 'KolibriOS';
Function  GetMousePos: TPoint; StdCall; External 'KolibriOS';
Function  GetWindowMousePos: TPoint; StdCall; External 'KolibriOS';
Function  GetMouseScroll: TPoint; StdCall; External 'KolibriOS';
Function  GetBackgroundSize: TSize; StdCall; External 'KolibriOS';
Function  GetScreenWorkingArea: TRect; StdCall; External 'KolibriOS';
Function  GetSkinMargins: TRect; StdCall; External 'KolibriOS';
Function  GetScreenSize: TSize; StdCall; External 'KolibriOS';
Из них только эти возвращают структуры, не помещающиеся в регистре:
Код:
Function  GetScreenWorkingArea: TRect; StdCall; External 'KolibriOS';
Function  GetLastDrawnBackgroundRect: TRect; StdCall; External 'KolibriOS';
Function  GetSkinMargins: TRect; StdCall; External 'KolibriOS';
для них способ с union работать не будет.

Сначала пример для Borland C++

Необходимые инструменты
Код:
BCC32    — компилятор Borland C++
LINK     — линкер от Microsoft
LD       — GNU линкер
OBJCOPY  — утилита для преобразования объектных файлов
Собирается он вот так(make.bat):
Код:
Set NAME=test
BCC32 -c %NAME%.c
LINK -edit %NAME%.obj
LD -T LScript.x %NAME%.obj -o %NAME%.kex -L %KolibriOS% -l KolibriOS
OBJCOPY -O binary -j .all %NAME%.kex
%KolibriOS% — директория, в которой находится KolibriOS.lib, которую можно взять из темы Delphi7 examples viewtopic.php?f=33&t=3469
LScript — линкер-скрипт для GNU-линкера LD

В результате получаем окно с выведенным в него текстом:
Вложение:
C+KolibriOS.lib.png
C+KolibriOS.lib.png [ 4.17 КБ | 623 просмотра ]
Вложение:
bcc32+KolibriOS.lib.7z [1.28 КБ]
29 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: C + KolibriOS.lib
СообщениеДобавлено: Чт фев 15, 2018 11:42 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4452
У тебя еще есть доступ к kolibri-n.org?
Буду благодарен если зальешь.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: C + KolibriOS.lib
СообщениеДобавлено: Пт фев 16, 2018 6:16 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1310
Leency, добавить пример можно.
Насчёт описания к нему — не знаю, может нужно что-то уточнить.
Хорошо бы кто-то ещё попробовал. (Например, ты пробовал BigSample viewtopic.php?f=2&t=3587 , и у тебя он собрался и работал.)

Другие компиляторы декорируют stdcall функции.

Например, Open Watcom по умолчанию декорирует stdcall функции, добавляя перед
именем функции знак подчёркивания и суффикс "@size" после имени _FunctionName@size.

Существует флаг компилятора
Код:
zz remove "@size" from __stdcall function names 
но вот флага, убирающего подчёркивание я не нашёл.

Можно решить вопрос добавлением такой прагмы в исходный код
Код:
#pragma aux __stdcall "*" 


В GCC наоборот, есть -fno-leading-underscore(убирает подчёркивание),
но флаг убирающий "@size" -kill-at работают только для dll. C dlltool аналогично.
С MSVC похоже тоже есть такая проблема.

Не хотелось бы изобретать велосипед, нужно всего лишь -kill-at и -fno-leading-underscore но чтобы работало для объектных файлов MSCOFF, а не только для dll.
Я, конечно, поискал немного в сети. Некоторые советуют сделать dll и вызывать функции оттуда, некоторые советуют сделать def-файл(это дополнительная работа, функций может быть 100500).
Но немало тех, кому нужно было прилинковать именно объектник, а dll и def-файл по каким-то причинам не подходят.

Ну в общем, я ещё немного поищу, если не найду, то придётся сделать для этого мини тулзу.
В принципе прогуляться по таблице символов — это не проблема, именно это и происходит в утилите CoffDump viewtopic.php?f=9&t=3577
Думаю, что это могло бы пригодиться даже не только здесь для KolibriOS.

Вот так я собирал с помощью Open Watcom
Код:
Set NAME=test
WCC386 -s %NAME%.c
LINK -edit %NAME%.obj
LD -T LScript.x %NAME%.obj -o %NAME%.kex -L %KolibriOS% -l KolibriOS
OBJCOPY -O binary -j .all %NAME%.kex
ключ -s для компилятора WCC386 означает "remove stack overflow checks".

LScript в данном случае немного другой, так как компилятор WCC386 создаёт секции с другими названиями(CONST, CONST2) и
функция Main имеет в конце знак подчёркивания Main_

Вложение:
WCC+KolibriOS.lib.7z [1.43 КБ]
24 скачивания


Вернуться к началу
 Заголовок сообщения: Re: C + KolibriOS.lib
СообщениеДобавлено: Пт фев 16, 2018 6:38 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4452
BigSample я когда-то пробовал и он у меня собирался.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: C + KolibriOS.lib
СообщениеДобавлено: Пн фев 26, 2018 7:05 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1310
Чтобы собрать пример на Си с помощью GCC/MSVC была создана крохотная утилита KillAt viewtopic.php?f=2&t=3673

Если использовать ключ -fno-leading-underscore для GCC, то
в линкер-скрипте LScript вместо "_Main" следует использовать "Main".
Потом вызвать KillAt без ключей, вот так:
Код:
GCC -fno-leading-underscore -c %NAME%.c -o %NAME%.obj
KillAt %NAME%.obj
Или можно запустить утилиту KillAt с ключом -L
Код:
GCC -c %NAME%.c -o %NAME%.obj
KillAt -L %NAME%.obj
для MSVC должно быть аналогично.


Вложения:
GCC+KolibriOS.lib.7z [1.44 КБ]
23 скачивания
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 5 сообщений ] 

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


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

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


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

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