| 1 | /* Internal format of XCOFF object file data structures for BFD. | 
|---|
| 2 |  | 
|---|
| 3 | Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 | 
|---|
| 4 | Free Software Foundation, Inc. | 
|---|
| 5 | Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support. | 
|---|
| 6 |  | 
|---|
| 7 | This file is part of BFD, the Binary File Descriptor library. | 
|---|
| 8 |  | 
|---|
| 9 | This program is free software; you can redistribute it and/or modify | 
|---|
| 10 | it under the terms of the GNU General Public License as published by | 
|---|
| 11 | the Free Software Foundation; either version 2 of the License, or | 
|---|
| 12 | (at your option) any later version. | 
|---|
| 13 |  | 
|---|
| 14 | This program is distributed in the hope that it will be useful, | 
|---|
| 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 17 | GNU General Public License for more details. | 
|---|
| 18 |  | 
|---|
| 19 | You should have received a copy of the GNU General Public License | 
|---|
| 20 | along with this program; if not, write to the Free Software | 
|---|
| 21 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ | 
|---|
| 22 |  | 
|---|
| 23 | #ifndef _INTERNAL_XCOFF_H | 
|---|
| 24 | #define _INTERNAL_XCOFF_H | 
|---|
| 25 |  | 
|---|
| 26 | /* Linker */ | 
|---|
| 27 |  | 
|---|
| 28 | /* Names of "special" sections.  */ | 
|---|
| 29 | #define _TEXT   ".text" | 
|---|
| 30 | #define _DATA   ".data" | 
|---|
| 31 | #define _BSS    ".bss" | 
|---|
| 32 | #define _PAD    ".pad" | 
|---|
| 33 | #define _LOADER ".loader" | 
|---|
| 34 | #define _EXCEPT ".except" | 
|---|
| 35 | #define _TYPCHK ".typchk" | 
|---|
| 36 |  | 
|---|
| 37 | /* XCOFF uses a special .loader section with type STYP_LOADER.  */ | 
|---|
| 38 | #define STYP_LOADER 0x1000 | 
|---|
| 39 |  | 
|---|
| 40 | /* XCOFF uses a special .debug section with type STYP_DEBUG.  */ | 
|---|
| 41 | #define STYP_DEBUG 0x2000 | 
|---|
| 42 |  | 
|---|
| 43 | /* XCOFF handles line number or relocation overflow by creating | 
|---|
| 44 | another section header with STYP_OVRFLO set.  */ | 
|---|
| 45 | #define STYP_OVRFLO 0x8000 | 
|---|
| 46 |  | 
|---|
| 47 | /* Specifies an exception section.  A section of this type provides | 
|---|
| 48 | information to identify the reason that a trap or ececptin occured within | 
|---|
| 49 | and executable object program */ | 
|---|
| 50 | #define STYP_EXCEPT 0x0100 | 
|---|
| 51 |  | 
|---|
| 52 | /* Specifies a type check section.  A section of this type contains parameter | 
|---|
| 53 | argument type check strings used by the AIX binder.  */ | 
|---|
| 54 | #define STYP_TYPCHK 0x4000 | 
|---|
| 55 |  | 
|---|
| 56 | #define RS6K_AOUTHDR_OMAGIC 0x0107 /* old: text & data writeable */ | 
|---|
| 57 | #define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */ | 
|---|
| 58 | #define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */ | 
|---|
| 59 |  | 
|---|
| 60 | /* XCOFF relocation types. | 
|---|
| 61 | The relocations are described in the function | 
|---|
| 62 | xcoff[64]_ppc_relocate_section in coff64-rs6000.c and coff-rs6000.c  */ | 
|---|
| 63 |  | 
|---|
| 64 | #define R_POS   (0x00) | 
|---|
| 65 | #define R_NEG   (0x01) | 
|---|
| 66 | #define R_REL   (0x02) | 
|---|
| 67 | #define R_TOC   (0x03) | 
|---|
| 68 | #define R_RTB   (0x04) | 
|---|
| 69 | #define R_GL    (0x05) | 
|---|
| 70 | #define R_TCL   (0x06) | 
|---|
| 71 | #define R_BA    (0x08) | 
|---|
| 72 | #define R_BR    (0x0a) | 
|---|
| 73 | #define R_RL    (0x0c) | 
|---|
| 74 | #define R_RLA   (0x0d) | 
|---|
| 75 | #define R_REF   (0x0f) | 
|---|
| 76 | #define R_TRL   (0x12) | 
|---|
| 77 | #define R_TRLA  (0x13) | 
|---|
| 78 | #define R_RRTBI (0x14) | 
|---|
| 79 | #define R_RRTBA (0x15) | 
|---|
| 80 | #define R_CAI   (0x16) | 
|---|
| 81 | #define R_CREL  (0x17) | 
|---|
| 82 | #define R_RBA   (0x18) | 
|---|
| 83 | #define R_RBAC  (0x19) | 
|---|
| 84 | #define R_RBR   (0x1a) | 
|---|
| 85 | #define R_RBRC  (0x1b) | 
|---|
| 86 |  | 
|---|
| 87 | /* Storage class #defines, from /usr/include/storclass.h that are not already | 
|---|
| 88 | defined in internal.h */ | 
|---|
| 89 |  | 
|---|
| 90 | /* Comment string in .info section */ | 
|---|
| 91 | #define C_INFO          110 | 
|---|
| 92 |  | 
|---|
| 93 | /* Auxillary Symbol Entries  */ | 
|---|
| 94 |  | 
|---|
| 95 | /* x_smtyp values:  */ | 
|---|
| 96 | #define SMTYP_ALIGN(x)  ((x) >> 3)      /* log2 of alignment */ | 
|---|
| 97 | #define SMTYP_SMTYP(x)  ((x) & 0x7)     /* symbol type */ | 
|---|
| 98 | /* Symbol type values:  */ | 
|---|
| 99 | #define XTY_ER  0               /* External reference */ | 
|---|
| 100 | #define XTY_SD  1               /* Csect definition */ | 
|---|
| 101 | #define XTY_LD  2               /* Label definition */ | 
|---|
| 102 | #define XTY_CM  3               /* .BSS */ | 
|---|
| 103 | #define XTY_EM  4               /* Error message */ | 
|---|
| 104 | #define XTY_US  5               /* "Reserved for internal use" */ | 
|---|
| 105 |  | 
|---|
| 106 | /* x_smclas values:  */ | 
|---|
| 107 | #define XMC_PR  0               /* Read-only program code */ | 
|---|
| 108 | #define XMC_RO  1               /* Read-only constant */ | 
|---|
| 109 | #define XMC_DB  2               /* Read-only debug dictionary table */ | 
|---|
| 110 | #define XMC_TC  3               /* Read-write general TOC entry */ | 
|---|
| 111 | #define XMC_UA  4               /* Read-write unclassified */ | 
|---|
| 112 | #define XMC_RW  5               /* Read-write data */ | 
|---|
| 113 | #define XMC_GL  6               /* Read-only global linkage */ | 
|---|
| 114 | #define XMC_XO  7               /* Read-only extended operation */ | 
|---|
| 115 | #define XMC_SV  8               /* Read-only supervisor call */ | 
|---|
| 116 | #define XMC_BS  9               /* Read-write BSS */ | 
|---|
| 117 | #define XMC_DS  10              /* Read-write descriptor csect */ | 
|---|
| 118 | #define XMC_UC  11              /* Read-write unnamed Fortran common */ | 
|---|
| 119 | #define XMC_TI  12              /* Read-only traceback index csect */ | 
|---|
| 120 | #define XMC_TB  13              /* Read-only traceback table csect */ | 
|---|
| 121 | /*              14      ??? */ | 
|---|
| 122 | #define XMC_TC0 15              /* Read-write TOC anchor */ | 
|---|
| 123 | #define XMC_TD  16              /* Read-write data in TOC */ | 
|---|
| 124 | #define XMC_SV64   17           /* Read-only 64 bit supervisor call */ | 
|---|
| 125 | #define XMC_SV3264 18           /* Read-only 32 or 64 bit supervisor call */ | 
|---|
| 126 |  | 
|---|
| 127 | /* The ldhdr structure.  This appears at the start of the .loader | 
|---|
| 128 | section.  */ | 
|---|
| 129 |  | 
|---|
| 130 | struct internal_ldhdr | 
|---|
| 131 | { | 
|---|
| 132 | /* The version number: | 
|---|
| 133 | 1 : 32 bit | 
|---|
| 134 | 2 : 64 bit */ | 
|---|
| 135 | unsigned long l_version; | 
|---|
| 136 |  | 
|---|
| 137 | /* The number of symbol table entries.  */ | 
|---|
| 138 | bfd_size_type l_nsyms; | 
|---|
| 139 |  | 
|---|
| 140 | /* The number of relocation table entries.  */ | 
|---|
| 141 | bfd_size_type l_nreloc; | 
|---|
| 142 |  | 
|---|
| 143 | /* The length of the import file string table.  */ | 
|---|
| 144 | bfd_size_type l_istlen; | 
|---|
| 145 |  | 
|---|
| 146 | /* The number of import files.  */ | 
|---|
| 147 | bfd_size_type l_nimpid; | 
|---|
| 148 |  | 
|---|
| 149 | /* The offset from the start of the .loader section to the first | 
|---|
| 150 | entry in the import file table.  */ | 
|---|
| 151 | bfd_size_type l_impoff; | 
|---|
| 152 |  | 
|---|
| 153 | /* The length of the string table.  */ | 
|---|
| 154 | bfd_size_type l_stlen; | 
|---|
| 155 |  | 
|---|
| 156 | /* The offset from the start of the .loader section to the first | 
|---|
| 157 | entry in the string table.  */ | 
|---|
| 158 | bfd_size_type l_stoff; | 
|---|
| 159 |  | 
|---|
| 160 | /* The offset to start of the symbol table, only in XCOFF64 */ | 
|---|
| 161 | bfd_vma l_symoff; | 
|---|
| 162 |  | 
|---|
| 163 | /* The offset to the start of the relocation table, only in XCOFF64 */ | 
|---|
| 164 | bfd_vma l_rldoff; | 
|---|
| 165 | }; | 
|---|
| 166 |  | 
|---|
| 167 | /* The ldsym structure.  This is used to represent a symbol in the | 
|---|
| 168 | .loader section.  */ | 
|---|
| 169 |  | 
|---|
| 170 | struct internal_ldsym | 
|---|
| 171 | { | 
|---|
| 172 | union | 
|---|
| 173 | { | 
|---|
| 174 | /* The symbol name if <= SYMNMLEN characters.  */ | 
|---|
| 175 | char _l_name[SYMNMLEN]; | 
|---|
| 176 | struct | 
|---|
| 177 | { | 
|---|
| 178 | /* Zero if the symbol name is more than SYMNMLEN characters.  */ | 
|---|
| 179 | long _l_zeroes; | 
|---|
| 180 |  | 
|---|
| 181 | /* The offset in the string table if the symbol name is more | 
|---|
| 182 | than SYMNMLEN characters.  */ | 
|---|
| 183 | long _l_offset; | 
|---|
| 184 | } | 
|---|
| 185 | _l_l; | 
|---|
| 186 | } | 
|---|
| 187 | _l; | 
|---|
| 188 |  | 
|---|
| 189 | /* The symbol value.  */ | 
|---|
| 190 | bfd_vma l_value; | 
|---|
| 191 |  | 
|---|
| 192 | /* The symbol section number.  */ | 
|---|
| 193 | short l_scnum; | 
|---|
| 194 |  | 
|---|
| 195 | /* The symbol type and flags.  */ | 
|---|
| 196 | char l_smtype; | 
|---|
| 197 |  | 
|---|
| 198 | /* The symbol storage class.  */ | 
|---|
| 199 | char l_smclas; | 
|---|
| 200 |  | 
|---|
| 201 | /* The import file ID.  */ | 
|---|
| 202 | bfd_size_type l_ifile; | 
|---|
| 203 |  | 
|---|
| 204 | /* Offset to the parameter type check string.  */ | 
|---|
| 205 | bfd_size_type l_parm; | 
|---|
| 206 | }; | 
|---|
| 207 |  | 
|---|
| 208 | /* These flags are for the l_smtype field (the lower three bits are an | 
|---|
| 209 | XTY_* value).  */ | 
|---|
| 210 |  | 
|---|
| 211 | /* Imported symbol.  */ | 
|---|
| 212 | #define L_IMPORT (0x40) | 
|---|
| 213 | /* Entry point.  */ | 
|---|
| 214 | #define L_ENTRY (0x20) | 
|---|
| 215 | /* Exported symbol.  */ | 
|---|
| 216 | #define L_EXPORT (0x10) | 
|---|
| 217 |  | 
|---|
| 218 | /* The ldrel structure.  This is used to represent a reloc in the | 
|---|
| 219 | .loader section.  */ | 
|---|
| 220 |  | 
|---|
| 221 | struct internal_ldrel | 
|---|
| 222 | { | 
|---|
| 223 | /* The reloc address.  */ | 
|---|
| 224 | bfd_vma l_vaddr; | 
|---|
| 225 |  | 
|---|
| 226 | /* The symbol table index in the .loader section symbol table.  */ | 
|---|
| 227 | bfd_size_type l_symndx; | 
|---|
| 228 |  | 
|---|
| 229 | /* The relocation type and size.  */ | 
|---|
| 230 | short l_rtype; | 
|---|
| 231 |  | 
|---|
| 232 | /* The section number this relocation applies to.  */ | 
|---|
| 233 | short l_rsecnm; | 
|---|
| 234 | }; | 
|---|
| 235 |  | 
|---|
| 236 | /* An entry in the XCOFF linker hash table.  */ | 
|---|
| 237 | struct xcoff_link_hash_entry | 
|---|
| 238 | { | 
|---|
| 239 | struct bfd_link_hash_entry root; | 
|---|
| 240 |  | 
|---|
| 241 | /* Symbol index in output file.  Set to -1 initially.  Set to -2 if | 
|---|
| 242 | there is a reloc against this symbol.  */ | 
|---|
| 243 | long indx; | 
|---|
| 244 |  | 
|---|
| 245 | /* If we have created a TOC entry for this symbol, this is the .tc | 
|---|
| 246 | section which holds it.  */ | 
|---|
| 247 | asection *toc_section; | 
|---|
| 248 |  | 
|---|
| 249 | union | 
|---|
| 250 | { | 
|---|
| 251 | /* If we have created a TOC entry (the XCOFF_SET_TOC flag is | 
|---|
| 252 | set), this is the offset in toc_section.  */ | 
|---|
| 253 | bfd_vma toc_offset; | 
|---|
| 254 |  | 
|---|
| 255 | /* If the TOC entry comes from an input file, this is set to the | 
|---|
| 256 | symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol.  */ | 
|---|
| 257 | long toc_indx; | 
|---|
| 258 | } | 
|---|
| 259 | u; | 
|---|
| 260 |  | 
|---|
| 261 | /* If this symbol is a function entry point which is called, this | 
|---|
| 262 | field holds a pointer to the function descriptor.  If this symbol | 
|---|
| 263 | is a function descriptor, this field holds a pointer to the | 
|---|
| 264 | function entry point.  */ | 
|---|
| 265 | struct xcoff_link_hash_entry *descriptor; | 
|---|
| 266 |  | 
|---|
| 267 | /* The .loader symbol table entry, if there is one.  */ | 
|---|
| 268 | struct internal_ldsym *ldsym; | 
|---|
| 269 |  | 
|---|
| 270 | /* If XCOFF_BUILT_LDSYM is set, this is the .loader symbol table | 
|---|
| 271 | index.  If XCOFF_BUILD_LDSYM is clear, and XCOFF_IMPORT is set, | 
|---|
| 272 | this is the l_ifile value.  */ | 
|---|
| 273 | long ldindx; | 
|---|
| 274 |  | 
|---|
| 275 | /* Some linker flags.  */ | 
|---|
| 276 | unsigned long flags; | 
|---|
| 277 |  | 
|---|
| 278 | /* The storage mapping class.  */ | 
|---|
| 279 | unsigned char smclas; | 
|---|
| 280 | }; | 
|---|
| 281 |  | 
|---|
| 282 | /*  Flags for xcoff_link_hash_entry.  */ | 
|---|
| 283 |  | 
|---|
| 284 | /* Symbol is referenced by a regular object. */ | 
|---|
| 285 | #define XCOFF_REF_REGULAR      0x00000001 | 
|---|
| 286 | /* Symbol is defined by a regular object. */ | 
|---|
| 287 | #define XCOFF_DEF_REGULAR      0x00000002 | 
|---|
| 288 | /* Symbol is defined by a dynamic object. */ | 
|---|
| 289 | #define XCOFF_DEF_DYNAMIC      0x00000004 | 
|---|
| 290 | /* Symbol is used in a reloc being copied into the .loader section.  */ | 
|---|
| 291 | #define XCOFF_LDREL            0x00000008 | 
|---|
| 292 | /* Symbol is the entry point.  */ | 
|---|
| 293 | #define XCOFF_ENTRY            0x00000010 | 
|---|
| 294 | /* Symbol is called; this is, it appears in a R_BR reloc.  */ | 
|---|
| 295 | #define XCOFF_CALLED           0x00000020 | 
|---|
| 296 | /* Symbol needs the TOC entry filled in.  */ | 
|---|
| 297 | #define XCOFF_SET_TOC          0x00000040 | 
|---|
| 298 | /* Symbol is explicitly imported.  */ | 
|---|
| 299 | #define XCOFF_IMPORT           0x00000080 | 
|---|
| 300 | /* Symbol is explicitly exported.  */ | 
|---|
| 301 | #define XCOFF_EXPORT           0x00000100 | 
|---|
| 302 | /* Symbol has been processed by xcoff_build_ldsyms.  */ | 
|---|
| 303 | #define XCOFF_BUILT_LDSYM      0x00000200 | 
|---|
| 304 | /* Symbol is mentioned by a section which was not garbage collected. */ | 
|---|
| 305 | #define XCOFF_MARK             0x00000400 | 
|---|
| 306 | /* Symbol size is recorded in size_list list from hash table.  */ | 
|---|
| 307 | #define XCOFF_HAS_SIZE         0x00000800 | 
|---|
| 308 | /* Symbol is a function descriptor.  */ | 
|---|
| 309 | #define XCOFF_DESCRIPTOR       0x00001000 | 
|---|
| 310 | /* Multiple definitions have been for the symbol. */ | 
|---|
| 311 | #define XCOFF_MULTIPLY_DEFINED 0x00002000 | 
|---|
| 312 | /* Symbol is the __rtinit symbol.  */ | 
|---|
| 313 | #define XCOFF_RTINIT           0x00004000 | 
|---|
| 314 | /* Symbol is an imported 32 bit syscall.  */ | 
|---|
| 315 | #define XCOFF_SYSCALL32        0x00008000 | 
|---|
| 316 | /* Symbol is an imported 64 bit syscall.  */ | 
|---|
| 317 | #define XCOFF_SYSCALL64        0x00010000 | 
|---|
| 318 |  | 
|---|
| 319 | /* The XCOFF linker hash table.  */ | 
|---|
| 320 |  | 
|---|
| 321 | #define XCOFF_NUMBER_OF_SPECIAL_SECTIONS 6 | 
|---|
| 322 | #define XCOFF_SPECIAL_SECTION_TEXT       0 | 
|---|
| 323 | #define XCOFF_SPECIAL_SECTION_ETEXT      1 | 
|---|
| 324 | #define XCOFF_SPECIAL_SECTION_DATA       2 | 
|---|
| 325 | #define XCOFF_SPECIAL_SECTION_EDATA      3 | 
|---|
| 326 | #define XCOFF_SPECIAL_SECTION_END        4 | 
|---|
| 327 | #define XCOFF_SPECIAL_SECTION_END2       5 | 
|---|
| 328 |  | 
|---|
| 329 | struct xcoff_link_hash_table | 
|---|
| 330 | { | 
|---|
| 331 | struct bfd_link_hash_table root; | 
|---|
| 332 |  | 
|---|
| 333 | /* The .debug string hash table.  We need to compute this while | 
|---|
| 334 | reading the input files, so that we know how large the .debug | 
|---|
| 335 | section will be before we assign section positions.  */ | 
|---|
| 336 | struct bfd_strtab_hash *debug_strtab; | 
|---|
| 337 |  | 
|---|
| 338 | /* The .debug section we will use for the final output.  */ | 
|---|
| 339 | asection *debug_section; | 
|---|
| 340 |  | 
|---|
| 341 | /* The .loader section we will use for the final output.  */ | 
|---|
| 342 | asection *loader_section; | 
|---|
| 343 |  | 
|---|
| 344 | /* A count of non TOC relative relocs which will need to be | 
|---|
| 345 | allocated in the .loader section.  */ | 
|---|
| 346 | size_t ldrel_count; | 
|---|
| 347 |  | 
|---|
| 348 | /* The .loader section header.  */ | 
|---|
| 349 | struct internal_ldhdr ldhdr; | 
|---|
| 350 |  | 
|---|
| 351 | /* The .gl section we use to hold global linkage code.  */ | 
|---|
| 352 | asection *linkage_section; | 
|---|
| 353 |  | 
|---|
| 354 | /* The .tc section we use to hold toc entries we build for global | 
|---|
| 355 | linkage code.  */ | 
|---|
| 356 | asection *toc_section; | 
|---|
| 357 |  | 
|---|
| 358 | /* The .ds section we use to hold function descriptors which we | 
|---|
| 359 | create for exported symbols.  */ | 
|---|
| 360 | asection *descriptor_section; | 
|---|
| 361 |  | 
|---|
| 362 | /* The list of import files.  */ | 
|---|
| 363 | struct xcoff_import_file *imports; | 
|---|
| 364 |  | 
|---|
| 365 | /* Required alignment of sections within the output file.  */ | 
|---|
| 366 | unsigned long file_align; | 
|---|
| 367 |  | 
|---|
| 368 | /* Whether the .text section must be read-only.  */ | 
|---|
| 369 | bfd_boolean textro; | 
|---|
| 370 |  | 
|---|
| 371 | /* Whether garbage collection was done.  */ | 
|---|
| 372 | bfd_boolean gc; | 
|---|
| 373 |  | 
|---|
| 374 | /* A linked list of symbols for which we have size information.  */ | 
|---|
| 375 | struct xcoff_link_size_list | 
|---|
| 376 | { | 
|---|
| 377 | struct xcoff_link_size_list *next; | 
|---|
| 378 | struct xcoff_link_hash_entry *h; | 
|---|
| 379 | bfd_size_type size; | 
|---|
| 380 | } | 
|---|
| 381 | *size_list; | 
|---|
| 382 |  | 
|---|
| 383 | /* Magic sections: _text, _etext, _data, _edata, _end, end. */ | 
|---|
| 384 | asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS]; | 
|---|
| 385 | }; | 
|---|
| 386 |  | 
|---|
| 387 |  | 
|---|
| 388 | /* This structure is used to pass information through | 
|---|
| 389 | xcoff_link_hash_traverse.  */ | 
|---|
| 390 |  | 
|---|
| 391 | struct xcoff_loader_info | 
|---|
| 392 | { | 
|---|
| 393 | /* Set if a problem occurred.  */ | 
|---|
| 394 | bfd_boolean failed; | 
|---|
| 395 |  | 
|---|
| 396 | /* Output BFD.  */ | 
|---|
| 397 | bfd *output_bfd; | 
|---|
| 398 |  | 
|---|
| 399 | /* Link information structure.  */ | 
|---|
| 400 | struct bfd_link_info *info; | 
|---|
| 401 |  | 
|---|
| 402 | /* Whether all defined symbols should be exported.  */ | 
|---|
| 403 | bfd_boolean export_defineds; | 
|---|
| 404 |  | 
|---|
| 405 | /* Number of ldsym structures.  */ | 
|---|
| 406 | size_t ldsym_count; | 
|---|
| 407 |  | 
|---|
| 408 | /* Size of string table.  */ | 
|---|
| 409 | size_t string_size; | 
|---|
| 410 |  | 
|---|
| 411 | /* String table.  */ | 
|---|
| 412 | bfd_byte *strings; | 
|---|
| 413 |  | 
|---|
| 414 | /* Allocated size of string table.  */ | 
|---|
| 415 | size_t string_alc; | 
|---|
| 416 | }; | 
|---|
| 417 |  | 
|---|
| 418 | /* In case we're on a 32-bit machine, construct a 64-bit "-1" value | 
|---|
| 419 | from smaller values.  Start with zero, widen, *then* decrement.  */ | 
|---|
| 420 | #define MINUS_ONE       (((bfd_vma) 0) - 1) | 
|---|
| 421 |  | 
|---|
| 422 | /* __rtinit, from /usr/include/rtinit.h.  */ | 
|---|
| 423 | struct __rtinit | 
|---|
| 424 | { | 
|---|
| 425 | /* Pointer to runtime linker. | 
|---|
| 426 | XXX: Is the parameter really void?  */ | 
|---|
| 427 | int   (*rtl) PARAMS ((void)); | 
|---|
| 428 |  | 
|---|
| 429 | /* Offset to array of init functions, 0 if none. */ | 
|---|
| 430 | int   init_offset; | 
|---|
| 431 |  | 
|---|
| 432 | /* Offset to array of fini functions, 0 if none. */ | 
|---|
| 433 | int   fini_offset; | 
|---|
| 434 |  | 
|---|
| 435 | /* Size of __RTINIT_DESCRIPTOR. This value should be used instead of | 
|---|
| 436 | sizeof(__RTINIT_DESCRIPTOR). */ | 
|---|
| 437 | int   __rtinit_descriptor_size; | 
|---|
| 438 | }; | 
|---|
| 439 |  | 
|---|
| 440 | #define RTINIT_DESCRIPTOR_SIZE (12) | 
|---|
| 441 |  | 
|---|
| 442 | struct __rtinit_descriptor | 
|---|
| 443 | { | 
|---|
| 444 | /* Init/fini function. */ | 
|---|
| 445 | int   f; | 
|---|
| 446 |  | 
|---|
| 447 | /* Offset, relative to the start of the __rtinit symbol, to name of the | 
|---|
| 448 | function. */ | 
|---|
| 449 |  | 
|---|
| 450 | int   name_offset; | 
|---|
| 451 |  | 
|---|
| 452 | /* Flags */ | 
|---|
| 453 | unsigned char flags; | 
|---|
| 454 | }; | 
|---|
| 455 |  | 
|---|
| 456 | /* Archive */ | 
|---|
| 457 |  | 
|---|
| 458 | #define XCOFFARMAG    "<aiaff>\012" | 
|---|
| 459 | #define XCOFFARMAGBIG "<bigaf>\012" | 
|---|
| 460 | #define SXCOFFARMAG   8 | 
|---|
| 461 |  | 
|---|
| 462 | /* The size of the ascii archive elements */ | 
|---|
| 463 | #define XCOFFARMAG_ELEMENT_SIZE 12 | 
|---|
| 464 | #define XCOFFARMAGBIG_ELEMENT_SIZE 20 | 
|---|
| 465 |  | 
|---|
| 466 | /* This terminates an XCOFF archive member name.  */ | 
|---|
| 467 |  | 
|---|
| 468 | #define XCOFFARFMAG "`\012" | 
|---|
| 469 | #define SXCOFFARFMAG 2 | 
|---|
| 470 |  | 
|---|
| 471 | /* XCOFF archives start with this (printable) structure.  */ | 
|---|
| 472 |  | 
|---|
| 473 | struct xcoff_ar_file_hdr | 
|---|
| 474 | { | 
|---|
| 475 | /* Magic string.  */ | 
|---|
| 476 | char magic[SXCOFFARMAG]; | 
|---|
| 477 |  | 
|---|
| 478 | /* Offset of the member table (decimal ASCII string).  */ | 
|---|
| 479 | char memoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 480 |  | 
|---|
| 481 | /* Offset of the global symbol table (decimal ASCII string).  */ | 
|---|
| 482 | char symoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 483 |  | 
|---|
| 484 | /* Offset of the first member in the archive (decimal ASCII string).  */ | 
|---|
| 485 | char firstmemoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 486 |  | 
|---|
| 487 | /* Offset of the last member in the archive (decimal ASCII string).  */ | 
|---|
| 488 | char lastmemoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 489 |  | 
|---|
| 490 | /* Offset of the first member on the free list (decimal ASCII | 
|---|
| 491 | string).  */ | 
|---|
| 492 | char freeoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 493 | }; | 
|---|
| 494 |  | 
|---|
| 495 | #define SIZEOF_AR_FILE_HDR (SXCOFFARMAG + 5 * XCOFFARMAG_ELEMENT_SIZE) | 
|---|
| 496 |  | 
|---|
| 497 | /* This is the equivalent data structure for the big archive format.  */ | 
|---|
| 498 |  | 
|---|
| 499 | struct xcoff_ar_file_hdr_big | 
|---|
| 500 | { | 
|---|
| 501 | /* Magic string.  */ | 
|---|
| 502 | char magic[SXCOFFARMAG]; | 
|---|
| 503 |  | 
|---|
| 504 | /* Offset of the member table (decimal ASCII string).  */ | 
|---|
| 505 | char memoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 506 |  | 
|---|
| 507 | /* Offset of the global symbol table for 32-bit objects (decimal ASCII | 
|---|
| 508 | string).  */ | 
|---|
| 509 | char symoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 510 |  | 
|---|
| 511 | /* Offset of the global symbol table for 64-bit objects (decimal ASCII | 
|---|
| 512 | string).  */ | 
|---|
| 513 | char symoff64[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 514 |  | 
|---|
| 515 | /* Offset of the first member in the archive (decimal ASCII string).  */ | 
|---|
| 516 | char firstmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 517 |  | 
|---|
| 518 | /* Offset of the last member in the archive (decimal ASCII string).  */ | 
|---|
| 519 | char lastmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 520 |  | 
|---|
| 521 | /* Offset of the first member on the free list (decimal ASCII | 
|---|
| 522 | string).  */ | 
|---|
| 523 | char freeoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 524 | }; | 
|---|
| 525 |  | 
|---|
| 526 | #define SIZEOF_AR_FILE_HDR_BIG (SXCOFFARMAG + 6 * XCOFFARMAGBIG_ELEMENT_SIZE) | 
|---|
| 527 |  | 
|---|
| 528 | /* Each XCOFF archive member starts with this (printable) structure.  */ | 
|---|
| 529 |  | 
|---|
| 530 | struct xcoff_ar_hdr | 
|---|
| 531 | { | 
|---|
| 532 | /* File size not including the header (decimal ASCII string).  */ | 
|---|
| 533 | char size[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 534 |  | 
|---|
| 535 | /* File offset of next archive member (decimal ASCII string).  */ | 
|---|
| 536 | char nextoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 537 |  | 
|---|
| 538 | /* File offset of previous archive member (decimal ASCII string).  */ | 
|---|
| 539 | char prevoff[XCOFFARMAG_ELEMENT_SIZE]; | 
|---|
| 540 |  | 
|---|
| 541 | /* File mtime (decimal ASCII string).  */ | 
|---|
| 542 | char date[12]; | 
|---|
| 543 |  | 
|---|
| 544 | /* File UID (decimal ASCII string).  */ | 
|---|
| 545 | char uid[12]; | 
|---|
| 546 |  | 
|---|
| 547 | /* File GID (decimal ASCII string).  */ | 
|---|
| 548 | char gid[12]; | 
|---|
| 549 |  | 
|---|
| 550 | /* File mode (octal ASCII string).  */ | 
|---|
| 551 | char mode[12]; | 
|---|
| 552 |  | 
|---|
| 553 | /* Length of file name (decimal ASCII string).  */ | 
|---|
| 554 | char namlen[4]; | 
|---|
| 555 |  | 
|---|
| 556 | /* This structure is followed by the file name.  The length of the | 
|---|
| 557 | name is given in the namlen field.  If the length of the name is | 
|---|
| 558 | odd, the name is followed by a null byte.  The name and optional | 
|---|
| 559 | null byte are followed by XCOFFARFMAG, which is not included in | 
|---|
| 560 | namlen.  The contents of the archive member follow; the number of | 
|---|
| 561 | bytes is given in the size field.  */ | 
|---|
| 562 | }; | 
|---|
| 563 |  | 
|---|
| 564 | #define SIZEOF_AR_HDR (3 * XCOFFARMAG_ELEMENT_SIZE + 4 * 12 + 4) | 
|---|
| 565 |  | 
|---|
| 566 | /* The equivalent for the big archive format.  */ | 
|---|
| 567 |  | 
|---|
| 568 | struct xcoff_ar_hdr_big | 
|---|
| 569 | { | 
|---|
| 570 | /* File size not including the header (decimal ASCII string).  */ | 
|---|
| 571 | char size[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 572 |  | 
|---|
| 573 | /* File offset of next archive member (decimal ASCII string).  */ | 
|---|
| 574 | char nextoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 575 |  | 
|---|
| 576 | /* File offset of previous archive member (decimal ASCII string).  */ | 
|---|
| 577 | char prevoff[XCOFFARMAGBIG_ELEMENT_SIZE]; | 
|---|
| 578 |  | 
|---|
| 579 | /* File mtime (decimal ASCII string).  */ | 
|---|
| 580 | char date[12]; | 
|---|
| 581 |  | 
|---|
| 582 | /* File UID (decimal ASCII string).  */ | 
|---|
| 583 | char uid[12]; | 
|---|
| 584 |  | 
|---|
| 585 | /* File GID (decimal ASCII string).  */ | 
|---|
| 586 | char gid[12]; | 
|---|
| 587 |  | 
|---|
| 588 | /* File mode (octal ASCII string).  */ | 
|---|
| 589 | char mode[12]; | 
|---|
| 590 |  | 
|---|
| 591 | /* Length of file name (decimal ASCII string).  */ | 
|---|
| 592 | char namlen[4]; | 
|---|
| 593 |  | 
|---|
| 594 | /* This structure is followed by the file name.  The length of the | 
|---|
| 595 | name is given in the namlen field.  If the length of the name is | 
|---|
| 596 | odd, the name is followed by a null byte.  The name and optional | 
|---|
| 597 | null byte are followed by XCOFFARFMAG, which is not included in | 
|---|
| 598 | namlen.  The contents of the archive member follow; the number of | 
|---|
| 599 | bytes is given in the size field.  */ | 
|---|
| 600 | }; | 
|---|
| 601 |  | 
|---|
| 602 | #define SIZEOF_AR_HDR_BIG (3 * XCOFFARMAGBIG_ELEMENT_SIZE + 4 * 12 + 4) | 
|---|
| 603 |  | 
|---|
| 604 | /* We often have to distinguish between the old and big file format. | 
|---|
| 605 | Make it a bit cleaner.  We can use `xcoff_ardata' here because the | 
|---|
| 606 | `hdr' member has the same size and position in both formats. | 
|---|
| 607 | <bigaf> is the default format, return TRUE even when xcoff_ardata is | 
|---|
| 608 | NULL. */ | 
|---|
| 609 | #ifndef SMALL_ARCHIVE | 
|---|
| 610 | /* Creates big archives by default */ | 
|---|
| 611 | #define xcoff_big_format_p(abfd) \ | 
|---|
| 612 | ((NULL != bfd_ardata (abfd) && NULL == xcoff_ardata (abfd)) || \ | 
|---|
| 613 | ((NULL != bfd_ardata (abfd)) && \ | 
|---|
| 614 | (NULL != xcoff_ardata (abfd)) && \ | 
|---|
| 615 | (xcoff_ardata (abfd)->magic[1] == 'b'))) | 
|---|
| 616 | #else | 
|---|
| 617 | /* Creates small archives by default. */ | 
|---|
| 618 | #define xcoff_big_format_p(abfd) \ | 
|---|
| 619 | (((NULL != bfd_ardata (abfd)) && \ | 
|---|
| 620 | (NULL != xcoff_ardata (abfd)) && \ | 
|---|
| 621 | (xcoff_ardata (abfd)->magic[1] == 'b'))) | 
|---|
| 622 | #endif | 
|---|
| 623 |  | 
|---|
| 624 | /* We store a copy of the xcoff_ar_file_hdr in the tdata field of the | 
|---|
| 625 | artdata structure.  Similar for the big archive.  */ | 
|---|
| 626 | #define xcoff_ardata(abfd) \ | 
|---|
| 627 | ((struct xcoff_ar_file_hdr *) bfd_ardata (abfd)->tdata) | 
|---|
| 628 | #define xcoff_ardata_big(abfd) \ | 
|---|
| 629 | ((struct xcoff_ar_file_hdr_big *) bfd_ardata (abfd)->tdata) | 
|---|
| 630 |  | 
|---|
| 631 | /* We store a copy of the xcoff_ar_hdr in the arelt_data field of an | 
|---|
| 632 | archive element.  Similar for the big archive.  */ | 
|---|
| 633 | #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data)) | 
|---|
| 634 | #define arch_xhdr(bfd) \ | 
|---|
| 635 | ((struct xcoff_ar_hdr *) arch_eltdata (bfd)->arch_header) | 
|---|
| 636 | #define arch_xhdr_big(bfd) \ | 
|---|
| 637 | ((struct xcoff_ar_hdr_big *) arch_eltdata (bfd)->arch_header) | 
|---|
| 638 |  | 
|---|
| 639 | #endif /* _INTERNAL_XCOFF_H */ | 
|---|