Как отключить RTL?

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

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

R1DDLE
новенький
Сообщения: 26
Зарегистрирован: 08.12.2009 18:00:24

Как отключить RTL?

Сообщение R1DDLE »

Всем доброго времени суток!

Подскажите пожалуйста, как в FreePascal отключить RTL? Хочу написать программу на чистом WinAPI безо всяких библиотек и получить на выходе exe'шник минимального размера (например 2Кб для GUI'шного HelloWorld).

P.S. Можно ли на FreePascal писать нечто вроде ядра ОС, т.е. на выходе получить бинарник типа COM в MS DOS, только для 32 или 64 бит? Как это делается?

За ранее СПАСИБО! :D

Добавлено спустя 13 минут 32 секунды:
Ну хоть ссылку дайте, где на русском почитать. Просто сам никак найти не могу.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

System отключить нельзя, можно только написать свой - более оптимальный. А со стандартным - минимальный размер будет ~40K.
R1DDLE
новенький
Сообщения: 26
Зарегистрирован: 08.12.2009 18:00:24

Сообщение R1DDLE »

Спасибо за ответ!
Можно ли перегрузить (переопределить) функции стандартного system, чтобы использовались мои функции из исходника, а стандартный system не линковался? Можно ссылку где посмотреть или коротенький пример?

Добавлено спустя 21 минуту 37 секунд:
Блин, хоть свой pascal пиши...
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Можно. Только если ты это будешь делать, надо бы очень хорошо понимать, что в стандартном System тебе нужно, а что нет. Ты это знаешь?
R1DDLE
новенький
Сообщения: 26
Зарегистрирован: 08.12.2009 18:00:24

Сообщение R1DDLE »

Что есть в system не знаю, но знаю, что мне нужно писать как обычно я на ассемблере пишу безо всяких библиотек, только ассемблер и API. Только всё это на паскале. Так легко сделать на С, но там нет встроенных синтаксических средств ООП, на С++ тоже можно, но сложнее. Синтаксис паскаля и его строгая типизация мне ближе к сердцу, чем Сишные. Я хочу, чтобы у меня в исполняемом файле оказалось только то, что я написал, а не то, что мне может понадобиться.

P.S. Раньше кодил на паскале и на delphi 7. На Delphi 7 как-то легко получился exe'шник в 4Кб на чистом API, но давно это было. А вот с Free никак не разберусь до конца, не помешал бы пример типа MessagBox(...) и параметры которые нужно компилятору и линкеру задать, чтобы получить хотя бы 4Кб.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Да не получится, говорю же тебе. Нужен low-weight system. Есть ли такие в природе - не знаю.
R1DDLE
новенький
Сообщения: 26
Зарегистрирован: 08.12.2009 18:00:24

Сообщение R1DDLE »

Понятно. Ладно, очень помогли разъяснить ситуацию. Огромное Вам спасибо и на этом.

Добавлено спустя 2 минуты 39 секунд:
Тему можно закрывать. Всем ещё раз СПАСИБО!
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Ну зачем закрывать. Мне тоже интересно, может кто нибудь поделится опытом оптимизации System.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

отключается RTL так:

создаём свой модуль:

Код: Выделить всё

unit
  System;
interface

implementation

end.

модуль компилируется так:

Код: Выделить всё

fpc -Us system.pas


в дальнейшем, при компиляции нужно цеплять именно этот модуль, а не стандартный RTL-a.

Без возможности использования своего RTL, fpc не удалось бы использовать на embedded системах или писать на нём дровишки
SII
новенький
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение SII »

А пробовал ли кто повлиять на стартовый код программы (ведь реальное исполнение начинается не с begin головного паскалевского файла), а также на код, генерящийся для обработки исключений и тому подобные вещи? Или для этого нужно модифицировать сам компилятор?
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

То, что можно написать свой RTL, никто не сомневается. Но очевидно, что если сделать пустой unit System - ничего работать не будет, все-таки какой-то функционал должен быть обязательно. Тут возможны 2 пути: "восходящий" - начать с пустого System и добавлять в него все что необходимо, и "нисходящий" - взять стандартный RTL и выкидывать из него все, что не нужно. Второй - более реалистичный. Из кандидатов на "выкидывание":
MemoryManager - можно заменить на упрощенный, (для win - через HeapAlloc/HeapFree)
Выкинуть WideStringManager/UnicodeStringManager/VariantManager - если не планируется ими пользоваться
Выкинуть ThreadManager - если не планируется многопоточность...
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

помимо system прийдется переписать и objpas для поддержки ООП в приложении к своему system. Когда-то эксперементировал.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Max Rusov писал(а):Тут возможны 2 пути: "восходящий" - начать с пустого System и добавлять в него все что необходимо, и "нисходящий" - взять стандартный RTL и выкидывать из него все, что не нужно.

Восходящий - полезнее :) Выкинуть RTL = написать свой RTL.

Ещё способ: для того чтобы "выкинуть RTL", нужно КАЖДЫЙ модуль программы компилировать с ключиком -Us и линковать ручками... (получается этакий язык Си с паскаль синтаксисом)
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

достаточно скомпилированные system и objpas положить рядом с проектом. IMHO
R1DDLE
новенький
Сообщения: 26
Зарегистрирован: 08.12.2009 18:00:24

Сообщение R1DDLE »

Max Rusov писал(а): (получается этакий язык Си с паскаль синтаксисом)

:D Самое интересное, что мне это и нужно. Низкий уровень Си, но с синтаксисом паскаля и ООП.

P.S. Простите за оффтоп, но случайно не подскажите, на микроконтроллерах соблюдается правило 1 байт = 8 бит?

Добавлено спустя 7 минут 27 секунд:
скалогрыз писал(а):отключается RTL так:

создаём свой модуль:

Код: Выделить всё

unit
  System;
interface

implementation

end.

модуль компилируется так:

Код: Выделить всё

fpc -Us system.pas


в дальнейшем, при компиляции нужно цеплять именно этот модуль, а не стандартный RTL-a.

Без возможности использования своего RTL, fpc не удалось бы использовать на embedded системах или писать на нём дровишки


Спасибо за подсказку! Я так и знал, что выход должен быть, пусть и корявый...

Сколько не искал, не нашёл ни одного ЯП с поддержкой ООП и без RTL. Более-менее легко отключается в C/C++, но Паскале-подобные языки для меня читабельнее. Может плохо искал? :shock:
Ответить