1*a9fa9459Szrj /* DO NOT EDIT! -*- buffer-read-only: t -*- This file is automatically 2*a9fa9459Szrj generated from "libcoff-in.h" and "coffcode.h". 3*a9fa9459Szrj Run "make headers" in your build bfd/ to regenerate. */ 4*a9fa9459Szrj 5*a9fa9459Szrj /* BFD COFF object file private structure. 6*a9fa9459Szrj Copyright (C) 1990-2016 Free Software Foundation, Inc. 7*a9fa9459Szrj Written by Cygnus Support. 8*a9fa9459Szrj 9*a9fa9459Szrj This file is part of BFD, the Binary File Descriptor library. 10*a9fa9459Szrj 11*a9fa9459Szrj This program is free software; you can redistribute it and/or modify 12*a9fa9459Szrj it under the terms of the GNU General Public License as published by 13*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or 14*a9fa9459Szrj (at your option) any later version. 15*a9fa9459Szrj 16*a9fa9459Szrj This program is distributed in the hope that it will be useful, 17*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 18*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*a9fa9459Szrj GNU General Public License for more details. 20*a9fa9459Szrj 21*a9fa9459Szrj You should have received a copy of the GNU General Public License 22*a9fa9459Szrj along with this program; if not, write to the Free Software 23*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 24*a9fa9459Szrj MA 02110-1301, USA. */ 25*a9fa9459Szrj 26*a9fa9459Szrj #include "bfdlink.h" 27*a9fa9459Szrj #include "coff-bfd.h" 28*a9fa9459Szrj 29*a9fa9459Szrj #ifdef __cplusplus 30*a9fa9459Szrj extern "C" { 31*a9fa9459Szrj #endif 32*a9fa9459Szrj 33*a9fa9459Szrj /* Object file tdata; access macros. */ 34*a9fa9459Szrj 35*a9fa9459Szrj #define coff_data(bfd) ((bfd)->tdata.coff_obj_data) 36*a9fa9459Szrj #define obj_pe(bfd) (coff_data (bfd)->pe) 37*a9fa9459Szrj #define obj_symbols(bfd) (coff_data (bfd)->symbols) 38*a9fa9459Szrj #define obj_sym_filepos(bfd) (coff_data (bfd)->sym_filepos) 39*a9fa9459Szrj #define obj_relocbase(bfd) (coff_data (bfd)->relocbase) 40*a9fa9459Szrj #define obj_raw_syments(bfd) (coff_data (bfd)->raw_syments) 41*a9fa9459Szrj #define obj_raw_syment_count(bfd) (coff_data (bfd)->raw_syment_count) 42*a9fa9459Szrj #define obj_convert(bfd) (coff_data (bfd)->conversion_table) 43*a9fa9459Szrj #define obj_conv_table_size(bfd) (coff_data (bfd)->conv_table_size) 44*a9fa9459Szrj #define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms) 45*a9fa9459Szrj #define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms) 46*a9fa9459Szrj #define obj_coff_strings(bfd) (coff_data (bfd)->strings) 47*a9fa9459Szrj #define obj_coff_strings_len(bfd) (coff_data (bfd)->strings_len) 48*a9fa9459Szrj #define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings) 49*a9fa9459Szrj #define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes) 50*a9fa9459Szrj #define obj_coff_strings_written(bfd) (coff_data (bfd)->strings_written) 51*a9fa9459Szrj #define obj_coff_local_toc_table(bfd) (coff_data (bfd)->local_toc_sym_map) 52*a9fa9459Szrj 53*a9fa9459Szrj /* `Tdata' information kept for COFF files. */ 54*a9fa9459Szrj 55*a9fa9459Szrj typedef struct coff_tdata 56*a9fa9459Szrj { 57*a9fa9459Szrj struct coff_symbol_struct *symbols; /* Symtab for input bfd. */ 58*a9fa9459Szrj unsigned int *conversion_table; 59*a9fa9459Szrj int conv_table_size; 60*a9fa9459Szrj file_ptr sym_filepos; 61*a9fa9459Szrj 62*a9fa9459Szrj struct coff_ptr_struct *raw_syments; 63*a9fa9459Szrj unsigned long raw_syment_count; 64*a9fa9459Szrj 65*a9fa9459Szrj /* These are only valid once writing has begun. */ 66*a9fa9459Szrj unsigned long int relocbase; 67*a9fa9459Szrj 68*a9fa9459Szrj /* These members communicate important constants about the symbol table 69*a9fa9459Szrj to GDB's symbol-reading code. These `constants' unfortunately vary 70*a9fa9459Szrj from coff implementation to implementation... */ 71*a9fa9459Szrj unsigned local_n_btmask; 72*a9fa9459Szrj unsigned local_n_btshft; 73*a9fa9459Szrj unsigned local_n_tmask; 74*a9fa9459Szrj unsigned local_n_tshift; 75*a9fa9459Szrj unsigned local_symesz; 76*a9fa9459Szrj unsigned local_auxesz; 77*a9fa9459Szrj unsigned local_linesz; 78*a9fa9459Szrj 79*a9fa9459Szrj /* The unswapped external symbols. May be NULL. Read by 80*a9fa9459Szrj _bfd_coff_get_external_symbols. */ 81*a9fa9459Szrj void * external_syms; 82*a9fa9459Szrj /* If this is TRUE, the external_syms may not be freed. */ 83*a9fa9459Szrj bfd_boolean keep_syms; 84*a9fa9459Szrj 85*a9fa9459Szrj /* The string table. May be NULL. Read by 86*a9fa9459Szrj _bfd_coff_read_string_table. */ 87*a9fa9459Szrj char *strings; 88*a9fa9459Szrj /* The length of the strings table. For error checking. */ 89*a9fa9459Szrj bfd_size_type strings_len; 90*a9fa9459Szrj /* If this is TRUE, the strings may not be freed. */ 91*a9fa9459Szrj bfd_boolean keep_strings; 92*a9fa9459Szrj /* If this is TRUE, the strings have been written out already. */ 93*a9fa9459Szrj bfd_boolean strings_written; 94*a9fa9459Szrj 95*a9fa9459Szrj /* Is this a PE format coff file? */ 96*a9fa9459Szrj int pe; 97*a9fa9459Szrj /* Used by the COFF backend linker. */ 98*a9fa9459Szrj struct coff_link_hash_entry **sym_hashes; 99*a9fa9459Szrj 100*a9fa9459Szrj /* Used by the pe linker for PowerPC. */ 101*a9fa9459Szrj int *local_toc_sym_map; 102*a9fa9459Szrj 103*a9fa9459Szrj struct bfd_link_info *link_info; 104*a9fa9459Szrj 105*a9fa9459Szrj /* Used by coff_find_nearest_line. */ 106*a9fa9459Szrj void * line_info; 107*a9fa9459Szrj 108*a9fa9459Szrj /* A place to stash dwarf2 info for this bfd. */ 109*a9fa9459Szrj void * dwarf2_find_line_info; 110*a9fa9459Szrj 111*a9fa9459Szrj /* The timestamp from the COFF file header. */ 112*a9fa9459Szrj long timestamp; 113*a9fa9459Szrj 114*a9fa9459Szrj /* Copy of some of the f_flags bits in the COFF filehdr structure, 115*a9fa9459Szrj used by ARM code. */ 116*a9fa9459Szrj flagword flags; 117*a9fa9459Szrj 118*a9fa9459Szrj /* coff-stgo32 EXE stub header after BFD tdata has been allocated. Its data 119*a9fa9459Szrj is kept in internal_filehdr.go32stub beforehand. */ 120*a9fa9459Szrj char *go32stub; 121*a9fa9459Szrj } coff_data_type; 122*a9fa9459Szrj 123*a9fa9459Szrj /* Tdata for pe image files. */ 124*a9fa9459Szrj typedef struct pe_tdata 125*a9fa9459Szrj { 126*a9fa9459Szrj coff_data_type coff; 127*a9fa9459Szrj struct internal_extra_pe_aouthdr pe_opthdr; 128*a9fa9459Szrj int dll; 129*a9fa9459Szrj int has_reloc_section; 130*a9fa9459Szrj int dont_strip_reloc; 131*a9fa9459Szrj bfd_boolean insert_timestamp; 132*a9fa9459Szrj bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *); 133*a9fa9459Szrj flagword real_flags; 134*a9fa9459Szrj 135*a9fa9459Szrj /* Build-id info. */ 136*a9fa9459Szrj struct 137*a9fa9459Szrj { 138*a9fa9459Szrj bfd_boolean (*after_write_object_contents) (bfd *); 139*a9fa9459Szrj const char *style; 140*a9fa9459Szrj asection *sec; 141*a9fa9459Szrj } build_id; 142*a9fa9459Szrj } pe_data_type; 143*a9fa9459Szrj 144*a9fa9459Szrj #define pe_data(bfd) ((bfd)->tdata.pe_obj_data) 145*a9fa9459Szrj 146*a9fa9459Szrj /* Tdata for XCOFF files. */ 147*a9fa9459Szrj 148*a9fa9459Szrj struct xcoff_tdata 149*a9fa9459Szrj { 150*a9fa9459Szrj /* Basic COFF information. */ 151*a9fa9459Szrj coff_data_type coff; 152*a9fa9459Szrj 153*a9fa9459Szrj /* TRUE if this is an XCOFF64 file. */ 154*a9fa9459Szrj bfd_boolean xcoff64; 155*a9fa9459Szrj 156*a9fa9459Szrj /* TRUE if a large a.out header should be generated. */ 157*a9fa9459Szrj bfd_boolean full_aouthdr; 158*a9fa9459Szrj 159*a9fa9459Szrj /* TOC value. */ 160*a9fa9459Szrj bfd_vma toc; 161*a9fa9459Szrj 162*a9fa9459Szrj /* Index of section holding TOC. */ 163*a9fa9459Szrj int sntoc; 164*a9fa9459Szrj 165*a9fa9459Szrj /* Index of section holding entry point. */ 166*a9fa9459Szrj int snentry; 167*a9fa9459Szrj 168*a9fa9459Szrj /* .text alignment from optional header. */ 169*a9fa9459Szrj int text_align_power; 170*a9fa9459Szrj 171*a9fa9459Szrj /* .data alignment from optional header. */ 172*a9fa9459Szrj int data_align_power; 173*a9fa9459Szrj 174*a9fa9459Szrj /* modtype from optional header. */ 175*a9fa9459Szrj short modtype; 176*a9fa9459Szrj 177*a9fa9459Szrj /* cputype from optional header. */ 178*a9fa9459Szrj short cputype; 179*a9fa9459Szrj 180*a9fa9459Szrj /* maxdata from optional header. */ 181*a9fa9459Szrj bfd_vma maxdata; 182*a9fa9459Szrj 183*a9fa9459Szrj /* maxstack from optional header. */ 184*a9fa9459Szrj bfd_vma maxstack; 185*a9fa9459Szrj 186*a9fa9459Szrj /* Used by the XCOFF backend linker. */ 187*a9fa9459Szrj asection **csects; 188*a9fa9459Szrj long *debug_indices; 189*a9fa9459Szrj unsigned int *lineno_counts; 190*a9fa9459Szrj unsigned int import_file_id; 191*a9fa9459Szrj }; 192*a9fa9459Szrj 193*a9fa9459Szrj #define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data) 194*a9fa9459Szrj 195*a9fa9459Szrj /* We take the address of the first element of an asymbol to ensure that the 196*a9fa9459Szrj macro is only ever applied to an asymbol. */ 197*a9fa9459Szrj #define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd))) 198*a9fa9459Szrj 199*a9fa9459Szrj /* Tdata for sections in XCOFF files. This is used by the linker. */ 200*a9fa9459Szrj 201*a9fa9459Szrj struct xcoff_section_tdata 202*a9fa9459Szrj { 203*a9fa9459Szrj /* Used for XCOFF csects created by the linker; points to the real 204*a9fa9459Szrj XCOFF section which contains this csect. */ 205*a9fa9459Szrj asection *enclosing; 206*a9fa9459Szrj /* The lineno_count field for the enclosing section, because we are 207*a9fa9459Szrj going to clobber it there. */ 208*a9fa9459Szrj unsigned int lineno_count; 209*a9fa9459Szrj /* The first and last symbol indices for symbols used by this csect. */ 210*a9fa9459Szrj unsigned long first_symndx; 211*a9fa9459Szrj unsigned long last_symndx; 212*a9fa9459Szrj }; 213*a9fa9459Szrj 214*a9fa9459Szrj /* An accessor macro the xcoff_section_tdata structure. */ 215*a9fa9459Szrj #define xcoff_section_data(abfd, sec) \ 216*a9fa9459Szrj ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata) 217*a9fa9459Szrj 218*a9fa9459Szrj /* Tdata for sections in PE files. */ 219*a9fa9459Szrj 220*a9fa9459Szrj struct pei_section_tdata 221*a9fa9459Szrj { 222*a9fa9459Szrj /* The virtual size of the section. */ 223*a9fa9459Szrj bfd_size_type virt_size; 224*a9fa9459Szrj /* The PE section flags. */ 225*a9fa9459Szrj long pe_flags; 226*a9fa9459Szrj }; 227*a9fa9459Szrj 228*a9fa9459Szrj /* An accessor macro for the pei_section_tdata structure. */ 229*a9fa9459Szrj #define pei_section_data(abfd, sec) \ 230*a9fa9459Szrj ((struct pei_section_tdata *) coff_section_data ((abfd), (sec))->tdata) 231*a9fa9459Szrj 232*a9fa9459Szrj /* COFF linker hash table entries. */ 233*a9fa9459Szrj 234*a9fa9459Szrj struct coff_link_hash_entry 235*a9fa9459Szrj { 236*a9fa9459Szrj struct bfd_link_hash_entry root; 237*a9fa9459Szrj 238*a9fa9459Szrj /* Symbol index in output file. Set to -1 initially. Set to -2 if 239*a9fa9459Szrj there is a reloc against this symbol. */ 240*a9fa9459Szrj long indx; 241*a9fa9459Szrj 242*a9fa9459Szrj /* Symbol type. */ 243*a9fa9459Szrj unsigned short type; 244*a9fa9459Szrj 245*a9fa9459Szrj /* Symbol class. */ 246*a9fa9459Szrj unsigned char symbol_class; 247*a9fa9459Szrj 248*a9fa9459Szrj /* Number of auxiliary entries. */ 249*a9fa9459Szrj char numaux; 250*a9fa9459Szrj 251*a9fa9459Szrj /* BFD to take auxiliary entries from. */ 252*a9fa9459Szrj bfd *auxbfd; 253*a9fa9459Szrj 254*a9fa9459Szrj /* Pointer to array of auxiliary entries, if any. */ 255*a9fa9459Szrj union internal_auxent *aux; 256*a9fa9459Szrj 257*a9fa9459Szrj /* Flag word; legal values follow. */ 258*a9fa9459Szrj unsigned short coff_link_hash_flags; 259*a9fa9459Szrj /* Symbol is a PE section symbol. */ 260*a9fa9459Szrj #define COFF_LINK_HASH_PE_SECTION_SYMBOL (01) 261*a9fa9459Szrj }; 262*a9fa9459Szrj 263*a9fa9459Szrj /* COFF linker hash table. */ 264*a9fa9459Szrj 265*a9fa9459Szrj struct coff_link_hash_table 266*a9fa9459Szrj { 267*a9fa9459Szrj struct bfd_link_hash_table root; 268*a9fa9459Szrj /* A pointer to information used to link stabs in sections. */ 269*a9fa9459Szrj struct stab_info stab_info; 270*a9fa9459Szrj }; 271*a9fa9459Szrj 272*a9fa9459Szrj struct coff_reloc_cookie 273*a9fa9459Szrj { 274*a9fa9459Szrj struct internal_reloc * rels; 275*a9fa9459Szrj struct internal_reloc * rel; 276*a9fa9459Szrj struct internal_reloc * relend; 277*a9fa9459Szrj struct coff_symbol_struct * symbols; /* Symtab for input bfd. */ 278*a9fa9459Szrj bfd * abfd; 279*a9fa9459Szrj struct coff_link_hash_entry ** sym_hashes; 280*a9fa9459Szrj }; 281*a9fa9459Szrj 282*a9fa9459Szrj /* Look up an entry in a COFF linker hash table. */ 283*a9fa9459Szrj 284*a9fa9459Szrj #define coff_link_hash_lookup(table, string, create, copy, follow) \ 285*a9fa9459Szrj ((struct coff_link_hash_entry *) \ 286*a9fa9459Szrj bfd_link_hash_lookup (&(table)->root, (string), (create), \ 287*a9fa9459Szrj (copy), (follow))) 288*a9fa9459Szrj 289*a9fa9459Szrj /* Traverse a COFF linker hash table. */ 290*a9fa9459Szrj 291*a9fa9459Szrj #define coff_link_hash_traverse(table, func, info) \ 292*a9fa9459Szrj (bfd_link_hash_traverse \ 293*a9fa9459Szrj (&(table)->root, \ 294*a9fa9459Szrj (bfd_boolean (*) (struct bfd_link_hash_entry *, void *)) (func), \ 295*a9fa9459Szrj (info))) 296*a9fa9459Szrj 297*a9fa9459Szrj /* Get the COFF linker hash table from a link_info structure. */ 298*a9fa9459Szrj 299*a9fa9459Szrj #define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash)) 300*a9fa9459Szrj 301*a9fa9459Szrj /* Functions in coffgen.c. */ 302*a9fa9459Szrj extern const bfd_target *coff_object_p 303*a9fa9459Szrj (bfd *); 304*a9fa9459Szrj extern struct bfd_section *coff_section_from_bfd_index 305*a9fa9459Szrj (bfd *, int); 306*a9fa9459Szrj extern long coff_get_symtab_upper_bound 307*a9fa9459Szrj (bfd *); 308*a9fa9459Szrj extern long coff_canonicalize_symtab 309*a9fa9459Szrj (bfd *, asymbol **); 310*a9fa9459Szrj extern int coff_count_linenumbers 311*a9fa9459Szrj (bfd *); 312*a9fa9459Szrj extern bfd_boolean coff_renumber_symbols 313*a9fa9459Szrj (bfd *, int *); 314*a9fa9459Szrj extern void coff_mangle_symbols 315*a9fa9459Szrj (bfd *); 316*a9fa9459Szrj extern bfd_boolean coff_write_symbols 317*a9fa9459Szrj (bfd *); 318*a9fa9459Szrj extern bfd_boolean coff_write_alien_symbol 319*a9fa9459Szrj (bfd *, asymbol *, struct internal_syment *, union internal_auxent *, 320*a9fa9459Szrj bfd_vma *, bfd_size_type *, asection **, bfd_size_type *); 321*a9fa9459Szrj extern bfd_boolean coff_write_linenumbers 322*a9fa9459Szrj (bfd *); 323*a9fa9459Szrj extern alent *coff_get_lineno 324*a9fa9459Szrj (bfd *, asymbol *); 325*a9fa9459Szrj extern asymbol *coff_section_symbol 326*a9fa9459Szrj (bfd *, char *); 327*a9fa9459Szrj extern bfd_boolean _bfd_coff_get_external_symbols 328*a9fa9459Szrj (bfd *); 329*a9fa9459Szrj extern const char *_bfd_coff_read_string_table 330*a9fa9459Szrj (bfd *); 331*a9fa9459Szrj extern bfd_boolean _bfd_coff_free_symbols 332*a9fa9459Szrj (bfd *); 333*a9fa9459Szrj extern struct coff_ptr_struct *coff_get_normalized_symtab 334*a9fa9459Szrj (bfd *); 335*a9fa9459Szrj extern long coff_get_reloc_upper_bound 336*a9fa9459Szrj (bfd *, sec_ptr); 337*a9fa9459Szrj extern asymbol *coff_make_empty_symbol 338*a9fa9459Szrj (bfd *); 339*a9fa9459Szrj extern void coff_print_symbol 340*a9fa9459Szrj (bfd *, void * filep, asymbol *, bfd_print_symbol_type); 341*a9fa9459Szrj extern void coff_get_symbol_info 342*a9fa9459Szrj (bfd *, asymbol *, symbol_info *ret); 343*a9fa9459Szrj #define coff_get_symbol_version_string \ 344*a9fa9459Szrj _bfd_nosymbols_get_symbol_version_string 345*a9fa9459Szrj extern bfd_boolean _bfd_coff_is_local_label_name 346*a9fa9459Szrj (bfd *, const char *); 347*a9fa9459Szrj extern asymbol *coff_bfd_make_debug_symbol 348*a9fa9459Szrj (bfd *, void *, unsigned long); 349*a9fa9459Szrj extern bfd_boolean coff_find_nearest_line 350*a9fa9459Szrj (bfd *, asymbol **, asection *, bfd_vma, 351*a9fa9459Szrj const char **, const char **, unsigned int *, unsigned int *); 352*a9fa9459Szrj #define coff_find_line _bfd_nosymbols_find_line 353*a9fa9459Szrj struct dwarf_debug_section; 354*a9fa9459Szrj extern bfd_boolean coff_find_nearest_line_with_names 355*a9fa9459Szrj (bfd *, asymbol **, asection *, bfd_vma, const char **, const char **, 356*a9fa9459Szrj unsigned int *, const struct dwarf_debug_section *); 357*a9fa9459Szrj extern bfd_boolean coff_find_inliner_info 358*a9fa9459Szrj (bfd *, const char **, const char **, unsigned int *); 359*a9fa9459Szrj extern int coff_sizeof_headers 360*a9fa9459Szrj (bfd *, struct bfd_link_info *); 361*a9fa9459Szrj extern bfd_boolean bfd_coff_reloc16_relax_section 362*a9fa9459Szrj (bfd *, asection *, struct bfd_link_info *, bfd_boolean *); 363*a9fa9459Szrj extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents 364*a9fa9459Szrj (bfd *, struct bfd_link_info *, struct bfd_link_order *, 365*a9fa9459Szrj bfd_byte *, bfd_boolean, asymbol **); 366*a9fa9459Szrj extern bfd_vma bfd_coff_reloc16_get_value 367*a9fa9459Szrj (arelent *, struct bfd_link_info *, asection *); 368*a9fa9459Szrj extern void bfd_perform_slip 369*a9fa9459Szrj (bfd *, unsigned int, asection *, bfd_vma); 370*a9fa9459Szrj 371*a9fa9459Szrj /* Functions and types in cofflink.c. */ 372*a9fa9459Szrj 373*a9fa9459Szrj #define STRING_SIZE_SIZE 4 374*a9fa9459Szrj 375*a9fa9459Szrj /* We use a hash table to merge identical enum, struct, and union 376*a9fa9459Szrj definitions in the linker. */ 377*a9fa9459Szrj 378*a9fa9459Szrj /* Information we keep for a single element (an enum value, a 379*a9fa9459Szrj structure or union field) in the debug merge hash table. */ 380*a9fa9459Szrj 381*a9fa9459Szrj struct coff_debug_merge_element 382*a9fa9459Szrj { 383*a9fa9459Szrj /* Next element. */ 384*a9fa9459Szrj struct coff_debug_merge_element *next; 385*a9fa9459Szrj 386*a9fa9459Szrj /* Name. */ 387*a9fa9459Szrj const char *name; 388*a9fa9459Szrj 389*a9fa9459Szrj /* Type. */ 390*a9fa9459Szrj unsigned int type; 391*a9fa9459Szrj 392*a9fa9459Szrj /* Symbol index for complex type. */ 393*a9fa9459Szrj long tagndx; 394*a9fa9459Szrj }; 395*a9fa9459Szrj 396*a9fa9459Szrj /* A linked list of debug merge entries for a given name. */ 397*a9fa9459Szrj 398*a9fa9459Szrj struct coff_debug_merge_type 399*a9fa9459Szrj { 400*a9fa9459Szrj /* Next type with the same name. */ 401*a9fa9459Szrj struct coff_debug_merge_type *next; 402*a9fa9459Szrj 403*a9fa9459Szrj /* Class of type. */ 404*a9fa9459Szrj int type_class; 405*a9fa9459Szrj 406*a9fa9459Szrj /* Symbol index where this type is defined. */ 407*a9fa9459Szrj long indx; 408*a9fa9459Szrj 409*a9fa9459Szrj /* List of elements. */ 410*a9fa9459Szrj struct coff_debug_merge_element *elements; 411*a9fa9459Szrj }; 412*a9fa9459Szrj 413*a9fa9459Szrj /* Information we store in the debug merge hash table. */ 414*a9fa9459Szrj 415*a9fa9459Szrj struct coff_debug_merge_hash_entry 416*a9fa9459Szrj { 417*a9fa9459Szrj struct bfd_hash_entry root; 418*a9fa9459Szrj 419*a9fa9459Szrj /* A list of types with this name. */ 420*a9fa9459Szrj struct coff_debug_merge_type *types; 421*a9fa9459Szrj }; 422*a9fa9459Szrj 423*a9fa9459Szrj /* The debug merge hash table. */ 424*a9fa9459Szrj 425*a9fa9459Szrj struct coff_debug_merge_hash_table 426*a9fa9459Szrj { 427*a9fa9459Szrj struct bfd_hash_table root; 428*a9fa9459Szrj }; 429*a9fa9459Szrj 430*a9fa9459Szrj /* Initialize a COFF debug merge hash table. */ 431*a9fa9459Szrj 432*a9fa9459Szrj #define coff_debug_merge_hash_table_init(table) \ 433*a9fa9459Szrj (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc, \ 434*a9fa9459Szrj sizeof (struct coff_debug_merge_hash_entry))) 435*a9fa9459Szrj 436*a9fa9459Szrj /* Free a COFF debug merge hash table. */ 437*a9fa9459Szrj 438*a9fa9459Szrj #define coff_debug_merge_hash_table_free(table) \ 439*a9fa9459Szrj (bfd_hash_table_free (&(table)->root)) 440*a9fa9459Szrj 441*a9fa9459Szrj /* Look up an entry in a COFF debug merge hash table. */ 442*a9fa9459Szrj 443*a9fa9459Szrj #define coff_debug_merge_hash_lookup(table, string, create, copy) \ 444*a9fa9459Szrj ((struct coff_debug_merge_hash_entry *) \ 445*a9fa9459Szrj bfd_hash_lookup (&(table)->root, (string), (create), (copy))) 446*a9fa9459Szrj 447*a9fa9459Szrj /* Information we keep for each section in the output file when doing 448*a9fa9459Szrj a relocatable link. */ 449*a9fa9459Szrj 450*a9fa9459Szrj struct coff_link_section_info 451*a9fa9459Szrj { 452*a9fa9459Szrj /* The relocs to be output. */ 453*a9fa9459Szrj struct internal_reloc *relocs; 454*a9fa9459Szrj /* For each reloc against a global symbol whose index was not known 455*a9fa9459Szrj when the reloc was handled, the global hash table entry. */ 456*a9fa9459Szrj struct coff_link_hash_entry **rel_hashes; 457*a9fa9459Szrj }; 458*a9fa9459Szrj 459*a9fa9459Szrj /* Information that we pass around while doing the final link step. */ 460*a9fa9459Szrj 461*a9fa9459Szrj struct coff_final_link_info 462*a9fa9459Szrj { 463*a9fa9459Szrj /* General link information. */ 464*a9fa9459Szrj struct bfd_link_info *info; 465*a9fa9459Szrj /* Output BFD. */ 466*a9fa9459Szrj bfd *output_bfd; 467*a9fa9459Szrj /* Used to indicate failure in traversal routine. */ 468*a9fa9459Szrj bfd_boolean failed; 469*a9fa9459Szrj /* If doing "task linking" set only during the time when we want the 470*a9fa9459Szrj global symbol writer to convert the storage class of defined global 471*a9fa9459Szrj symbols from global to static. */ 472*a9fa9459Szrj bfd_boolean global_to_static; 473*a9fa9459Szrj /* Hash table for long symbol names. */ 474*a9fa9459Szrj struct bfd_strtab_hash *strtab; 475*a9fa9459Szrj /* When doing a relocatable link, an array of information kept for 476*a9fa9459Szrj each output section, indexed by the target_index field. */ 477*a9fa9459Szrj struct coff_link_section_info *section_info; 478*a9fa9459Szrj /* Symbol index of last C_FILE symbol (-1 if none). */ 479*a9fa9459Szrj long last_file_index; 480*a9fa9459Szrj /* Contents of last C_FILE symbol. */ 481*a9fa9459Szrj struct internal_syment last_file; 482*a9fa9459Szrj /* Symbol index of first aux entry of last .bf symbol with an empty 483*a9fa9459Szrj endndx field (-1 if none). */ 484*a9fa9459Szrj long last_bf_index; 485*a9fa9459Szrj /* Contents of last_bf_index aux entry. */ 486*a9fa9459Szrj union internal_auxent last_bf; 487*a9fa9459Szrj /* Hash table used to merge debug information. */ 488*a9fa9459Szrj struct coff_debug_merge_hash_table debug_merge; 489*a9fa9459Szrj /* Buffer large enough to hold swapped symbols of any input file. */ 490*a9fa9459Szrj struct internal_syment *internal_syms; 491*a9fa9459Szrj /* Buffer large enough to hold sections of symbols of any input file. */ 492*a9fa9459Szrj asection **sec_ptrs; 493*a9fa9459Szrj /* Buffer large enough to hold output indices of symbols of any 494*a9fa9459Szrj input file. */ 495*a9fa9459Szrj long *sym_indices; 496*a9fa9459Szrj /* Buffer large enough to hold output symbols for any input file. */ 497*a9fa9459Szrj bfd_byte *outsyms; 498*a9fa9459Szrj /* Buffer large enough to hold external line numbers for any input 499*a9fa9459Szrj section. */ 500*a9fa9459Szrj bfd_byte *linenos; 501*a9fa9459Szrj /* Buffer large enough to hold any input section. */ 502*a9fa9459Szrj bfd_byte *contents; 503*a9fa9459Szrj /* Buffer large enough to hold external relocs of any input section. */ 504*a9fa9459Szrj bfd_byte *external_relocs; 505*a9fa9459Szrj /* Buffer large enough to hold swapped relocs of any input section. */ 506*a9fa9459Szrj struct internal_reloc *internal_relocs; 507*a9fa9459Szrj }; 508*a9fa9459Szrj 509*a9fa9459Szrj /* Most COFF variants have no way to record the alignment of a 510*a9fa9459Szrj section. This struct is used to set a specific alignment based on 511*a9fa9459Szrj the name of the section. */ 512*a9fa9459Szrj 513*a9fa9459Szrj struct coff_section_alignment_entry 514*a9fa9459Szrj { 515*a9fa9459Szrj /* The section name. */ 516*a9fa9459Szrj const char *name; 517*a9fa9459Szrj 518*a9fa9459Szrj /* This is either (unsigned int) -1, indicating that the section 519*a9fa9459Szrj name must match exactly, or it is the number of letters which 520*a9fa9459Szrj must match at the start of the name. */ 521*a9fa9459Szrj unsigned int comparison_length; 522*a9fa9459Szrj 523*a9fa9459Szrj /* These macros may be used to fill in the first two fields in a 524*a9fa9459Szrj structure initialization. */ 525*a9fa9459Szrj #define COFF_SECTION_NAME_EXACT_MATCH(name) (name), ((unsigned int) -1) 526*a9fa9459Szrj #define COFF_SECTION_NAME_PARTIAL_MATCH(name) (name), (sizeof (name) - 1) 527*a9fa9459Szrj 528*a9fa9459Szrj /* Only use this entry if the default section alignment for this 529*a9fa9459Szrj target is at least that much (as a power of two). If this field 530*a9fa9459Szrj is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */ 531*a9fa9459Szrj unsigned int default_alignment_min; 532*a9fa9459Szrj 533*a9fa9459Szrj /* Only use this entry if the default section alignment for this 534*a9fa9459Szrj target is no greater than this (as a power of two). If this 535*a9fa9459Szrj field is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */ 536*a9fa9459Szrj unsigned int default_alignment_max; 537*a9fa9459Szrj 538*a9fa9459Szrj #define COFF_ALIGNMENT_FIELD_EMPTY ((unsigned int) -1) 539*a9fa9459Szrj 540*a9fa9459Szrj /* The desired alignment for this section (as a power of two). */ 541*a9fa9459Szrj unsigned int alignment_power; 542*a9fa9459Szrj }; 543*a9fa9459Szrj 544*a9fa9459Szrj extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc 545*a9fa9459Szrj (struct bfd_hash_entry *, struct bfd_hash_table *, const char *); 546*a9fa9459Szrj extern bfd_boolean _bfd_coff_link_hash_table_init 547*a9fa9459Szrj (struct coff_link_hash_table *, bfd *, 548*a9fa9459Szrj struct bfd_hash_entry *(*) (struct bfd_hash_entry *, 549*a9fa9459Szrj struct bfd_hash_table *, 550*a9fa9459Szrj const char *), 551*a9fa9459Szrj unsigned int); 552*a9fa9459Szrj extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create 553*a9fa9459Szrj (bfd *); 554*a9fa9459Szrj extern const char *_bfd_coff_internal_syment_name 555*a9fa9459Szrj (bfd *, const struct internal_syment *, char *); 556*a9fa9459Szrj extern bfd_boolean _bfd_coff_section_already_linked 557*a9fa9459Szrj (bfd *, asection *, struct bfd_link_info *); 558*a9fa9459Szrj extern bfd_boolean _bfd_coff_link_add_symbols 559*a9fa9459Szrj (bfd *, struct bfd_link_info *); 560*a9fa9459Szrj extern bfd_boolean _bfd_coff_final_link 561*a9fa9459Szrj (bfd *, struct bfd_link_info *); 562*a9fa9459Szrj extern struct internal_reloc *_bfd_coff_read_internal_relocs 563*a9fa9459Szrj (bfd *, asection *, bfd_boolean, bfd_byte *, bfd_boolean, 564*a9fa9459Szrj struct internal_reloc *); 565*a9fa9459Szrj extern bfd_boolean _bfd_coff_generic_relocate_section 566*a9fa9459Szrj (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 567*a9fa9459Szrj struct internal_reloc *, struct internal_syment *, asection **); 568*a9fa9459Szrj extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc 569*a9fa9459Szrj (struct bfd_hash_entry *, struct bfd_hash_table *, const char *); 570*a9fa9459Szrj extern bfd_boolean _bfd_coff_write_global_sym 571*a9fa9459Szrj (struct bfd_hash_entry *, void *); 572*a9fa9459Szrj extern bfd_boolean _bfd_coff_write_task_globals 573*a9fa9459Szrj (struct coff_link_hash_entry *, void *); 574*a9fa9459Szrj extern bfd_boolean _bfd_coff_link_input_bfd 575*a9fa9459Szrj (struct coff_final_link_info *, bfd *); 576*a9fa9459Szrj extern bfd_boolean _bfd_coff_reloc_link_order 577*a9fa9459Szrj (bfd *, struct coff_final_link_info *, asection *, 578*a9fa9459Szrj struct bfd_link_order *); 579*a9fa9459Szrj extern bfd_boolean bfd_coff_gc_sections 580*a9fa9459Szrj (bfd *, struct bfd_link_info *); 581*a9fa9459Szrj 582*a9fa9459Szrj 583*a9fa9459Szrj #define coff_get_section_contents_in_window \ 584*a9fa9459Szrj _bfd_generic_get_section_contents_in_window 585*a9fa9459Szrj 586*a9fa9459Szrj /* Functions in xcofflink.c. */ 587*a9fa9459Szrj 588*a9fa9459Szrj extern long _bfd_xcoff_get_dynamic_symtab_upper_bound 589*a9fa9459Szrj (bfd *); 590*a9fa9459Szrj extern long _bfd_xcoff_canonicalize_dynamic_symtab 591*a9fa9459Szrj (bfd *, asymbol **); 592*a9fa9459Szrj extern long _bfd_xcoff_get_dynamic_reloc_upper_bound 593*a9fa9459Szrj (bfd *); 594*a9fa9459Szrj extern long _bfd_xcoff_canonicalize_dynamic_reloc 595*a9fa9459Szrj (bfd *, arelent **, asymbol **); 596*a9fa9459Szrj extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create 597*a9fa9459Szrj (bfd *); 598*a9fa9459Szrj extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols 599*a9fa9459Szrj (bfd *, struct bfd_link_info *); 600*a9fa9459Szrj extern bfd_boolean _bfd_xcoff_bfd_final_link 601*a9fa9459Szrj (bfd *, struct bfd_link_info *); 602*a9fa9459Szrj extern bfd_boolean _bfd_xcoff_define_common_symbol 603*a9fa9459Szrj (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *); 604*a9fa9459Szrj extern bfd_boolean _bfd_ppc_xcoff_relocate_section 605*a9fa9459Szrj (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 606*a9fa9459Szrj struct internal_reloc *, struct internal_syment *, asection **); 607*a9fa9459Szrj 608*a9fa9459Szrj /* Functions in coff-ppc.c. FIXME: These are called by pe.em in the 609*a9fa9459Szrj linker, and so should start with bfd and be declared in bfd.h. */ 610*a9fa9459Szrj 611*a9fa9459Szrj extern bfd_boolean ppc_allocate_toc_section 612*a9fa9459Szrj (struct bfd_link_info *); 613*a9fa9459Szrj extern bfd_boolean ppc_process_before_allocation 614*a9fa9459Szrj (bfd *, struct bfd_link_info *); 615*a9fa9459Szrj /* Extracted from coffcode.h. */ 616*a9fa9459Szrj 617*a9fa9459Szrj typedef struct coff_ptr_struct 618*a9fa9459Szrj { 619*a9fa9459Szrj /* Remembers the offset from the first symbol in the file for 620*a9fa9459Szrj this symbol. Generated by coff_renumber_symbols. */ 621*a9fa9459Szrj unsigned int offset; 622*a9fa9459Szrj 623*a9fa9459Szrj /* Should the value of this symbol be renumbered. Used for 624*a9fa9459Szrj XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */ 625*a9fa9459Szrj unsigned int fix_value : 1; 626*a9fa9459Szrj 627*a9fa9459Szrj /* Should the tag field of this symbol be renumbered. 628*a9fa9459Szrj Created by coff_pointerize_aux. */ 629*a9fa9459Szrj unsigned int fix_tag : 1; 630*a9fa9459Szrj 631*a9fa9459Szrj /* Should the endidx field of this symbol be renumbered. 632*a9fa9459Szrj Created by coff_pointerize_aux. */ 633*a9fa9459Szrj unsigned int fix_end : 1; 634*a9fa9459Szrj 635*a9fa9459Szrj /* Should the x_csect.x_scnlen field be renumbered. 636*a9fa9459Szrj Created by coff_pointerize_aux. */ 637*a9fa9459Szrj unsigned int fix_scnlen : 1; 638*a9fa9459Szrj 639*a9fa9459Szrj /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the 640*a9fa9459Szrj index into the line number entries. Set by coff_slurp_symbol_table. */ 641*a9fa9459Szrj unsigned int fix_line : 1; 642*a9fa9459Szrj 643*a9fa9459Szrj /* The container for the symbol structure as read and translated 644*a9fa9459Szrj from the file. */ 645*a9fa9459Szrj union 646*a9fa9459Szrj { 647*a9fa9459Szrj union internal_auxent auxent; 648*a9fa9459Szrj struct internal_syment syment; 649*a9fa9459Szrj } u; 650*a9fa9459Szrj 651*a9fa9459Szrj /* Selector for the union above. */ 652*a9fa9459Szrj bfd_boolean is_sym; 653*a9fa9459Szrj } combined_entry_type; 654*a9fa9459Szrj 655*a9fa9459Szrj 656*a9fa9459Szrj /* Each canonical asymbol really looks like this: */ 657*a9fa9459Szrj 658*a9fa9459Szrj typedef struct coff_symbol_struct 659*a9fa9459Szrj { 660*a9fa9459Szrj /* The actual symbol which the rest of BFD works with */ 661*a9fa9459Szrj asymbol symbol; 662*a9fa9459Szrj 663*a9fa9459Szrj /* A pointer to the hidden information for this symbol */ 664*a9fa9459Szrj combined_entry_type *native; 665*a9fa9459Szrj 666*a9fa9459Szrj /* A pointer to the linenumber information for this symbol */ 667*a9fa9459Szrj struct lineno_cache_entry *lineno; 668*a9fa9459Szrj 669*a9fa9459Szrj /* Have the line numbers been relocated yet ? */ 670*a9fa9459Szrj bfd_boolean done_lineno; 671*a9fa9459Szrj } coff_symbol_type; 672*a9fa9459Szrj /* COFF symbol classifications. */ 673*a9fa9459Szrj 674*a9fa9459Szrj enum coff_symbol_classification 675*a9fa9459Szrj { 676*a9fa9459Szrj /* Global symbol. */ 677*a9fa9459Szrj COFF_SYMBOL_GLOBAL, 678*a9fa9459Szrj /* Common symbol. */ 679*a9fa9459Szrj COFF_SYMBOL_COMMON, 680*a9fa9459Szrj /* Undefined symbol. */ 681*a9fa9459Szrj COFF_SYMBOL_UNDEFINED, 682*a9fa9459Szrj /* Local symbol. */ 683*a9fa9459Szrj COFF_SYMBOL_LOCAL, 684*a9fa9459Szrj /* PE section symbol. */ 685*a9fa9459Szrj COFF_SYMBOL_PE_SECTION 686*a9fa9459Szrj }; 687*a9fa9459Szrj 688*a9fa9459Szrj typedef asection * (*coff_gc_mark_hook_fn) 689*a9fa9459Szrj (asection *, struct bfd_link_info *, struct internal_reloc *, 690*a9fa9459Szrj struct coff_link_hash_entry *, struct internal_syment *); 691*a9fa9459Szrj 692*a9fa9459Szrj typedef struct 693*a9fa9459Szrj { 694*a9fa9459Szrj void (*_bfd_coff_swap_aux_in) 695*a9fa9459Szrj (bfd *, void *, int, int, int, int, void *); 696*a9fa9459Szrj 697*a9fa9459Szrj void (*_bfd_coff_swap_sym_in) 698*a9fa9459Szrj (bfd *, void *, void *); 699*a9fa9459Szrj 700*a9fa9459Szrj void (*_bfd_coff_swap_lineno_in) 701*a9fa9459Szrj (bfd *, void *, void *); 702*a9fa9459Szrj 703*a9fa9459Szrj unsigned int (*_bfd_coff_swap_aux_out) 704*a9fa9459Szrj (bfd *, void *, int, int, int, int, void *); 705*a9fa9459Szrj 706*a9fa9459Szrj unsigned int (*_bfd_coff_swap_sym_out) 707*a9fa9459Szrj (bfd *, void *, void *); 708*a9fa9459Szrj 709*a9fa9459Szrj unsigned int (*_bfd_coff_swap_lineno_out) 710*a9fa9459Szrj (bfd *, void *, void *); 711*a9fa9459Szrj 712*a9fa9459Szrj unsigned int (*_bfd_coff_swap_reloc_out) 713*a9fa9459Szrj (bfd *, void *, void *); 714*a9fa9459Szrj 715*a9fa9459Szrj unsigned int (*_bfd_coff_swap_filehdr_out) 716*a9fa9459Szrj (bfd *, void *, void *); 717*a9fa9459Szrj 718*a9fa9459Szrj unsigned int (*_bfd_coff_swap_aouthdr_out) 719*a9fa9459Szrj (bfd *, void *, void *); 720*a9fa9459Szrj 721*a9fa9459Szrj unsigned int (*_bfd_coff_swap_scnhdr_out) 722*a9fa9459Szrj (bfd *, void *, void *); 723*a9fa9459Szrj 724*a9fa9459Szrj unsigned int _bfd_filhsz; 725*a9fa9459Szrj unsigned int _bfd_aoutsz; 726*a9fa9459Szrj unsigned int _bfd_scnhsz; 727*a9fa9459Szrj unsigned int _bfd_symesz; 728*a9fa9459Szrj unsigned int _bfd_auxesz; 729*a9fa9459Szrj unsigned int _bfd_relsz; 730*a9fa9459Szrj unsigned int _bfd_linesz; 731*a9fa9459Szrj unsigned int _bfd_filnmlen; 732*a9fa9459Szrj bfd_boolean _bfd_coff_long_filenames; 733*a9fa9459Szrj 734*a9fa9459Szrj bfd_boolean _bfd_coff_long_section_names; 735*a9fa9459Szrj bfd_boolean (*_bfd_coff_set_long_section_names) 736*a9fa9459Szrj (bfd *, int); 737*a9fa9459Szrj 738*a9fa9459Szrj unsigned int _bfd_coff_default_section_alignment_power; 739*a9fa9459Szrj bfd_boolean _bfd_coff_force_symnames_in_strings; 740*a9fa9459Szrj unsigned int _bfd_coff_debug_string_prefix_length; 741*a9fa9459Szrj unsigned int _bfd_coff_max_nscns; 742*a9fa9459Szrj 743*a9fa9459Szrj void (*_bfd_coff_swap_filehdr_in) 744*a9fa9459Szrj (bfd *, void *, void *); 745*a9fa9459Szrj 746*a9fa9459Szrj void (*_bfd_coff_swap_aouthdr_in) 747*a9fa9459Szrj (bfd *, void *, void *); 748*a9fa9459Szrj 749*a9fa9459Szrj void (*_bfd_coff_swap_scnhdr_in) 750*a9fa9459Szrj (bfd *, void *, void *); 751*a9fa9459Szrj 752*a9fa9459Szrj void (*_bfd_coff_swap_reloc_in) 753*a9fa9459Szrj (bfd *abfd, void *, void *); 754*a9fa9459Szrj 755*a9fa9459Szrj bfd_boolean (*_bfd_coff_bad_format_hook) 756*a9fa9459Szrj (bfd *, void *); 757*a9fa9459Szrj 758*a9fa9459Szrj bfd_boolean (*_bfd_coff_set_arch_mach_hook) 759*a9fa9459Szrj (bfd *, void *); 760*a9fa9459Szrj 761*a9fa9459Szrj void * (*_bfd_coff_mkobject_hook) 762*a9fa9459Szrj (bfd *, void *, void *); 763*a9fa9459Szrj 764*a9fa9459Szrj bfd_boolean (*_bfd_styp_to_sec_flags_hook) 765*a9fa9459Szrj (bfd *, void *, const char *, asection *, flagword *); 766*a9fa9459Szrj 767*a9fa9459Szrj void (*_bfd_set_alignment_hook) 768*a9fa9459Szrj (bfd *, asection *, void *); 769*a9fa9459Szrj 770*a9fa9459Szrj bfd_boolean (*_bfd_coff_slurp_symbol_table) 771*a9fa9459Szrj (bfd *); 772*a9fa9459Szrj 773*a9fa9459Szrj bfd_boolean (*_bfd_coff_symname_in_debug) 774*a9fa9459Szrj (bfd *, struct internal_syment *); 775*a9fa9459Szrj 776*a9fa9459Szrj bfd_boolean (*_bfd_coff_pointerize_aux_hook) 777*a9fa9459Szrj (bfd *, combined_entry_type *, combined_entry_type *, 778*a9fa9459Szrj unsigned int, combined_entry_type *); 779*a9fa9459Szrj 780*a9fa9459Szrj bfd_boolean (*_bfd_coff_print_aux) 781*a9fa9459Szrj (bfd *, FILE *, combined_entry_type *, combined_entry_type *, 782*a9fa9459Szrj combined_entry_type *, unsigned int); 783*a9fa9459Szrj 784*a9fa9459Szrj void (*_bfd_coff_reloc16_extra_cases) 785*a9fa9459Szrj (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, 786*a9fa9459Szrj bfd_byte *, unsigned int *, unsigned int *); 787*a9fa9459Szrj 788*a9fa9459Szrj int (*_bfd_coff_reloc16_estimate) 789*a9fa9459Szrj (bfd *, asection *, arelent *, unsigned int, 790*a9fa9459Szrj struct bfd_link_info *); 791*a9fa9459Szrj 792*a9fa9459Szrj enum coff_symbol_classification (*_bfd_coff_classify_symbol) 793*a9fa9459Szrj (bfd *, struct internal_syment *); 794*a9fa9459Szrj 795*a9fa9459Szrj bfd_boolean (*_bfd_coff_compute_section_file_positions) 796*a9fa9459Szrj (bfd *); 797*a9fa9459Szrj 798*a9fa9459Szrj bfd_boolean (*_bfd_coff_start_final_link) 799*a9fa9459Szrj (bfd *, struct bfd_link_info *); 800*a9fa9459Szrj 801*a9fa9459Szrj bfd_boolean (*_bfd_coff_relocate_section) 802*a9fa9459Szrj (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 803*a9fa9459Szrj struct internal_reloc *, struct internal_syment *, asection **); 804*a9fa9459Szrj 805*a9fa9459Szrj reloc_howto_type *(*_bfd_coff_rtype_to_howto) 806*a9fa9459Szrj (bfd *, asection *, struct internal_reloc *, 807*a9fa9459Szrj struct coff_link_hash_entry *, struct internal_syment *, 808*a9fa9459Szrj bfd_vma *); 809*a9fa9459Szrj 810*a9fa9459Szrj bfd_boolean (*_bfd_coff_adjust_symndx) 811*a9fa9459Szrj (bfd *, struct bfd_link_info *, bfd *, asection *, 812*a9fa9459Szrj struct internal_reloc *, bfd_boolean *); 813*a9fa9459Szrj 814*a9fa9459Szrj bfd_boolean (*_bfd_coff_link_add_one_symbol) 815*a9fa9459Szrj (struct bfd_link_info *, bfd *, const char *, flagword, 816*a9fa9459Szrj asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean, 817*a9fa9459Szrj struct bfd_link_hash_entry **); 818*a9fa9459Szrj 819*a9fa9459Szrj bfd_boolean (*_bfd_coff_link_output_has_begun) 820*a9fa9459Szrj (bfd *, struct coff_final_link_info *); 821*a9fa9459Szrj 822*a9fa9459Szrj bfd_boolean (*_bfd_coff_final_link_postscript) 823*a9fa9459Szrj (bfd *, struct coff_final_link_info *); 824*a9fa9459Szrj 825*a9fa9459Szrj bfd_boolean (*_bfd_coff_print_pdata) 826*a9fa9459Szrj (bfd *, void *); 827*a9fa9459Szrj 828*a9fa9459Szrj } bfd_coff_backend_data; 829*a9fa9459Szrj 830*a9fa9459Szrj #define coff_backend_info(abfd) \ 831*a9fa9459Szrj ((bfd_coff_backend_data *) (abfd)->xvec->backend_data) 832*a9fa9459Szrj 833*a9fa9459Szrj #define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \ 834*a9fa9459Szrj ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i)) 835*a9fa9459Szrj 836*a9fa9459Szrj #define bfd_coff_swap_sym_in(a,e,i) \ 837*a9fa9459Szrj ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i)) 838*a9fa9459Szrj 839*a9fa9459Szrj #define bfd_coff_swap_lineno_in(a,e,i) \ 840*a9fa9459Szrj ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i)) 841*a9fa9459Szrj 842*a9fa9459Szrj #define bfd_coff_swap_reloc_out(abfd, i, o) \ 843*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o)) 844*a9fa9459Szrj 845*a9fa9459Szrj #define bfd_coff_swap_lineno_out(abfd, i, o) \ 846*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o)) 847*a9fa9459Szrj 848*a9fa9459Szrj #define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \ 849*a9fa9459Szrj ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o)) 850*a9fa9459Szrj 851*a9fa9459Szrj #define bfd_coff_swap_sym_out(abfd, i,o) \ 852*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o)) 853*a9fa9459Szrj 854*a9fa9459Szrj #define bfd_coff_swap_scnhdr_out(abfd, i,o) \ 855*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o)) 856*a9fa9459Szrj 857*a9fa9459Szrj #define bfd_coff_swap_filehdr_out(abfd, i,o) \ 858*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o)) 859*a9fa9459Szrj 860*a9fa9459Szrj #define bfd_coff_swap_aouthdr_out(abfd, i,o) \ 861*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o)) 862*a9fa9459Szrj 863*a9fa9459Szrj #define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz) 864*a9fa9459Szrj #define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz) 865*a9fa9459Szrj #define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz) 866*a9fa9459Szrj #define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz) 867*a9fa9459Szrj #define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz) 868*a9fa9459Szrj #define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz) 869*a9fa9459Szrj #define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz) 870*a9fa9459Szrj #define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen) 871*a9fa9459Szrj #define bfd_coff_long_filenames(abfd) \ 872*a9fa9459Szrj (coff_backend_info (abfd)->_bfd_coff_long_filenames) 873*a9fa9459Szrj #define bfd_coff_long_section_names(abfd) \ 874*a9fa9459Szrj (coff_backend_info (abfd)->_bfd_coff_long_section_names) 875*a9fa9459Szrj #define bfd_coff_set_long_section_names(abfd, enable) \ 876*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) 877*a9fa9459Szrj #define bfd_coff_default_section_alignment_power(abfd) \ 878*a9fa9459Szrj (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) 879*a9fa9459Szrj #define bfd_coff_max_nscns(abfd) \ 880*a9fa9459Szrj (coff_backend_info (abfd)->_bfd_coff_max_nscns) 881*a9fa9459Szrj 882*a9fa9459Szrj #define bfd_coff_swap_filehdr_in(abfd, i,o) \ 883*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) 884*a9fa9459Szrj 885*a9fa9459Szrj #define bfd_coff_swap_aouthdr_in(abfd, i,o) \ 886*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o)) 887*a9fa9459Szrj 888*a9fa9459Szrj #define bfd_coff_swap_scnhdr_in(abfd, i,o) \ 889*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o)) 890*a9fa9459Szrj 891*a9fa9459Szrj #define bfd_coff_swap_reloc_in(abfd, i, o) \ 892*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o)) 893*a9fa9459Szrj 894*a9fa9459Szrj #define bfd_coff_bad_format_hook(abfd, filehdr) \ 895*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr)) 896*a9fa9459Szrj 897*a9fa9459Szrj #define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ 898*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) 899*a9fa9459Szrj #define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ 900*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\ 901*a9fa9459Szrj (abfd, filehdr, aouthdr)) 902*a9fa9459Szrj 903*a9fa9459Szrj #define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\ 904*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ 905*a9fa9459Szrj (abfd, scnhdr, name, section, flags_ptr)) 906*a9fa9459Szrj 907*a9fa9459Szrj #define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\ 908*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr)) 909*a9fa9459Szrj 910*a9fa9459Szrj #define bfd_coff_slurp_symbol_table(abfd)\ 911*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd)) 912*a9fa9459Szrj 913*a9fa9459Szrj #define bfd_coff_symname_in_debug(abfd, sym)\ 914*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym)) 915*a9fa9459Szrj 916*a9fa9459Szrj #define bfd_coff_force_symnames_in_strings(abfd)\ 917*a9fa9459Szrj (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings) 918*a9fa9459Szrj 919*a9fa9459Szrj #define bfd_coff_debug_string_prefix_length(abfd)\ 920*a9fa9459Szrj (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length) 921*a9fa9459Szrj 922*a9fa9459Szrj #define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\ 923*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ 924*a9fa9459Szrj (abfd, file, base, symbol, aux, indaux)) 925*a9fa9459Szrj 926*a9fa9459Szrj #define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\ 927*a9fa9459Szrj reloc, data, src_ptr, dst_ptr)\ 928*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ 929*a9fa9459Szrj (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) 930*a9fa9459Szrj 931*a9fa9459Szrj #define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\ 932*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\ 933*a9fa9459Szrj (abfd, section, reloc, shrink, link_info)) 934*a9fa9459Szrj 935*a9fa9459Szrj #define bfd_coff_classify_symbol(abfd, sym)\ 936*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\ 937*a9fa9459Szrj (abfd, sym)) 938*a9fa9459Szrj 939*a9fa9459Szrj #define bfd_coff_compute_section_file_positions(abfd)\ 940*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\ 941*a9fa9459Szrj (abfd)) 942*a9fa9459Szrj 943*a9fa9459Szrj #define bfd_coff_start_final_link(obfd, info)\ 944*a9fa9459Szrj ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\ 945*a9fa9459Szrj (obfd, info)) 946*a9fa9459Szrj #define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ 947*a9fa9459Szrj ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ 948*a9fa9459Szrj (obfd, info, ibfd, o, con, rel, isyms, secs)) 949*a9fa9459Szrj #define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ 950*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ 951*a9fa9459Szrj (abfd, sec, rel, h, sym, addendp)) 952*a9fa9459Szrj #define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ 953*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ 954*a9fa9459Szrj (obfd, info, ibfd, sec, rel, adjustedp)) 955*a9fa9459Szrj #define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\ 956*a9fa9459Szrj value, string, cp, coll, hashp)\ 957*a9fa9459Szrj ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\ 958*a9fa9459Szrj (info, abfd, name, flags, section, value, string, cp, coll, hashp)) 959*a9fa9459Szrj 960*a9fa9459Szrj #define bfd_coff_link_output_has_begun(a,p) \ 961*a9fa9459Szrj ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p)) 962*a9fa9459Szrj #define bfd_coff_final_link_postscript(a,p) \ 963*a9fa9459Szrj ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p)) 964*a9fa9459Szrj 965*a9fa9459Szrj #define bfd_coff_have_print_pdata(a) \ 966*a9fa9459Szrj (coff_backend_info (a)->_bfd_coff_print_pdata) 967*a9fa9459Szrj #define bfd_coff_print_pdata(a,p) \ 968*a9fa9459Szrj ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p)) 969*a9fa9459Szrj 970*a9fa9459Szrj /* Macro: Returns true if the bfd is a PE executable as opposed to a 971*a9fa9459Szrj PE object file. */ 972*a9fa9459Szrj #define bfd_pei_p(abfd) \ 973*a9fa9459Szrj (CONST_STRNEQ ((abfd)->xvec->name, "pei-")) 974*a9fa9459Szrj #ifdef __cplusplus 975*a9fa9459Szrj } 976*a9fa9459Szrj #endif 977