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