Mit dem BINDER können Objektmodule und LLMs zu einem LLM gebunden und als Element vom Typ L in einer PLAM-Bibliothek abgespeichert werden. Der BINDER ist ausführlich im Handbuch „BINDER“ [14] beschrieben.
Module, die im Modus C++ V3, C++ 2017 bzw. C++ 2020 erzeugt wurden, können nicht durch direkten Aufruf des BINDER, sondern nur mittels der Compiler-Anweisung BIND gebunden werden (siehe auch Abschnitt „Einschränkung beim Binden von C++-Programmen“).
Steueranweisungen für den BINDER (Auswahl)
/START-BINDER ———————————————————————————————————————————————————— (1)
//START-LLM-CREATION INT-NAME=
name ——————————————————————————————— (2)
//INCLUDE-MODULES -
// MOD-CONTAINER=*LIB(LIB=
bibliothek ,ELEM={
mainmod / *ALL } ————— (3)
[//INCLUDE-MODULES MOD-CONTAINER=*LIB(LIB=..., ELEM=...)] ———————— (4)
[//INCLUDE-MODULES -
// MOD-CONTAINER=*LIB(LIB=$.SYSLNK.CRTE.POSIX,ELEM=*ALL)] ————— (5)
[//RESOLVE-BY-AUTOLINK LIB=..., [SYMBOL-NAME=
externverweis ]] ——————— (6)
[//RESOLVE-BY-AUTOLINK LIB=
{([$.SYSLNK.CRTE.CFCPP,$.SYSLNK.CRTE.CPP,]$.SYSLNK.CRTE) /
([$.SYSLNK.CRTE.CFCPP,$.SYSLNK.CRTE.CPP,]$.SYSLNK.CRTE.PARTIAL-BIND)]}(7)
[//MODIFY-SYMBOL-VISIBILITY ..., VISIBLE=*NO] ———————————————————— (8)
//SAVE-LLM MOD-CONTAINER=*LIB(LIB=
bibliothek , ELEM=
element ) ———————— (9)
//END ———————————————————————————————————————————————————————————— (10)
(1) | Der BINDER wird aufgerufen. |
(2) | Diese Anweisung erzeugt ein neues LLM im Arbeitsbereich mit dem internen Namen name. Das erzeugte LLM wird mit der Anweisung SAVE-LLM (siehe 9) als Element vom Typ L in einer PLAM-Bibliothek gespeichert. |
(3) | mainmod ist der Name des LLM, das die |
(4) | Mit weiteren INCLUDE-MODULE-Anweisungen können zusätzliche Module aus verschiedenen Bibliotheken eingebunden werden. |
(5) | Die Bibliothek SYSLNK.CRTE.POSIX muss immer eingebunden werden, wenn POSIX-Bibliotheksfunktionen benutzt werden. Da diese „Bindeschalter“-Bibliothek vorrangig vor dem C-Laufzeitsystem eingebunden werden muss, sollte zum Einbinden generell die INCLUDE-MODULES-Anweisung verwendet werden. |
(6) | Mit RESOLVE-BY-AUTOLINK-Anweisungen werden dem BINDER die Externverweise (= Modulnamen) und die entsprechenden Bibliotheken bzw. nur die Bibliotheken mitgeteilt, die mit dem Autolink-Verfahren nach bisher unbefriedigten Externverweisen durchsucht werden sollen. RESOLVE-BY-AUTOLINK-Anweisungen für benutzereigene Bibliotheken/Module sollten generell vor denjenigen für die Laufzeitbibliotheken (siehe 7) angegeben werden. |
(7) | Die jeweils einzubindenden CRTE-Laufzeitbibliotheken werden in einer Liste angegeben. Bei einem RESOLVE auf die Bibliothek SYSLNK.CRTE werden alle vom Programm benötigten Module des C-Laufzeitsystems fest eingebunden. Bei einem RESOLVE auf die Bibliothek SYSLNK.CRTE.PARTIAL-BIND wird an Stelle des C-Laufzeitsystems ein Verbindungsmodul eingebunden, das alle Externverweise auf das C-Laufzeitsystem befriedigt. Das C-Laufzeitsystem selbst wird zum Ablaufzeitpunkt dynamisch nachgeladen. Das fertig gebundene Modul benötigt deutlich weniger Plattenspeicherplatz als beim statischen Einbinden der C-Laufzeitmodule aus der Bibliothek SYSLNK.CRTE. Außerdem wird die Ladezeit beschleunigt. Wenn keine RESOLVE-BY-AUTOLINK-Anweisung angegeben wird, bleiben die Externverweise auf die Laufzeitsysteme offen. Die Laufzeitmodule werden dann zur Ablaufzeit dynamisch gebunden und geladen (siehe Abschnitt „Dynamisch Binden und Laden mit dem DBL“). |
(8) | Mit der MODIFY-SYMBOL-VISIBILITY-Anweisung können externe Symbole für weitere Binderläufe maskiert werden. Standardmäßig bleiben die Symbole sichtbar. Siehe auch „Maskierung von Symbolen“. |
(9) | Diese Anweisung speichert das aktuelle LLM, das mit START-LLM-CREATION erzeugt wurde, als Element vom Typ L in eine PLAM-Bibliothek. |
(10) | Mit der END-Anweisung wird der BINDER-Lauf beendet. |
Bei den Anweisungen INCLUDE-MODULES und RESOLVE-BY-AUTOLINK kann an Stelle des Bibliotheksnamens (LIB=bibliothek) auch LIB=*BLSLINK angegeben werden. In diesem Fall müssen die zu durchsuchenden Bibliotheken mit dem Linknamen BLSLIBnn (00 <= nn <= 99) zugewiesen werden. Dies geschieht vor Aufruf des BINDERS mit dem ADD-FILE-LINK-Kommando, z.B.:
/ADD-FILE-LINK LINK-NAME=BLSLIB01,FILE-NAME=PLAM.USER1 /ADD-FILE-LINK LINK-NAME=BLSLIB02,FILE-NAME=PLAM.USER2 |
Ein mit dem BINDER erzeugtes LLM kann - sofern alle Externverweise befriedigt sind - mit dem DBL ohne Zuweisung alternativer Bibliotheken geladen und gestartet werden:
START-EXECUTABLE-PROGRAM *LIBRARY-ELEMENT(LIB=
bibliothek ,ELEM=
modul )
Maskierung von Symbolen
Beim Binden mit dem BINDER werden Symbole (CSECTs, ENTRYs) standardmäßig nicht maskiert und bleiben für spätere Bindeläufe mit dem BINDER oder DBL sichtbar.
Beim dynamischen Binden mit dem DBL hat dies u.a. folgende Auswirkungen:
Wenn in einer PLAM-Bibliothek sowohl vom Compiler generierte Einzelmodule als auch LLMs mit eingebundenem Laufzeitsystem stehen, werden beim dynamischen Binden der Einzelmodule die Externverweise auf das Laufzeitsystem aus irgendeinem vorgebundenen Modul befriedigt und nicht aus der Laufzeitbibliothek. In diesem Fall erhält man diverse „DUPLICATES“-Warnungen vom DBL. Auf Grund des Autolink-Mechanismus wird zuerst die Bibliothek durchsucht, in der das Einzelmodul steht und erst anschließend die mit den Linknamen BLSLIBnn zugewiesenen Laufzeitbibliotheken.
Um sicherzustellen, dass beim Binden die Externverweise immer aus der aktuellen Laufzeitbibliothek und nicht aus einem beliebigen Modul befriedigt werden, müssen
entweder Einzelmodule und vorgebundene Module in unterschiedlichen Bibliotheken gehalten werden
oder beim Binden mit dem BINDER die Symbole mit der Anweisung MODIFY-SYMBOL-VISIBILITY maskiert werden.