LOADXREF - Load-Library and Load-Module Analyser

                   

OVERVIEW

The LOADXREF utility program reads load libraries to extract information about load-modules and the CSECTs they contain. This information, which consists of reports and tables, can be used to answer many questions regarding the load-modules, as well as their contents and structure, very helpful in identifying NORES modules in an Enterprise COBOL for z/OS V5.1 migration as candidates for recompilation:

In many application re-engineering projects, where large program inventories have to be processed (such as conversions, year-2000 impact analysis, Language Environment implementation, etc), LOADXREF helps see clear through the maze of your load libraries.

LOADXREF runs on MVS/ESA, OS/390 and z/OS, and can process multiple load libraries in the same run. By default, LOADXREF processes entire libraries but include/exclude member-name lists can be supplied to limit the scope of the analysis to specified programs.

The LOADXREF product is available world-wide from GSF Software. For licensing information, please contact us.

RUNNING LOADXREF         Top of the Page

LOADXREF runs as a batch program in the MVS, OS/390 and z/OS environment, using the sample JCL provided below.

PARM FIELD         Top of the Page

An optional PARM field may be specified to pass certain options to LOADXREF.
    PARM=(fromto,options) 
  1. fromto specifies a member name, a member name prefix, or a range of members to process, such as PARM=ABC123, or PARM='ABC*', or PARM='ABC:DEF99'.
  2. options is a two-character value which is specified as follows:
    1. A "1" in the first position indicates that duplicate members in the LOADLIB concatenation must be processed. By default, duplicate members are ignored.
    2. a "1" in the second position specifies that a header record should be written at the beginning of the CSECTXRF, PGMDATA and COBOPTS data sets.

INPUT LOAD LIBRARIES         Top of the Page

LOADXREF reads input load libraries using DDname LOADLIB, which may include up to 123 load libraries or extents. When LOADLIB consists of a concatenation of load libraries, programs are processed in member name alphanumeric sequence and duplicates are ignored. When PARM=1 is specified, programs are processed in library and member name sequence, including duplicates.

Program Libraries (PDSE) must be converted to PDS using the COPYMOD command of IEBCOPY before they can be processed by LOADXREF. As an alternative, a Program Library (PDSE) can be directly processed by the LINKMAP utility which provides a subset of LOADXREF's functions.

REPORTS         Top of the Page

The LOADXREF utility produces several reports and tables, several of which are optional. Each report is written to the corresponding DDname, if the DDname is present in the JCL. The reports are:

  1. SYSPRINT

    This report contains information about the execution of LOADXREF, as well as statistics by compiler signature in tabular format. The eleven columns of the tabular report contain the following data:

    1. the 2-character abbreviated compiler signature. Blanks indicate modules which do not have an associated signature. A question mark indicates an unknown signature.
    2. the 10-character compiler signature (Translator ID)
    3. the version/modification of the compiler
    4. the number of modules (CSECTS) produced by the corresponding compiler
    5. the number of unique module names found
    6. the compilation date of the least recently compiled module (oldest)
    7. the compilation date of the most recently compiled module (newest)
    8. the number of programs (load-modules) which contain at least one module compiled with the corresponding compiler
    9. the link-edit date of the oldest program
    10. the link-edit date of the most recent program
    11. the number of programs (load-modules) whose entry-point is that of a module compiled by the corresponding compiler
  2. LINKMAP (link-edit maps)

    This report displays the link-edit map, which contains the following:

    • for each load-module:
      • program's member name
      • program hash-code (8 hex digits)
      • link-edit date (YYYY-MM-DD)
      • length (hex)
      • RMODE, AMODE
      • link options (RENT, REUS)
      • dsname
    • for each CSECT in each load-module:
      • name
      • symbol type (CSECT, ENTRY)
      • offset (from start of load-module)
      • length (hex)
      • Rmode/Amode flags
      • Reference flags (ERef)
      • hash-code (8 hex digits)
      • compiler's abbreviated code
      • compiler's signature (e.g. 5740CB103)
      • compiler's version/modification (e.g. 0201)
      • compilation date (YYYY-MM-DD)
      • compilation option string (COBOL only)
      • user data
  3. LINKDATE

    This report is in cross-reference format. Dates appear in the left column; the other columns contain the programs that were link-edited on the same date.

  4. UNRESOLV

    This optional report contains a list of unresolved external references found in each load-module.

