1 /* Alpha VMS external format of Libraries.
2 
3    Copyright (C) 2010-2016 Free Software Foundation, Inc.
4    Written by Tristan Gingold <gingold@adacore.com>, AdaCore.
5 
6    This file is part of BFD, the Binary File Descriptor library.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 #ifndef _VMS_LBR_H
24 #define _VMS_LBR_H
25 
26 /* Libray HeaDer.  */
27 
28 /* Magic numbers.  Should match the major version.  */
29 
30 #define LHD_SANEID_DCX 319232342
31 #define LHD_SANEID3 233579905
32 #define LHD_SANEID6 233579911
33 
34 /* Library type.  */
35 #define LBR__C_TYP_UNK    0	/* Unknown / unspecified.  */
36 #define LBR__C_TYP_OBJ    1	/* Vax object.  */
37 #define LBR__C_TYP_MLB    2	/* Macro.  */
38 #define LBR__C_TYP_HLP    3	/* Help.  */
39 #define LBR__C_TYP_TXT    4	/* Text.  */
40 #define LBR__C_TYP_SHSTB  5	/* Vax shareable image.  */
41 #define LBR__C_TYP_NCS    6	/* NCS.  */
42 #define LBR__C_TYP_EOBJ   7	/* Alpha object.  */
43 #define LBR__C_TYP_ESHSTB 8	/* Alpha shareable image.  */
44 #define LBR__C_TYP_IOBJ   9	/* IA-64 object.  */
45 #define LBR__C_TYP_ISHSTB 10	/* IA-64 shareable image.  */
46 
47 struct vms_lhd
48 {
49   /* Type of the library.  See above.  */
50   unsigned char type;
51 
52   /* Number of indexes.  Generally 1, 2 for object libraries.  */
53   unsigned char nindex;
54 
55   unsigned char fill_1[2];
56 
57   /* Sanity Id.  */
58   unsigned char sanity[4];
59 
60   /* Version.  */
61   unsigned char majorid[2];
62   unsigned char minorid[2];
63 
64   /* Tool name.  */
65   unsigned char lbrver[32];
66 
67   /* Create time.  */
68   unsigned char credat[8];
69 
70   /* Update time.  */
71   unsigned char updtim[8];
72 
73   /* Size of the MHD.  */
74   unsigned char mhdusz;
75 
76   unsigned char idxblkf[2];	/* Unused.  */
77   unsigned char fill_2;
78   unsigned char closerror[2];
79 
80   unsigned char spareword[2];
81 
82   /* First free block, and number of free blocks.  */
83   unsigned char freevbn[4];
84   unsigned char freeblk[4];
85 
86   unsigned char nextrfa[6];
87   unsigned char nextvbn[4];
88 
89   /* Free pre-allocated index block.  */
90   /* Number of free blocks.  */
91   unsigned char freidxblk[4];
92   /* VBN of a simply linked list of free blocks.  The list is terminated by a
93      nul VBN.  */
94   unsigned char freeidx[4];
95 
96   /* Highest pre-allocated index block and in use.  */
97   unsigned char hipreal[4];
98   unsigned char hiprusd[4];
99 
100   /* Number of index blocks in use.  */
101   unsigned char idxblks[4];
102 
103   /* Number of index entries.  */
104   unsigned char idxcnt[4];
105 
106   /* Number of modules entries.  */
107   unsigned char modcnt[4];
108 
109   unsigned char fill_3[2];
110 
111   /* Number of module headers.  */
112   unsigned char modhdrs[4];
113 
114   /* Overhead index pointers.  */
115   unsigned char idxovh[4];
116 
117   /* Update history records.  */
118   unsigned char maxluhrec[2];
119   unsigned char numluhrec[2];
120   unsigned char begluhrfa[6];
121   unsigned char endluhrfa[6];
122 
123   /* DCX map.  */
124   unsigned char dcxmapvbn[4];
125 
126   unsigned char fill_4[4 * 13];
127 };
128 
129 /* Known major ids.  */
130 #define LBR_MAJORID 3		/* Alpha libraries.  */
131 #define LBR_ELFMAJORID 6	/* Elf libraries (new index, new data).  */
132 
133 /* Offset of the first IDD.  */
134 #define LHD_IDXDESC 196
135 
136 /* InDex Description.  */
137 struct vms_idd
138 {
139   unsigned char flags[2];
140 
141   /* Max length of the key.  */
142   unsigned char keylen[2];
143 
144   /* First index block.  */
145   unsigned char vbn[4];
146 };
147 
148 /* IDD flags.  */
149 #define IDD__FLAGS_ASCII 1
150 #define IDD__FLAGS_LOCKED 2
151 #define IDD__FLAGS_VARLENIDX 4
152 #define IDD__FLAGS_NOCASECMP 8
153 #define IDD__FLAGS_NOCASENTR 16
154 #define IDD__FLAGS_UPCASNTRY 32
155 
156 #define IDD_LENGTH 8
157 
158 /* Index block.  */
159 #define INDEXDEF__LENGTH 512
160 #define INDEXDEF__BLKSIZ 500
161 
162 struct vms_indexdef
163 {
164   /* Number of bytes used.  */
165   unsigned char used[2];
166 
167   /* VBN of the parent.  */
168   unsigned char parent[4];
169 
170   unsigned char fill_1[6];
171 
172   /* The key field contains vms_idx/vms_elfidx structures, which are
173      simply a key (= a string) and a rfa.  */
174   unsigned char keys[INDEXDEF__BLKSIZ];
175 };
176 
177 /* An offset in a file.  */
178 
179 struct vms_rfa
180 {
181   /* Logical block number, 1 based.
182      0 means that the field is absent.  Block size is 512.  */
183   unsigned char vbn[4];
184 
185   /* Offset within the block.  */
186   unsigned char offset[2];
187 };
188 
189 /* Index keys.  For version 3.  */
190 
191 struct vms_idx
192 {
193   /* Offset from the start of the vbn, so minimum should be
194      DATA__DATA (ie 6).  */
195   struct vms_rfa rfa;
196 
197   unsigned char keylen;
198   /* The length of this field is in fact keylen.  */
199   unsigned char keyname[256];
200 };
201 
202 /* Index keys, for version 4 and later.  */
203 
204 struct vms_elfidx
205 {
206   struct vms_rfa rfa;
207 
208   unsigned char keylen[2];
209   unsigned char flags;
210   unsigned char keyname[256];
211 };
212 
213 /* Flags of elfidx.  */
214 
215 #define ELFIDX__WEAK 0x01	/* Weak symbol.  */
216 #define ELFIDX__GROUP 0x02	/* Group symbol.  */
217 #define ELFIDX__LISTRFA 0x04	/* RFA field points to an LHS.  */
218 #define ELFIDX__SYMESC 0x08	/* Long symbol.  */
219 
220 #define RFADEF__C_INDEX 0xffff
221 
222 /* List head structure.  That's what is pointed by rfa when LISTRFA flag
223    is set in elfidx.  */
224 
225 struct vms_lhs
226 {
227   struct vms_rfa ng_g_rfa;	/* Non-group global.  */
228   struct vms_rfa ng_wk_rfa;	/* Non-group weak.  */
229   struct vms_rfa g_g_rfa;	/* Group global.  */
230   struct vms_rfa g_wk_rfa;	/* Group weak.  */
231   unsigned char flags;
232 };
233 
234 /* List node structure.  Fields of LHS point to this structure.  */
235 
236 struct vms_lns
237 {
238   /* Next node in the list.  */
239   struct vms_rfa nxtrfa;
240 
241   /* Module associated with the key.  */
242   struct vms_rfa modrfa;
243 };
244 
245 struct vms_datadef
246 {
247   /* Number of records in this block.  */
248   unsigned char recs;
249   unsigned char fill_1;
250 
251   /* Next vbn.  */
252   unsigned char link[4];
253 
254   /* Data.  The first word is the record length, followed by record
255      data and a possible pad byte so that record length is always aligned.  */
256   unsigned char data[506];
257 };
258 #define DATA__LENGTH 512
259 #define DATA__DATA 6
260 
261 /* Key name block.  This is used for keys longer than 128 bytes.  */
262 
263 struct vms_kbn
264 {
265   /* Length of the key chunk.  */
266   unsigned char keylen[2];
267 
268   /* RFA of the next chunk.  */
269   struct vms_rfa rfa;
270 
271   /* Followed by the key chunk.  */
272 };
273 
274 /* Module header.  */
275 struct vms_mhd
276 {
277   /* Fixed part.  */
278   unsigned char lbrflag;
279   unsigned char id;
280   unsigned char fill_1[2];
281   unsigned char refcnt[4];
282   unsigned char datim[8];
283 
284   unsigned char objstat;
285   /* Ident or GSMATCH.  */
286   unsigned char objidlng;
287   unsigned char objid[31];
288 
289   unsigned char pad1[3];
290   unsigned char otherefcnt[4];
291   unsigned char modsize[4];
292   unsigned char pad2[4];
293 };
294 
295 #define MHD__C_MHDID 0xad	/* Value for id.  */
296 #define MHD__C_MHDLEN 16	/* Fixed part length.  */
297 #define MHD__C_USRDAT 16
298 
299 /* Flags for objstat.  */
300 #define MHD__M_SELSRC 0x1	/* Selective search.  */
301 #define MHD__M_OBJTIR 0x2
302 #define MHD__M_WKSYM  0x4
303 
304 struct vms_luh
305 {
306   unsigned char nxtluhblk[4];
307   unsigned char spare[2];
308   unsigned char data[506];
309 };
310 
311 struct vms_luhdef
312 {
313   unsigned char rechdr[2];
314   unsigned char reclen[2];
315 };
316 #define LUH__RECHDRLEN 4
317 #define LUH__RECHDRMRK 0xabba
318 #define LUH__DATAFLDLEN 506
319 
320 /* Entry in the history.  */
321 
322 struct vms_leh
323 {
324   unsigned char date[8];
325   unsigned char nbr_units[2];
326   unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced.  */
327   unsigned char idlen;
328   /* username
329      modules... */
330 };
331 
332 #endif /* _VMS_LBR_H */
333