| /* Alpha VMS external format of Libraries. |
| |
| Copyright (C) 2010-2021 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 */ |