TABLES         Top of the Page

The CSECTXRF, PGMDATA and COBOPTS tables contain data extracted from the LINKMAP report. These tables are sequential output data sets which contain raw data in tabular format and can be best used in a reporting program, SORT, etc.

  1. CSECTXRF

    This table can be used to determine where a particular CSECT is used and compare the different versions of a given CSECT found in several load-modules. Each record contains the following:

    	pos 1-8		name of the load-module
    	pos 11-18	CSECT name
    	pos 20-27	CSECT hash-code
    	pos 29-34	compilation date (YYYY-MM-DD)
    	pos 36-37	compiler's abbreviated code
    	pos 39-42	reference flags (ERef)
    	pos 44-53	compilation option string (COBOL) 
  2. PGMDATA

    This table can be used to compare programs on different MVS systems. Each PGMDATA record contains the following:

    	pos 1-4		System-ID of the system on which LOADXREF ran
    	pos 6-13	name of the load-module
    	pos 15-22	program hash-code
    	pos 24-29	link-edit date (YYYY-MM-DD)
    	pos 31-36	length in hex
    	pos 38-43	entry-point address
    	pos 45-48	RMODE
    	pos 50-54	AMODE
    	pos 55-70	link-edit options 
  3. COBOPTS

    This table can be used to determine what compilation options were used to compile a particular COBOL module. Currently, this file only includes the option bit string, as stored by the compiler in the object code. The meaning of the option string is described in the appropriate compiler's documentation. However, LOADXREF checks for the NORES, CMPR2, DATA(24) and NODYNAM options of recent COBOL compilers and displays them as such, based on the setting of the corresponding flag.

Other Output Files         Top of the Page

  1. LINKDECK

    LOADXREF generates link-edit control statements on the LINKDECK DD for COBOL or PLI programs that need to be relink-edited for LE. This file is only produced when SCEELKED is present in the JCL. Sample output (PLI and OS/VS COBOL):

    	REPLACE PLISTART,PLIMAIN
    	INCLUDE SYSLIB(AOFECDT$)
    	SETOPT PARM(RENT,REUS)
    	ENTRY PLISTART
    	 NAME AOFECDT$(R)
    	REPLACE ILBOCOM0,ILBOSRV,ILBOMSG,ILBOBEG
    	INCLUDE SYSLIB(COB1CICS)
    	ENTRY COB1CICS
    	 NAME COB1CICS(R) 

HASH CODES         Top of the Page

LOADXREF calculates program (load-module) and module (CSECT) hash codes which appear in the contents of certain output files. These hash codes are calculated on the text data of the load-modules and CSECTs only and help determine if a load-module or CSECT is identical to another load-module or CSECT. The algorithm for calculating hash code ignores certain dates which are contained in the code generated by certain compilers to ensure their values are independent of the compilation date.

Other factors may affect the value of the hash code, such as the maintenance level of the compiler or the presence of dates in the code, dates which are undetected by LOADXREF.

ERef Field         Top of the Page

The ERef value, which appears in certain LOADXREF reports, is a CSECT-related composite element which indicates the number of references to the corresponding module. For instance, a value of 0002 indicates that the corresponding CSECT is referenced (via VCONs) by two other modules in the same load-module. A value of 0000 indicates that the CSECT is not referenced by another module and could probably be deleted from the load-module via a relink operation. The ERef value is always displayed in hexadecimal.

The first two bits the ERef value are used for flags.

  1. The first bit (X'8000') is set when the corresponding CSECT contains the program's primary entry-point, as specified in the load-module's directory entry.
  2. The second bit (X'4000') is set when a VCON references an LD symbol (ENTRY) in the corresponding module.

