gudleifr писал(а):
Понятно, пришлось отказаться от статической подгрузки ресурсов и библиотек, поэтому некоторые варианты примеров опущены.
Вот вот. Я неделю обдумывал и дня четыре бился, чтобы реализовать более-менее красивое решение по статической компоновке в любой момент ресурсов к саморасширяемому фортовскому EXE. Наконец-то заработало !
Идея была такая. Секции PE-EXE файла оказывается могут перекрываться в EXE образе. Это в памяти они развертываются последовательно с выравниванием на Section Align. А в образе EXE они могут наслаиваться друг на друга.
Идея :
- Forth.exe от рождения имеет секцию .rsrc , которая указывает на свое смещение в EXE, совпадающее со смещением в EXE секции .text и имеет физ.длину 0 и вирт.длину Section Align. Такая секция никому не мешает. Ее как-бы и нет.
- Секция кода .text (т.е кодофайл) имеет физический размер тот, какой имеет, с выравниванием на File Align, а виртуальный в 1 мегабайт. Этот мегабайт зарезервирован под расширение Форта в процессе определения новых слов. Сразу после этого мегабайта в памяти автоматически располагается вторая секция .rsrc
- Форт сам прикомпоновывает к себе ресурсы из скомпилированных файлов .res . Делает он это так. Выравнивает HERE на File Align. Делает так, чтобы при следующем исполнении SAVE-SYSTEM был создан такой новый EXE, что начало секции .rsrc в EXE-файле указывало именно сюда. Подчитывает файл ресурсов начиная с HERE и перелопачивает его. За ALLOT-чивает русурс и он оказывается скомпилированным в кодофайл. Делает так, чтобы при следующем исполнении SAVE-SYSTEM был создан такой новый EXE, что длина секции .rsrc равнялась размеру за ALLOT-ченного ресурса.
Ну и HERE FENCE ! , чтобы ресурс нельзя было заFORGET-ить (или наоборот усложнить FORGET, чтобы можно было безболезненно FORGET-ить).
В итоге после SAVE-SYSTEM будет создан новый EXE с ресурсом. Причем ресурс при запуске такого EXE будет размещен в памяти аж дважды - как часть секции .text (т.е внутри кодофайла) и как содержимое отдельной секции ресурсов .rsrc
Короче говоря, в первом приближении такая вот феерическая шняга заработала.