|  | /* Alpha VMS external format of Libraries. | 
|  |  | 
|  | Copyright (C) 2010-2025 Free Software Foundation, Inc. | 
|  | Written by Tristan Gingold <gingold@adacore.com>, AdaCore. | 
|  |  | 
|  | This file is part of BFD, the Binary File Descriptor library. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, write to the Free Software | 
|  | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
|  | MA 02110-1301, USA.  */ | 
|  |  | 
|  | #ifndef _VMS_LBR_H | 
|  | #define _VMS_LBR_H | 
|  |  | 
|  | /* Libray HeaDer.  */ | 
|  |  | 
|  | /* Magic numbers.  Should match the major version.  */ | 
|  |  | 
|  | #define LHD_SANEID_DCX 319232342 | 
|  | #define LHD_SANEID3 233579905 | 
|  | #define LHD_SANEID6 233579911 | 
|  |  | 
|  | /* Library type.  */ | 
|  | #define LBR__C_TYP_UNK    0	/* Unknown / unspecified.  */ | 
|  | #define LBR__C_TYP_OBJ    1	/* Vax object.  */ | 
|  | #define LBR__C_TYP_MLB    2	/* Macro.  */ | 
|  | #define LBR__C_TYP_HLP    3	/* Help.  */ | 
|  | #define LBR__C_TYP_TXT    4	/* Text.  */ | 
|  | #define LBR__C_TYP_SHSTB  5	/* Vax shareable image.  */ | 
|  | #define LBR__C_TYP_NCS    6	/* NCS.  */ | 
|  | #define LBR__C_TYP_EOBJ   7	/* Alpha object.  */ | 
|  | #define LBR__C_TYP_ESHSTB 8	/* Alpha shareable image.  */ | 
|  | #define LBR__C_TYP_IOBJ   9	/* IA-64 object.  */ | 
|  | #define LBR__C_TYP_ISHSTB 10	/* IA-64 shareable image.  */ | 
|  |  | 
|  | struct vms_lhd | 
|  | { | 
|  | /* Type of the library.  See above.  */ | 
|  | unsigned char type; | 
|  |  | 
|  | /* Number of indexes.  Generally 1, 2 for object libraries.  */ | 
|  | unsigned char nindex; | 
|  |  | 
|  | unsigned char fill_1[2]; | 
|  |  | 
|  | /* Sanity Id.  */ | 
|  | unsigned char sanity[4]; | 
|  |  | 
|  | /* Version.  */ | 
|  | unsigned char majorid[2]; | 
|  | unsigned char minorid[2]; | 
|  |  | 
|  | /* Tool name.  */ | 
|  | unsigned char lbrver[32]; | 
|  |  | 
|  | /* Create time.  */ | 
|  | unsigned char credat[8]; | 
|  |  | 
|  | /* Update time.  */ | 
|  | unsigned char updtim[8]; | 
|  |  | 
|  | /* Size of the MHD.  */ | 
|  | unsigned char mhdusz; | 
|  |  | 
|  | unsigned char idxblkf[2];	/* Unused.  */ | 
|  | unsigned char fill_2; | 
|  | unsigned char closerror[2]; | 
|  |  | 
|  | unsigned char spareword[2]; | 
|  |  | 
|  | /* First free block, and number of free blocks.  */ | 
|  | unsigned char freevbn[4]; | 
|  | unsigned char freeblk[4]; | 
|  |  | 
|  | unsigned char nextrfa[6]; | 
|  | unsigned char nextvbn[4]; | 
|  |  | 
|  | /* Free pre-allocated index block.  */ | 
|  | /* Number of free blocks.  */ | 
|  | unsigned char freidxblk[4]; | 
|  | /* VBN of a simply linked list of free blocks.  The list is terminated by a | 
|  | nul VBN.  */ | 
|  | unsigned char freeidx[4]; | 
|  |  | 
|  | /* Highest pre-allocated index block and in use.  */ | 
|  | unsigned char hipreal[4]; | 
|  | unsigned char hiprusd[4]; | 
|  |  | 
|  | /* Number of index blocks in use.  */ | 
|  | unsigned char idxblks[4]; | 
|  |  | 
|  | /* Number of index entries.  */ | 
|  | unsigned char idxcnt[4]; | 
|  |  | 
|  | /* Number of modules entries.  */ | 
|  | unsigned char modcnt[4]; | 
|  |  | 
|  | unsigned char fill_3[2]; | 
|  |  | 
|  | /* Number of module headers.  */ | 
|  | unsigned char modhdrs[4]; | 
|  |  | 
|  | /* Overhead index pointers.  */ | 
|  | unsigned char idxovh[4]; | 
|  |  | 
|  | /* Update history records.  */ | 
|  | unsigned char maxluhrec[2]; | 
|  | unsigned char numluhrec[2]; | 
|  | unsigned char begluhrfa[6]; | 
|  | unsigned char endluhrfa[6]; | 
|  |  | 
|  | /* DCX map.  */ | 
|  | unsigned char dcxmapvbn[4]; | 
|  |  | 
|  | unsigned char fill_4[4 * 13]; | 
|  | }; | 
|  |  | 
|  | /* Known major ids.  */ | 
|  | #define LBR_MAJORID 3		/* Alpha libraries.  */ | 
|  | #define LBR_ELFMAJORID 6	/* Elf libraries (new index, new data).  */ | 
|  |  | 
|  | /* Offset of the first IDD.  */ | 
|  | #define LHD_IDXDESC 196 | 
|  |  | 
|  | /* InDex Description.  */ | 
|  | struct vms_idd | 
|  | { | 
|  | unsigned char flags[2]; | 
|  |  | 
|  | /* Max length of the key.  */ | 
|  | unsigned char keylen[2]; | 
|  |  | 
|  | /* First index block.  */ | 
|  | unsigned char vbn[4]; | 
|  | }; | 
|  |  | 
|  | /* IDD flags.  */ | 
|  | #define IDD__FLAGS_ASCII 1 | 
|  | #define IDD__FLAGS_LOCKED 2 | 
|  | #define IDD__FLAGS_VARLENIDX 4 | 
|  | #define IDD__FLAGS_NOCASECMP 8 | 
|  | #define IDD__FLAGS_NOCASENTR 16 | 
|  | #define IDD__FLAGS_UPCASNTRY 32 | 
|  |  | 
|  | #define IDD_LENGTH 8 | 
|  |  | 
|  | /* Index block.  */ | 
|  | #define INDEXDEF__LENGTH 512 | 
|  | #define INDEXDEF__BLKSIZ 500 | 
|  |  | 
|  | struct vms_indexdef | 
|  | { | 
|  | /* Number of bytes used.  */ | 
|  | unsigned char used[2]; | 
|  |  | 
|  | /* VBN of the parent.  */ | 
|  | unsigned char parent[4]; | 
|  |  | 
|  | unsigned char fill_1[6]; | 
|  |  | 
|  | /* The key field contains vms_idx/vms_elfidx structures, which are | 
|  | simply a key (= a string) and a rfa.  */ | 
|  | unsigned char keys[INDEXDEF__BLKSIZ]; | 
|  | }; | 
|  |  | 
|  | /* An offset in a file.  */ | 
|  |  | 
|  | struct vms_rfa | 
|  | { | 
|  | /* Logical block number, 1 based. | 
|  | 0 means that the field is absent.  Block size is 512.  */ | 
|  | unsigned char vbn[4]; | 
|  |  | 
|  | /* Offset within the block.  */ | 
|  | unsigned char offset[2]; | 
|  | }; | 
|  |  | 
|  | /* Index keys.  For version 3.  */ | 
|  |  | 
|  | struct vms_idx | 
|  | { | 
|  | /* Offset from the start of the vbn, so minimum should be | 
|  | DATA__DATA (ie 6).  */ | 
|  | struct vms_rfa rfa; | 
|  |  | 
|  | unsigned char keylen; | 
|  | /* The length of this field is in fact keylen.  */ | 
|  | unsigned char keyname[256]; | 
|  | }; | 
|  |  | 
|  | /* Index keys, for version 4 and later.  */ | 
|  |  | 
|  | struct vms_elfidx | 
|  | { | 
|  | struct vms_rfa rfa; | 
|  |  | 
|  | unsigned char keylen[2]; | 
|  | unsigned char flags; | 
|  | unsigned char keyname[256]; | 
|  | }; | 
|  |  | 
|  | /* Flags of elfidx.  */ | 
|  |  | 
|  | #define ELFIDX__WEAK 0x01	/* Weak symbol.  */ | 
|  | #define ELFIDX__GROUP 0x02	/* Group symbol.  */ | 
|  | #define ELFIDX__LISTRFA 0x04	/* RFA field points to an LHS.  */ | 
|  | #define ELFIDX__SYMESC 0x08	/* Long symbol.  */ | 
|  |  | 
|  | #define RFADEF__C_INDEX 0xffff | 
|  |  | 
|  | /* List head structure.  That's what is pointed by rfa when LISTRFA flag | 
|  | is set in elfidx.  */ | 
|  |  | 
|  | struct vms_lhs | 
|  | { | 
|  | struct vms_rfa ng_g_rfa;	/* Non-group global.  */ | 
|  | struct vms_rfa ng_wk_rfa;	/* Non-group weak.  */ | 
|  | struct vms_rfa g_g_rfa;	/* Group global.  */ | 
|  | struct vms_rfa g_wk_rfa;	/* Group weak.  */ | 
|  | unsigned char flags; | 
|  | }; | 
|  |  | 
|  | /* List node structure.  Fields of LHS point to this structure.  */ | 
|  |  | 
|  | struct vms_lns | 
|  | { | 
|  | /* Next node in the list.  */ | 
|  | struct vms_rfa nxtrfa; | 
|  |  | 
|  | /* Module associated with the key.  */ | 
|  | struct vms_rfa modrfa; | 
|  | }; | 
|  |  | 
|  | struct vms_datadef | 
|  | { | 
|  | /* Number of records in this block.  */ | 
|  | unsigned char recs; | 
|  | unsigned char fill_1; | 
|  |  | 
|  | /* Next vbn.  */ | 
|  | unsigned char link[4]; | 
|  |  | 
|  | /* Data.  The first word is the record length, followed by record | 
|  | data and a possible pad byte so that record length is always aligned.  */ | 
|  | unsigned char data[506]; | 
|  | }; | 
|  | #define DATA__LENGTH 512 | 
|  | #define DATA__DATA 6 | 
|  |  | 
|  | /* Key name block.  This is used for keys longer than 128 bytes.  */ | 
|  |  | 
|  | struct vms_kbn | 
|  | { | 
|  | /* Length of the key chunk.  */ | 
|  | unsigned char keylen[2]; | 
|  |  | 
|  | /* RFA of the next chunk.  */ | 
|  | struct vms_rfa rfa; | 
|  |  | 
|  | /* Followed by the key chunk.  */ | 
|  | }; | 
|  |  | 
|  | /* Module header.  */ | 
|  | struct vms_mhd | 
|  | { | 
|  | /* Fixed part.  */ | 
|  | unsigned char lbrflag; | 
|  | unsigned char id; | 
|  | unsigned char fill_1[2]; | 
|  | unsigned char refcnt[4]; | 
|  | unsigned char datim[8]; | 
|  |  | 
|  | unsigned char objstat; | 
|  | /* Ident or GSMATCH.  */ | 
|  | unsigned char objidlng; | 
|  | unsigned char objid[31]; | 
|  |  | 
|  | unsigned char pad1[3]; | 
|  | unsigned char otherefcnt[4]; | 
|  | unsigned char modsize[4]; | 
|  | unsigned char pad2[4]; | 
|  | }; | 
|  |  | 
|  | #define MHD__C_MHDID 0xad	/* Value for id.  */ | 
|  | #define MHD__C_MHDLEN 16	/* Fixed part length.  */ | 
|  | #define MHD__C_USRDAT 16 | 
|  |  | 
|  | /* Flags for objstat.  */ | 
|  | #define MHD__M_SELSRC 0x1	/* Selective search.  */ | 
|  | #define MHD__M_OBJTIR 0x2 | 
|  | #define MHD__M_WKSYM  0x4 | 
|  |  | 
|  | struct vms_luh | 
|  | { | 
|  | unsigned char nxtluhblk[4]; | 
|  | unsigned char spare[2]; | 
|  | unsigned char data[506]; | 
|  | }; | 
|  |  | 
|  | struct vms_luhdef | 
|  | { | 
|  | unsigned char rechdr[2]; | 
|  | unsigned char reclen[2]; | 
|  | }; | 
|  | #define LUH__RECHDRLEN 4 | 
|  | #define LUH__RECHDRMRK 0xabba | 
|  | #define LUH__DATAFLDLEN 506 | 
|  |  | 
|  | /* Entry in the history.  */ | 
|  |  | 
|  | struct vms_leh | 
|  | { | 
|  | unsigned char date[8]; | 
|  | unsigned char nbr_units[2]; | 
|  | unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced.  */ | 
|  | unsigned char idlen; | 
|  | /* username | 
|  | modules... */ | 
|  | }; | 
|  |  | 
|  | #endif /* _VMS_LBR_H */ |