CUSTOMIZATION         Top of the Page

LOADXREF processes load-modules, extract information, and writes out a set of reports in which the extracted information is presented in various ways. Although LOADXREF does not offer options, customisation is possible as follows:

  1. processing can be restricted to certain load-modules using the SELDD and/or EXCLDD data sets, as shown in the example below. SELDD contains the names of the modules which are SELected for processing, whereas EXCLDDcontaines the names of the load-modules which are EXCLuded from processing.
  2. Most of the reports written out by LOADXREF are in tabular format and can be used as input to a user-written program or REXX exec.

SAMPLE JCL         Top of the Page

  //*
  //LOADXREF EXEC PGM=LOADXREF,PARM='*,01'
  //*
  //STEPLIB  DD DSN=<LOADXREF.Load.Library>,DISP=SHR
  //*
  //SYSPRINT DD SYSOUT=*       CONTROL REPORT
  //*
  //LINKMAP  DD SYSOUT=*       LINK-EDIT MAPS
  //*
  //LINKDATE DD SYSOUT=*       PROGRAM NAMES SORTED BY LINK-EDIT DATE
  //*
  //UNRESOLV DD SYSOUT=*       LIST OF UNRESOLVED EXTERNAL REFERENCES
  //*
  //CSECTXRF DD SYSOUT=*       CSECT/PROGRAM CROSS-REFERENCE
  //*
  //PGMDATA  DD SYSOUT=*       RECAP DATA BY PROGRAM
  //*
  //COBOPTS  DD SYSOUT=*       COBOL OPTIONS
  //*
  //LINKDECK DD SYSOUT=*       link-edit control statements
  //*
  //SCEELKED DD DSN=CEE.SCEELKED,DISP=SHR
  //*
  //*        Input Load Libraries (up to 123 Libraries/Extents)
  //*
  //LOADLIB  DD DSN=(your load Library #1),DISP=SHR
  //         DD DSN=(your load Library #2),DISP=SHR
  //*
  //SELDD    DD *              Member selection list (optional)
  KSR04T
  PAYR21F
  /* 
 

SAMPLE JCL for PDSE Process     Top of the Page

LOADXREF only works in PDSs, not in PDSEs, in this case you would have to copy the Program Objects/modules to a PDS in order to extract the information you need using a JCL stream like the following sample:

//IBMUSERA  JOB (9999),IEBGENER,                                        
//          CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID,                          
//          MSGLEVEL=(1,1),REGION=8M                                    
//**********************************************************************
//COPYTEMP EXEC PGM=IEBCOPY                                             
//SYSPRINT DD   SYSOUT=*                                                
//SYSUT1   DD   DISP=OLD,DSN=YOUR.PDSE.LIBRARY                          
//SYSUT2   DD   DSN=YOUR.TEMP.PDS,VOL=SER=VOLID,UNIT=SYSDA,             
//         SPACE=(TRK,(1,1,1)),                                         
//         DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920),                       
//         VOL=SER=VOLID,                                               
//         DISP=(NEW,CATLG)                                             
//SYSIN    DD   DUMMY                                                   
//*                                                                     
//LOADXREF EXEC PGM=LOADXREF                                            
//STEPLIB  DD DSN=<LOADXREF.Load.Library>,DISP=SHR                         
//SYSPRINT DD SYSOUT=*       CONTROL REPORT                             
//LINKMAP  DD SYSOUT=*       LINK-EDIT MAPS                             
//LINKDATE DD SYSOUT=*       PROGRAM NAMES SORTED BY LINK-EDIT DATE     
//UNRESOLV DD SYSOUT=*       LIST OF UNRESOLVED EXTERNAL REFERENCES     
//CSECTXRF DD SYSOUT=*       CSECT/PROGRAM CROSS-REFERENCE              
//PGMDATA  DD SYSOUT=*       RECAP DATA BY PROGRAM
//COBOPTS  DD SYSOUT=*       COBOL OPTIONS                   
//LINKDECK DD SYSOUT=*       LINK-EDIT CONTROL CARDS         
//SCEELKED DD DSN=CEE.SCEELKED,DISP=SHR                      
//SELDD    DD *              MEMBER SELECTION LIST (OPTIONAL)
MODULE1                                                      
MODULE2                                                      
//*        INPUT LIBRARIES (UP TO 123 LIBRARIES/EXTENTS)     
//LOADLIB   DD  DISP=(SHR,DELETE,DELETE),DSN=YOUR.TEMP.PDS                           
/* 

ABBREVIATED TRANSLATOR CODES         Top of the Page

Most compilers include their own "translator ID", or compiler signature, in the object code they generate. These signatures (e.g. 5740CB100 0204) are stored by the linkage-editor or binder into the IDR records of the load-module or program object.

LOADXREF converts each compiler signature to a 2-character code, referred to as the "abbreviated translator code". As not all compilers or assemblers provide a signature, LOADXREF can still recognize certain translators using other criteria when no signature is present for a given module (CSECT).

       Code	Translator name

	AE	S/360 OS ASSEMBLER (E)
	AF	S/360 OS ASSEMBLER (F)
	AG	WATERLOO ASSEMBLER (G)
	AL	S/360 OS ALGOL (F)
	A1	APL/360
	A1	APL2 V1
	A2	APL2 VERSION 2
	BA	VS BASIC
	C	C FOR SYSTEM/370 (MVS)
	C	C/370 COMPILER AND LIBRARY V2
	C	C/370 COMPILER V1 V2
	C	SAA AD/CYCLE C/370 V1 V2
	C	C/C++ OS/390
	C	C/C++ z/OS
	CA	OS FULL ANS COBOL V3
	CA	OS FULL ANS COBOL V4
	CA	S/360 OS FULL ANS COBOL V1 V2
	CE	S/360 OS COBOL (E)
	C1	VS COBOL FOR OS/VS (R2M2)
	C1	VS COBOL FOR OS/VS (R2M3)
	C2	VS COBOL II
	C3	COBOL/370 and COBOL for MVS (5688-197)
	C3	COBOL for OS/390 (5648-A25)
	C3	Enterprise COBOL (5655-G53)
	E+	EASYTRIEVE PLUS (EZPDRIVR)
	F?	FORTRAN IV (H EXTENDED PLUS)
	FC	OS FORTRAN CODE AND GO COMPILER
	FE	S/360 OS SYSTEM FORTRAN IV (E)
	FG	OS FORTRAN IV G1
	FH	OS FORTRAN IV H EXTENDED
	F2	VS FORTRAN V2 (COMP/LIB)
	F2	VS FORTRAN V2 (COMP/LIB/DEBUG)
	F3	VS FORTRAN R3
	HL	HIGH-LEVEL ASSEMBLER
	H1	ASSEMBLER H V1
	H2	ASSEMBLER H V2
	PA	VS PASCAL
	PF	S/360 OS PL/1 (F)
	PG	Visual Age PL/I
	PK	OS PL/I CHECKOUT COMPILER
	PV	PASCAL/VS
	PO	OS PL/I OPTIMIZING COMPILER
	P1	PL/I FOR MVS AND VM V1
	P2	OS PL/I V2
	P3	Enterprise PL/I V3
	RG	RPG II
	RG	S/360 OS RPG
	RX	REXX/370
	XF	OS/VS ASSEMBLER (XF) 

Search key-words: ibm mvs os/390 os390 z/os zos load-module analyse analyser analyze analyzer analysis analizer analiser identify identifying compile compiler tool translator data id cobol assembler pl/1 pl1 pl/i pli link-edit map csect list idr data esd cesd rld txt cross-reference crossreference xref crossref cross-ref determine module entry points extract display date load-library load-libraries listing load-module load-modules le language environment compilation options program library program object objects pds pdse pds/e binder linkage editor linkedit link edit lked properties attributes attr attrib rent reus amode a24 a31 aany amin rmode rany r24 search find compilation date time compiler signature product code codes idrdata load object module modules delink relink mainframe main-frame creation date created xref40