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