UContext

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Андрей Парамонов
незнакомец
Сообщения: 3
Зарегистрирован: 20.11.2013 09:32:50

UContext

Сообщение Андрей Парамонов »

Привет всем!
Хочу использовать в программе функции, описанные в
http://pubs.opengroup.org/onlinepubs/00 ... ext.h.html
Я так понимаю, что это системные вызовы. Но ни в sysutils, ни в baseunix, ни в linux я готовой обёртки над ними не нашёл.
Как их подключить вручную?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

По названию функций контекстным поиском не нашли в юнитах FPC? Тогда брать документацию разработчиков и писать свой юнит-посредник:

Function НазваниеФункции(Параметры: типы как в FPC): ВозвращаемыйТип; stdcall; external 'НазваниеБиблиотеки';

Только внимательно смотрите, чтобы названия функций не совпадали с теми, которые в других подключаемых модулях уже существуют.
Андрей Парамонов
незнакомец
Сообщения: 3
Зарегистрирован: 20.11.2013 09:32:50

Сообщение Андрей Парамонов »

Function НазваниеФункции(Параметры: типы как в FPC): ВозвращаемыйТип; stdcall; external 'НазваниеБиблиотеки';

Ну названия функций и даже типы-как-в-fpc я положим знаю (в том документе это описано).
А вот что писать вместо НазваниеБиблиотеки?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Можно начать с 'libc.so'.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Очень сильно подозреваю, что там cdecl, а не stdcall...
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Sergei I. Gorelkin писал(а):Можно начать с 'libc.so'.

FreeBSD действительно говорить, что это libc.so, но в Linux'ах это может быть и не так. Отсюда вывод - пользуйтесь FreeBSD. :)

Иван Шихалев писал(а):Очень сильно подозреваю, что там cdecl, а не stdcall...

Вполне возможно, т.к. я этим делом никогда не интересовался. Правда я не совсем понял принципиального отличия этих вызовов - и то и другое берёт параметры с хвоста к носу, стек чистит вызывающая программа и всё идёт через стек.
Я что-то упустил?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Vadim писал(а):Я что-то упустил?

При stdcall стек чистит вызываемая подпрограмма.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Ага. Нашёл сейчас в исходниках юнита libc все объявления для UContext. Там действительно стоит cdecl.
Так что вручную можно не писать. :)
Андрей Парамонов
незнакомец
Сообщения: 3
Зарегистрирован: 20.11.2013 09:32:50

Сообщение Андрей Парамонов »

Да, но http://wiki.freepascal.org/libc_unit говорит:
FAQ: The libc unit is deprecated, and frozen in time for Kylix compatibility, and won't be ported to other architectures or operating systems.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

С libc имеется один маленький нюанс: содержимое заголовков может меняться с каждым обновлением. POSIX подразумевает, что система сборки умеет определять, где она находится, и какие функции доступны, в том числе путем парсинга заголовочных файлов. Поэтому для сборки, условно, 20 кБ исходников типично требуется пол-мегабайта скриптов.

FPC для Linux не интегрируется в эту систему, поэтому его RTL не содержит вызовов из libc и их добавление исключено.

Собственно, объявление ucontext из linux/sighndh.inc, скорее всего, было правильным на момент написания.
Ответить