Commit | Line | Data |
---|---|---|
fd63344e TG |
1 | /* Alpha VMS external format of Libraries. |
2 | ||
3 | Copyright 2010 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 | ||
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. */ | |
90 | unsigned char freidxblk[4]; | |
91 | unsigned char freeidx[4]; | |
92 | ||
93 | /* Highest pre-allocated index block and in use. */ | |
94 | unsigned char hipreal[4]; | |
95 | unsigned char hiprusd[4]; | |
96 | ||
97 | /* Number of index blocks in use. */ | |
98 | unsigned char idxblks[4]; | |
99 | ||
100 | /* Number of index entries. */ | |
101 | unsigned char idxcnt[4]; | |
102 | ||
103 | /* Number of modules entries. */ | |
104 | unsigned char modcnt[4]; | |
105 | ||
106 | unsigned char fill_3[2]; | |
107 | ||
108 | /* Number of module headers. */ | |
109 | unsigned char modhdrs[4]; | |
110 | ||
111 | /* Overhead index pointers. */ | |
112 | unsigned char idxovh[4]; | |
113 | ||
114 | /* Update history records. */ | |
115 | unsigned char maxluhrec[2]; | |
116 | unsigned char numluhrec[2]; | |
117 | unsigned char begluhrfa[6]; | |
118 | unsigned char endluhrfa[6]; | |
119 | ||
120 | /* DCX map. */ | |
121 | unsigned char dcxmapvbn[4]; | |
122 | ||
123 | unsigned char fill_4[4 * 13]; | |
124 | }; | |
125 | ||
8e57e1d1 TG |
126 | /* Known major ids. */ |
127 | #define LBR_MAJORID 3 /* Alpha libraries. */ | |
128 | #define LBR_ELFMAJORID 6 /* Elf libraries (new index, new data). */ | |
129 | ||
fd63344e TG |
130 | /* Offset of the first IDD. */ |
131 | #define LHD_IDXDESC 196 | |
132 | ||
133 | /* InDex Description. */ | |
134 | struct vms_idd | |
135 | { | |
136 | unsigned char flags[2]; | |
137 | ||
138 | /* Max length of the key. */ | |
139 | unsigned char keylen[2]; | |
140 | ||
141 | /* First index block. */ | |
142 | unsigned char vbn[4]; | |
143 | }; | |
144 | ||
145 | /* IDD flags. */ | |
146 | #define IDD__FLAGS_ASCII 1 | |
147 | #define IDD__FLAGS_LOCKED 2 | |
148 | #define IDD__FLAGS_VARLENIDX 4 | |
149 | #define IDD__FLAGS_NOCASECMP 8 | |
150 | #define IDD__FLAGS_NOCASENTR 16 | |
151 | #define IDD__FLAGS_UPCASNTRY 32 | |
152 | ||
153 | #define IDD_LENGTH 8 | |
154 | ||
155 | /* Index block. */ | |
156 | #define INDEXDEF__LENGTH 512 | |
157 | #define INDEXDEF__BLKSIZ 500 | |
158 | ||
159 | struct vms_indexdef | |
160 | { | |
161 | /* Number of bytes used. */ | |
162 | unsigned char used[2]; | |
163 | ||
164 | /* VBN of the parent. */ | |
165 | unsigned char parent[4]; | |
166 | ||
167 | unsigned char fill_1[6]; | |
8e57e1d1 | 168 | |
91a45c33 | 169 | /* The key field contains vms_idx/vms_elfidx structures, which are |
8e57e1d1 | 170 | simply a key (= a string) and a rfa. */ |
fd63344e TG |
171 | unsigned char keys[INDEXDEF__BLKSIZ]; |
172 | }; | |
173 | ||
8e57e1d1 TG |
174 | /* An offset in a file. */ |
175 | ||
176 | struct vms_rfa | |
fd63344e | 177 | { |
8e57e1d1 TG |
178 | /* Logical block number, 1 based. |
179 | 0 means that the field is absent. Block size is 512. */ | |
fd63344e | 180 | unsigned char vbn[4]; |
8e57e1d1 TG |
181 | |
182 | /* Offset within the block. */ | |
fd63344e | 183 | unsigned char offset[2]; |
8e57e1d1 TG |
184 | }; |
185 | ||
186 | /* Index keys. For version 3. */ | |
187 | ||
188 | struct vms_idx | |
189 | { | |
190 | /* Offset from the start of the vbn, so minimum should be | |
191 | DATA__DATA (ie 6). */ | |
192 | struct vms_rfa rfa; | |
fd63344e TG |
193 | |
194 | unsigned char keylen; | |
8e57e1d1 | 195 | /* The length of this field is in fact keylen. */ |
fd63344e TG |
196 | unsigned char keyname[256]; |
197 | }; | |
198 | ||
8e57e1d1 | 199 | /* Index keys, for version 4 and later. */ |
fd63344e | 200 | |
8e57e1d1 TG |
201 | struct vms_elfidx |
202 | { | |
203 | struct vms_rfa rfa; | |
fd63344e TG |
204 | |
205 | unsigned char keylen[2]; | |
8e57e1d1 | 206 | unsigned char flags; |
fd63344e TG |
207 | unsigned char keyname[256]; |
208 | }; | |
209 | ||
8e57e1d1 TG |
210 | /* Flags of elfidx. */ |
211 | ||
212 | #define ELFIDX__WEAK 0x01 /* Weak symbol. */ | |
213 | #define ELFIDX__GROUP 0x02 /* Group symbol. */ | |
214 | #define ELFIDX__LISTRFA 0x04 /* RFA field points to an LHS. */ | |
215 | #define ELFIDX__SYMESC 0x08 /* Long symbol. */ | |
216 | ||
fd63344e TG |
217 | #define RFADEF__C_INDEX 0xffff |
218 | ||
8e57e1d1 TG |
219 | /* List head structure. That's what is pointed by rfa when LISTRFA flag |
220 | is set in elfidx. */ | |
221 | ||
222 | struct vms_lhs | |
223 | { | |
224 | struct vms_rfa ng_g_rfa; /* Non-group global. */ | |
225 | struct vms_rfa ng_wk_rfa; /* Non-group weak. */ | |
226 | struct vms_rfa g_g_rfa; /* Group global. */ | |
227 | struct vms_rfa g_wk_rfa; /* Group weak. */ | |
228 | unsigned char flags; | |
229 | }; | |
230 | ||
231 | /* List node structure. Fields of LHS point to this structure. */ | |
232 | ||
233 | struct vms_lns | |
234 | { | |
235 | /* Next node in the list. */ | |
236 | struct vms_rfa nxtrfa; | |
237 | ||
238 | /* Module associated with the key. */ | |
239 | struct vms_rfa modrfa; | |
240 | }; | |
241 | ||
fd63344e TG |
242 | struct vms_datadef |
243 | { | |
244 | /* Number of records in this block. */ | |
245 | unsigned char recs; | |
246 | unsigned char fill_1; | |
247 | ||
248 | /* Next vbn. */ | |
249 | unsigned char link[4]; | |
250 | ||
251 | /* Data. The first word is the record length, followed by record | |
252 | data and a possible pad byte so that record length is always aligned. */ | |
253 | unsigned char data[506]; | |
254 | }; | |
255 | #define DATA__LENGTH 512 | |
256 | #define DATA__DATA 6 | |
257 | ||
13a985e1 TG |
258 | /* Key name block. This is used for keys longer than 128 bytes. */ |
259 | ||
260 | struct vms_kbn | |
261 | { | |
262 | /* Length of the key chunk. */ | |
263 | unsigned char keylen[2]; | |
264 | ||
265 | /* RFA of the next chunk. */ | |
266 | struct vms_rfa rfa; | |
267 | ||
268 | /* Followed by the key chunk. */ | |
269 | }; | |
270 | ||
fd63344e TG |
271 | /* Module header. */ |
272 | struct vms_mhd | |
273 | { | |
274 | /* Fixed part. */ | |
275 | unsigned char lbrflag; | |
276 | unsigned char id; | |
277 | unsigned char fill_1[2]; | |
278 | unsigned char refcnt[4]; | |
279 | unsigned char datim[8]; | |
280 | ||
281 | unsigned char objstat; | |
282 | /* Ident or GSMATCH. */ | |
283 | unsigned char objidlng; | |
284 | unsigned char objid[31]; | |
8e57e1d1 TG |
285 | |
286 | unsigned char pad1[3]; | |
287 | unsigned char otherefcnt[4]; | |
288 | unsigned char modsize[4]; | |
289 | unsigned char pad2[4]; | |
fd63344e TG |
290 | }; |
291 | ||
292 | #define MHD__C_MHDID 0xad /* Value for id. */ | |
8e57e1d1 | 293 | #define MHD__C_MHDLEN 16 /* Fixed part length. */ |
fd63344e | 294 | #define MHD__C_USRDAT 16 |
91a45c33 TG |
295 | |
296 | /* Flags for objstat. */ | |
297 | #define MHD__M_SELSRC 0x1 /* Selective search. */ | |
fd63344e TG |
298 | #define MHD__M_OBJTIR 0x2 |
299 | #define MHD__M_WKSYM 0x4 | |
300 | ||
301 | struct vms_luh | |
302 | { | |
303 | unsigned char nxtluhblk[4]; | |
304 | unsigned char spare[2]; | |
305 | unsigned char data[506]; | |
306 | }; | |
307 | ||
308 | struct vms_luhdef | |
309 | { | |
310 | unsigned char rechdr[2]; | |
311 | unsigned char reclen[2]; | |
312 | }; | |
313 | #define LUH__RECHDRLEN 4 | |
314 | #define LUH__RECHDRMRK 0xabba | |
315 | #define LUH__DATAFLDLEN 506 | |
316 | ||
317 | /* Entry in the history. */ | |
318 | ||
319 | struct vms_leh | |
320 | { | |
321 | unsigned char date[8]; | |
322 | unsigned char nbr_units[2]; | |
323 | unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced. */ | |
324 | unsigned char idlen; | |
325 | /* username | |
326 | modules... */ | |
327 | }; | |
328 | ||
329 | #endif /* _VMS_LBR_H */ |