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 | |
---|
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 */ |
---|