| /* 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 */ |