Перекомпиляция RTL - если возможно, то как?
У меня есть такая потребность в некоторых экспериментах по модификации подбрюшья библиотеки времени выполнения Delphi (RTL), system.pas
и подобных... Возможно или нет?
Мне очень нравятся такие проблемы, как "да", но вам нужно предоставить пользовательские файлы .obj для какого-либо ассемблерного волшебства, потому что они никогда не распространялись с официальным источником Delphi ". Хорошо со мной, я просто хочу знать.
Я хочу сделать этот эксперимент с Delphi 7, но внутренняя информация о любой другой версии в порядке. Это один из преимуществ быть с компанией, которая работала с Delphi с каменного века.
(Я всегда думал, что это один из тех вопросов RTFM, при этом ответ звучит "НЕТ!", но по какой-то причине Google не подтвердит его.)
Ответы
Ответ 1
Вы можете перекомпилировать RTL как любое другое устройство.
Для System.pas вы должны использовать компилятор командной строки.
Например, здесь приведено рабочее содержимое командного файла (есть некоторые неправильно документированные ключи командной строки):
del *.dcu /s
"c:\program files\borland\delphi7\bin\dcc32.exe" -O+ -Q -M -Y -Z -$D+ System.pas
Это перекомпилирует System.pas и SysInit.pas(оба файла RTL самого низкого уровня).
Но для того, чтобы использовать ваши восстановленные файлы dcu, вам нужно поместить папку, содержащую обновленные файлы dcu, в первую позицию вашей среды IDE: например, в Delphi 7 это Option/Environment Options/Library, затем установите вашу папку FIRST в поле "Libary path" и "Browsing path".
И, возможно, стоит удалить исходные файлы .dcu в каталоге установки Delphi.
Но убедитесь, что вы не измените часть "интерфейса" устройства, иначе у вас возникнут проблемы с компиляцией с другими не измененными модулями RTL (или сторонних компонентов). Вы можете изменить часть "реализация", применить исправления или переписать какую-либо часть для скорости или таковой, но не меняйте "интерфейс", чтобы избежать какой-либо ошибки связывания.
Всегда делайте резервную копию исходных файлов .pas и .dcu, которые вы меняете. И неплохо сделать какой-то автоматизированный тест компиляции, чтобы вы могли быть уверены, что ваши модификации RTL не добавят регрессии.
Мы сделали такую рекомпиляцию RTL для нашей расширенной библиотеки времени выполнения для лучшей скорости низкоуровневых функций RTL (в основном System.pas и SysUtils.pas). Предназначен для Delphi 7 и 2007. Для более поздней версии Delphi вы все равно можете использовать тот же принцип.
Ответ 2
Вы можете перекомпилировать RTL только из командной строки. В исходном каталоге RTL вашей установки должен быть makefile. Он предназначен для использования с утилитой командной строки make.exe, которая должна находиться в папке "bin" вашей установки. Я бы рекомендовал вам скопировать соответствующие источники в отдельное место для экспериментов. Я должен предупредить вас, что системный блок тесно связан с компилятором, который ожидает, что многие функции будут иметь конкретное имя и будут иметь определенные списки параметров, если они даже объявлены. Многие функции "helper" RTL не имеют формально объявленных параметров, но ожидают, что параметры будут переданы определенным образом.
Еще одна осторожность - это изменение деклараций интерфейса определенных классов, функций или типов. Это может привести к серьезной несовместимости с существующими файлами и компонентами DCU. По этой причине вы должны быть очень осторожны при смешивании файлов DCU с включенными RTL или сторонними компонентами с вашими измененными версиями. Я бы посоветовал вам начать с того, что изменил только раздел реализации, прежде чем впасть в минные поля интерфейса, нарушающие изменения.