Коллеги задали мне следующий вопрос: "как разбить загрузочный модуль на образующие его части?". Думаю, не нужно объяснять, для чего это нужно. Я посмотрел на существующие решения - delink0 и delinki из CBTTAPE (файлы 090,134,135), все они имеют недостатки, и я подумал, а нельзя ли решить эту задачу стандартными средствами? И действительно, эта задача может быть решена только стандартными средствами без написания программ.
- program management binder (ex linkage editor) позволяет удалить программные секции (REPLACE). Если загрузочный модуль ABC состоит из секций A, B и С, то следующие упраляющие операторы разберут его на NCAL:
Код
REPLACE B REPLACE C INCLUDE LOADLIB(ABC) NAME A(R) REPLACE A REPLACE C INCLUDE LOADLIB(ABC) NAME B(R) REPLACE A REPLACE B INCLUDE LOADLIB(ABC) NAME C(R)
это решение применимо как к загрузочным модулям, так и к программным объектам, в отличие от нештатных программ DELINK0 и DELINKI, которыея не обрабатывает программные объекты.
- Чтобы автоматизировать процесс, необходимо получить список программных секций загрузочного модуля (программного объекта), использовав для этого все тот же program management binder (можно использовать также AMBLIST, но вывод AMBLIST труднее разбирать, так как этот вывод различается для program object и load module, что, по-моему, идиотизм).
- Получив список секций, необходимо сгенерировать последовательность управляющих операторов program management binder, приведенную выше. Это можно сделать, написав несложную процедуру, но такое решение недостойно настоящих джедаев) Нужную последовательность управляющих операторов можно построить сортировкой.