333 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			333 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Alpha VMS external format of Libraries.
 | |
| 
 | |
|    Copyright 2010 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 */
 |