As of BLSSERV V2.4A, several or all objects of a library can be loaded with a single call of the BIND macro. The result is a so-called list name unit, and multiple DBL calls whenloading a symbol list of the same load unit are prevented.
For loading into a list name unit the specifications INTVERS=SRVxxx
(xxx >=
004) and SYMBOL=*ALL
or SYMBOL=name
are required, the last character of name
being the wildcard symbol “*”. For details, see the BIND macro in the „Executive Macros“ manual [7].
Loading into a list name unit proceeds as follows:
Depending on the SYMBOL operand, a list of the objects to be loaded from the main library is created:
With
SYMBOL=*ALL
, first the highest versions of all elements of type L are entered in this list. Then the highest versions of all elements of type R are entered in the list, but only if an element of type L with the same name is not already contained in the list.If the SYMBOL operand is specified with a partially qualified name, the list is generated in the same way. However, only those elements are taken into account which match the partially qualified name.
The name list contains only names of PLAM library elements (i.e.
SYMTYP=MODULE). No CSECTs or ENTRYs with the same name are searched for in the library.
The following requirements apply here:
The main library must be a PLAM library.
Alternative libraries are only used for the autolink process, not for generating the name list.
LLMs with user-defined slices cannot be loaded into a list name unit. The load operation is aborted with RC=X'0C400430'.
The VERS and VERS@ operands are ignored when loading into a list name unit.
No names in the code already loaded are searched for before loading as these names are element names and not symbol names. However, only symbol names are stored in the loaded code.
All objects in the list are loaded in the same unit (list name unit) and in the contexdefined by UNIT or UNIT@ and LNKCTX or LNKCTX@. If no name is specified for the load unit, the name of the first object in the list is assumed as the name for the load unit.
The version of a list name unit is determined by the PGMVERS/PGMVERS@ operand. In the event of
PGMVERS=*STD
the PLAM version of the first object loaded is used as the version of the load unit.In the DBL map, EXPLICIT is specified as the linkage method for each object contained in the list.
Both the returned start addess (SYMBLAD operand with BIND) and the returned AMODE correspond to those of the first object loaded into the list name unit. When
BRANCH=YES
is specified, control is also transferred to the start address of the first object loaded in the list name unit.When loading into a list name unit, external references are only resolved when all objects of the list name unit have been loaded. The autonlink function is also only executed at this point. This enhances performance when resolving external references: A symbol which is referenced in multiple modules of the list need only be searched for once and not after each individual object has been loaded.
Example
Three objects of a list are to be loaded:
Module M1 with external references E1 and E2
Module M2 with external references E2 and E3
Module M3 with ENTRY E1 and external reference E2
Load operation when loading without list name unit:
Load M1
Resolve external references E1 and E2 and autolink (E1 found in M3)
Load M3 (because of autolink)
Resolve external reference E2 and autolink (no effect)
Load M2
Resolve external references E2 and E3 and autolink (no effect)
The process of address resolution is executed three times for external reference E2.
Load operation when loading into list name unit:
Load M1
Load M2
Load M3
External references E1, E2 and E3 and autolink (no effect)
The process of address resolution is executed only once for external reference E2.
Loading into a list name unit is thus more efficient, but can influence the load sequence (without a list name unit module M3 is loaded before M2).
When loading from PUBLIC/PRIVATE LLMs into list name units, the public part is loaded only after all objects of the list name unit have been loaded.
The following restrictions apply for unloading list name units:
A list name unit can only be unloaded in full. It is not possible to unload part or just a single module from a list name unit.
If errors occur for one of the objects in the list, all modules of the list which have already been loaded (= current status of the list name unit) are unloaded. This corresponds to the current behavior when loading a unit.
Characteristics of a list name unit
The characteristics of a list name unit are summarized below:
The input objects are only searched for in the main library (alternative libraries are only used for autolink).
Input objects are always loaded (no search in the memory prior to loading).
External references are resolved and the autolink function executed only when all objects of the list name unit have been loaded.
A module of a list name unit cannot be unloaded independently of the list name unit.