1 /* Alpha VMS external format of Libraries. 2 3 Copyright (C) 2010-2014 Free Software Foundation, Inc. 4 Written by Tristan Gingold <gingold (at) 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