0,0 → 1,332 |
/* 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 */ |