Commit | Line | Data |
---|---|---|
fd63344e TG |
1 | /* Alpha VMS external format of Libraries. |
2 | ||
82704155 | 3 | Copyright (C) 2010-2019 Free Software Foundation, Inc. |
fd63344e TG |
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 | ||
8e57e1d1 TG |
28 | /* Magic numbers. Should match the major version. */ |
29 | ||
fd63344e TG |
30 | #define LHD_SANEID_DCX 319232342 |
31 | #define LHD_SANEID3 233579905 | |
8e57e1d1 | 32 | #define LHD_SANEID6 233579911 |
fd63344e TG |
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. */ | |
8e57e1d1 | 45 | #define LBR__C_TYP_ISHSTB 10 /* IA-64 shareable image. */ |
fd63344e TG |
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. */ | |
f3cf45d5 | 90 | /* Number of free blocks. */ |
fd63344e | 91 | unsigned char freidxblk[4]; |
f3cf45d5 TG |
92 | /* VBN of a simply linked list of free blocks. The list is terminated by a |
93 | nul VBN. */ | |
fd63344e TG |
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 | ||
8e57e1d1 TG |
129 | /* Known major ids. */ |
130 | #define LBR_MAJORID 3 /* Alpha libraries. */ | |
131 | #define LBR_ELFMAJORID 6 /* Elf libraries (new index, new data). */ | |
132 | ||
fd63344e TG |
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]; | |
8e57e1d1 | 171 | |
91a45c33 | 172 | /* The key field contains vms_idx/vms_elfidx structures, which are |
8e57e1d1 | 173 | simply a key (= a string) and a rfa. */ |
fd63344e TG |
174 | unsigned char keys[INDEXDEF__BLKSIZ]; |
175 | }; | |
176 | ||
8e57e1d1 TG |
177 | /* An offset in a file. */ |
178 | ||
179 | struct vms_rfa | |
fd63344e | 180 | { |
8e57e1d1 TG |
181 | /* Logical block number, 1 based. |
182 | 0 means that the field is absent. Block size is 512. */ | |
fd63344e | 183 | unsigned char vbn[4]; |
8e57e1d1 TG |
184 | |
185 | /* Offset within the block. */ | |
fd63344e | 186 | unsigned char offset[2]; |
8e57e1d1 TG |
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; | |
fd63344e TG |
196 | |
197 | unsigned char keylen; | |
8e57e1d1 | 198 | /* The length of this field is in fact keylen. */ |
fd63344e TG |
199 | unsigned char keyname[256]; |
200 | }; | |
201 | ||
8e57e1d1 | 202 | /* Index keys, for version 4 and later. */ |
fd63344e | 203 | |
8e57e1d1 TG |
204 | struct vms_elfidx |
205 | { | |
206 | struct vms_rfa rfa; | |
fd63344e TG |
207 | |
208 | unsigned char keylen[2]; | |
8e57e1d1 | 209 | unsigned char flags; |
fd63344e TG |
210 | unsigned char keyname[256]; |
211 | }; | |
212 | ||
8e57e1d1 TG |
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 | ||
fd63344e TG |
220 | #define RFADEF__C_INDEX 0xffff |
221 | ||
8e57e1d1 TG |
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 | ||
fd63344e TG |
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 | ||
13a985e1 TG |
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 | ||
fd63344e TG |
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]; | |
8e57e1d1 TG |
288 | |
289 | unsigned char pad1[3]; | |
290 | unsigned char otherefcnt[4]; | |
291 | unsigned char modsize[4]; | |
292 | unsigned char pad2[4]; | |
fd63344e TG |
293 | }; |
294 | ||
295 | #define MHD__C_MHDID 0xad /* Value for id. */ | |
8e57e1d1 | 296 | #define MHD__C_MHDLEN 16 /* Fixed part length. */ |
fd63344e | 297 | #define MHD__C_USRDAT 16 |
91a45c33 TG |
298 | |
299 | /* Flags for objstat. */ | |
300 | #define MHD__M_SELSRC 0x1 /* Selective search. */ | |
fd63344e TG |
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 */ |