1 1.1 skrll /* BFD COFF object file private structure. 2 1.1.1.12 christos Copyright (C) 1990-2026 Free Software Foundation, Inc. 3 1.1 skrll Written by Cygnus Support. 4 1.1 skrll 5 1.1 skrll This file is part of BFD, the Binary File Descriptor library. 6 1.1 skrll 7 1.1 skrll This program is free software; you can redistribute it and/or modify 8 1.1 skrll it under the terms of the GNU General Public License as published by 9 1.1 skrll the Free Software Foundation; either version 3 of the License, or 10 1.1 skrll (at your option) any later version. 11 1.1 skrll 12 1.1 skrll This program is distributed in the hope that it will be useful, 13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 skrll GNU General Public License for more details. 16 1.1 skrll 17 1.1 skrll You should have received a copy of the GNU General Public License 18 1.1 skrll along with this program; if not, write to the Free Software 19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 1.1 skrll MA 02110-1301, USA. */ 21 1.1 skrll 22 1.1.1.7 christos #ifndef _LIBCOFF_H 23 1.1.1.7 christos #define _LIBCOFF_H 1 24 1.1.1.7 christos 25 1.1 skrll #include "bfdlink.h" 26 1.1.1.4 christos #include "coff-bfd.h" 27 1.1.1.10 christos #include "hashtab.h" 28 1.1.1.12 christos #include "hidden.h" 29 1.1.1.4 christos 30 1.1.1.4 christos #ifdef __cplusplus 31 1.1.1.4 christos extern "C" { 32 1.1.1.4 christos #endif 33 1.1 skrll 34 1.1 skrll /* Object file tdata; access macros. */ 35 1.1 skrll 36 1.1 skrll #define coff_data(bfd) ((bfd)->tdata.coff_obj_data) 37 1.1.1.6 christos #define obj_pe(bfd) (coff_data (bfd)->pe) 38 1.1.1.9 christos #define obj_go32(bfd) (coff_data (bfd)->go32) 39 1.1 skrll #define obj_symbols(bfd) (coff_data (bfd)->symbols) 40 1.1.1.9 christos #define obj_sym_filepos(bfd) (coff_data (bfd)->sym_filepos) 41 1.1 skrll #define obj_relocbase(bfd) (coff_data (bfd)->relocbase) 42 1.1 skrll #define obj_raw_syments(bfd) (coff_data (bfd)->raw_syments) 43 1.1 skrll #define obj_raw_syment_count(bfd) (coff_data (bfd)->raw_syment_count) 44 1.1.1.11 christos #define obj_coff_keep_raw_syms(bfd) (coff_data (bfd)->keep_raw_syms) 45 1.1 skrll #define obj_convert(bfd) (coff_data (bfd)->conversion_table) 46 1.1 skrll #define obj_conv_table_size(bfd) (coff_data (bfd)->conv_table_size) 47 1.1 skrll #define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms) 48 1.1 skrll #define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms) 49 1.1 skrll #define obj_coff_strings(bfd) (coff_data (bfd)->strings) 50 1.1.1.4 christos #define obj_coff_strings_len(bfd) (coff_data (bfd)->strings_len) 51 1.1 skrll #define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings) 52 1.1 skrll #define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes) 53 1.1 skrll #define obj_coff_strings_written(bfd) (coff_data (bfd)->strings_written) 54 1.1 skrll #define obj_coff_local_toc_table(bfd) (coff_data (bfd)->local_toc_sym_map) 55 1.1 skrll 56 1.1 skrll /* `Tdata' information kept for COFF files. */ 57 1.1 skrll 58 1.1 skrll typedef struct coff_tdata 59 1.1 skrll { 60 1.1 skrll struct coff_symbol_struct *symbols; /* Symtab for input bfd. */ 61 1.1 skrll unsigned int *conversion_table; 62 1.1 skrll int conv_table_size; 63 1.1 skrll file_ptr sym_filepos; 64 1.1 skrll 65 1.1 skrll struct coff_ptr_struct *raw_syments; 66 1.1 skrll unsigned long raw_syment_count; 67 1.1 skrll 68 1.1 skrll /* These are only valid once writing has begun. */ 69 1.1.1.4 christos unsigned long int relocbase; 70 1.1 skrll 71 1.1 skrll /* These members communicate important constants about the symbol table 72 1.1 skrll to GDB's symbol-reading code. These `constants' unfortunately vary 73 1.1 skrll from coff implementation to implementation... */ 74 1.1 skrll unsigned local_n_btmask; 75 1.1 skrll unsigned local_n_btshft; 76 1.1 skrll unsigned local_n_tmask; 77 1.1 skrll unsigned local_n_tshift; 78 1.1 skrll unsigned local_symesz; 79 1.1 skrll unsigned local_auxesz; 80 1.1 skrll unsigned local_linesz; 81 1.1 skrll 82 1.1 skrll /* The unswapped external symbols. May be NULL. Read by 83 1.1 skrll _bfd_coff_get_external_symbols. */ 84 1.1 skrll void * external_syms; 85 1.1 skrll 86 1.1 skrll /* The string table. May be NULL. Read by 87 1.1 skrll _bfd_coff_read_string_table. */ 88 1.1 skrll char *strings; 89 1.1.1.4 christos /* The length of the strings table. For error checking. */ 90 1.1.1.4 christos bfd_size_type strings_len; 91 1.1.1.10 christos 92 1.1.1.10 christos /* Set if long section names are supported. A writable copy of the COFF 93 1.1.1.10 christos backend flag _bfd_coff_long_section_names. */ 94 1.1.1.10 christos bool long_section_names; 95 1.1.1.10 christos 96 1.1.1.11 christos /* If this is TRUE, raw_syments may not be released. */ 97 1.1.1.11 christos bool keep_raw_syms; 98 1.1.1.10 christos /* If this is TRUE, the external_syms may not be freed. */ 99 1.1.1.10 christos bool keep_syms; 100 1.1 skrll /* If this is TRUE, the strings may not be freed. */ 101 1.1.1.9 christos bool keep_strings; 102 1.1 skrll /* If this is TRUE, the strings have been written out already. */ 103 1.1.1.9 christos bool strings_written; 104 1.1 skrll 105 1.1.1.10 christos /* Is this a GO32 coff file? */ 106 1.1.1.10 christos bool go32; 107 1.1.1.10 christos 108 1.1 skrll /* Is this a PE format coff file? */ 109 1.1.1.10 christos bool pe; 110 1.1.1.10 christos 111 1.1.1.10 christos /* Copy of some of the f_flags bits in the COFF filehdr structure, 112 1.1.1.10 christos used by ARM code. */ 113 1.1.1.10 christos flagword flags; 114 1.1.1.10 christos 115 1.1 skrll /* Used by the COFF backend linker. */ 116 1.1 skrll struct coff_link_hash_entry **sym_hashes; 117 1.1 skrll 118 1.1 skrll /* Used by the pe linker for PowerPC. */ 119 1.1 skrll int *local_toc_sym_map; 120 1.1 skrll 121 1.1 skrll struct bfd_link_info *link_info; 122 1.1 skrll 123 1.1 skrll /* Used by coff_find_nearest_line. */ 124 1.1 skrll void * line_info; 125 1.1 skrll 126 1.1 skrll /* A place to stash dwarf2 info for this bfd. */ 127 1.1 skrll void * dwarf2_find_line_info; 128 1.1 skrll 129 1.1 skrll /* The timestamp from the COFF file header. */ 130 1.1 skrll long timestamp; 131 1.1 skrll 132 1.1.1.9 christos /* A stub (extra data prepended before the COFF image) and its size. 133 1.1.1.9 christos Used by coff-go32-exe, it contains executable data that loads the 134 1.1.1.9 christos COFF object into memory. */ 135 1.1.1.9 christos char * stub; 136 1.1.1.9 christos bfd_size_type stub_size; 137 1.1.1.10 christos 138 1.1.1.10 christos /* Hash table containing sections by target index. */ 139 1.1.1.10 christos htab_t section_by_target_index; 140 1.1.1.10 christos 141 1.1.1.10 christos /* Hash table containing sections by index. */ 142 1.1.1.10 christos htab_t section_by_index; 143 1.1.1.10 christos 144 1.1 skrll } coff_data_type; 145 1.1 skrll 146 1.1 skrll /* Tdata for pe image files. */ 147 1.1 skrll typedef struct pe_tdata 148 1.1 skrll { 149 1.1 skrll coff_data_type coff; 150 1.1 skrll struct internal_extra_pe_aouthdr pe_opthdr; 151 1.1 skrll int dll; 152 1.1 skrll int has_reloc_section; 153 1.1.1.2 christos int dont_strip_reloc; 154 1.1.1.10 christos char dos_message[64]; 155 1.1.1.9 christos /* The timestamp to insert into the output file. 156 1.1.1.9 christos If the timestamp is -1 then the current time is used. */ 157 1.1.1.9 christos int timestamp; 158 1.1.1.9 christos bool (*in_reloc_p) (bfd *, reloc_howto_type *); 159 1.1 skrll flagword real_flags; 160 1.1.1.4 christos 161 1.1.1.4 christos /* Build-id info. */ 162 1.1.1.4 christos struct 163 1.1.1.4 christos { 164 1.1.1.9 christos bool (*after_write_object_contents) (bfd *); 165 1.1.1.4 christos const char *style; 166 1.1.1.4 christos asection *sec; 167 1.1.1.4 christos } build_id; 168 1.1.1.10 christos 169 1.1.1.10 christos htab_t comdat_hash; 170 1.1 skrll } pe_data_type; 171 1.1 skrll 172 1.1 skrll #define pe_data(bfd) ((bfd)->tdata.pe_obj_data) 173 1.1 skrll 174 1.1.1.10 christos struct comdat_hash_entry 175 1.1.1.10 christos { 176 1.1.1.10 christos int target_index; 177 1.1.1.10 christos struct internal_syment isym; 178 1.1.1.10 christos char *symname; 179 1.1.1.10 christos flagword sec_flags; 180 1.1.1.10 christos char *comdat_name; 181 1.1.1.10 christos long comdat_symbol; 182 1.1.1.10 christos }; 183 1.1.1.10 christos 184 1.1 skrll /* Tdata for XCOFF files. */ 185 1.1 skrll 186 1.1 skrll struct xcoff_tdata 187 1.1 skrll { 188 1.1 skrll /* Basic COFF information. */ 189 1.1 skrll coff_data_type coff; 190 1.1 skrll 191 1.1 skrll /* TRUE if this is an XCOFF64 file. */ 192 1.1.1.9 christos bool xcoff64; 193 1.1 skrll 194 1.1 skrll /* TRUE if a large a.out header should be generated. */ 195 1.1.1.9 christos bool full_aouthdr; 196 1.1 skrll 197 1.1 skrll /* TOC value. */ 198 1.1 skrll bfd_vma toc; 199 1.1 skrll 200 1.1 skrll /* Index of section holding TOC. */ 201 1.1 skrll int sntoc; 202 1.1 skrll 203 1.1 skrll /* Index of section holding entry point. */ 204 1.1 skrll int snentry; 205 1.1 skrll 206 1.1 skrll /* .text alignment from optional header. */ 207 1.1 skrll int text_align_power; 208 1.1 skrll 209 1.1 skrll /* .data alignment from optional header. */ 210 1.1 skrll int data_align_power; 211 1.1 skrll 212 1.1 skrll /* modtype from optional header. */ 213 1.1 skrll short modtype; 214 1.1 skrll 215 1.1 skrll /* cputype from optional header. */ 216 1.1 skrll short cputype; 217 1.1 skrll 218 1.1 skrll /* maxdata from optional header. */ 219 1.1 skrll bfd_vma maxdata; 220 1.1 skrll 221 1.1 skrll /* maxstack from optional header. */ 222 1.1 skrll bfd_vma maxstack; 223 1.1 skrll 224 1.1 skrll /* Used by the XCOFF backend linker. */ 225 1.1 skrll asection **csects; 226 1.1.1.2 christos long *debug_indices; 227 1.1.1.2 christos unsigned int *lineno_counts; 228 1.1 skrll unsigned int import_file_id; 229 1.1 skrll }; 230 1.1 skrll 231 1.1 skrll #define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data) 232 1.1 skrll 233 1.1 skrll /* We take the address of the first element of an asymbol to ensure that the 234 1.1 skrll macro is only ever applied to an asymbol. */ 235 1.1 skrll #define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd))) 236 1.1 skrll 237 1.1 skrll /* Tdata for sections in XCOFF files. This is used by the linker. */ 238 1.1 skrll 239 1.1 skrll struct xcoff_section_tdata 240 1.1 skrll { 241 1.1 skrll /* Used for XCOFF csects created by the linker; points to the real 242 1.1 skrll XCOFF section which contains this csect. */ 243 1.1 skrll asection *enclosing; 244 1.1 skrll /* The lineno_count field for the enclosing section, because we are 245 1.1 skrll going to clobber it there. */ 246 1.1 skrll unsigned int lineno_count; 247 1.1.1.2 christos /* The first and last symbol indices for symbols used by this csect. */ 248 1.1 skrll unsigned long first_symndx; 249 1.1 skrll unsigned long last_symndx; 250 1.1 skrll }; 251 1.1 skrll 252 1.1 skrll /* An accessor macro the xcoff_section_tdata structure. */ 253 1.1 skrll #define xcoff_section_data(abfd, sec) \ 254 1.1 skrll ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata) 255 1.1 skrll 256 1.1 skrll /* Tdata for sections in PE files. */ 257 1.1 skrll 258 1.1 skrll struct pei_section_tdata 259 1.1 skrll { 260 1.1 skrll /* The virtual size of the section. */ 261 1.1 skrll bfd_size_type virt_size; 262 1.1 skrll /* The PE section flags. */ 263 1.1 skrll long pe_flags; 264 1.1 skrll }; 265 1.1 skrll 266 1.1 skrll /* An accessor macro for the pei_section_tdata structure. */ 267 1.1 skrll #define pei_section_data(abfd, sec) \ 268 1.1 skrll ((struct pei_section_tdata *) coff_section_data ((abfd), (sec))->tdata) 269 1.1 skrll 270 1.1 skrll /* COFF linker hash table entries. */ 271 1.1 skrll 272 1.1 skrll struct coff_link_hash_entry 273 1.1 skrll { 274 1.1 skrll struct bfd_link_hash_entry root; 275 1.1 skrll 276 1.1.1.9 christos /* Symbol index in output file. This is initialized to -1. It is 277 1.1.1.9 christos set to -2 if the symbol is used by a reloc. It is set to -3 if 278 1.1.1.9 christos this symbol is defined in a discarded section. */ 279 1.1 skrll long indx; 280 1.1 skrll 281 1.1 skrll /* Symbol type. */ 282 1.1 skrll unsigned short type; 283 1.1 skrll 284 1.1 skrll /* Symbol class. */ 285 1.1.1.2 christos unsigned char symbol_class; 286 1.1 skrll 287 1.1 skrll /* Number of auxiliary entries. */ 288 1.1 skrll char numaux; 289 1.1 skrll 290 1.1 skrll /* BFD to take auxiliary entries from. */ 291 1.1 skrll bfd *auxbfd; 292 1.1 skrll 293 1.1 skrll /* Pointer to array of auxiliary entries, if any. */ 294 1.1 skrll union internal_auxent *aux; 295 1.1 skrll 296 1.1 skrll /* Flag word; legal values follow. */ 297 1.1 skrll unsigned short coff_link_hash_flags; 298 1.1 skrll /* Symbol is a PE section symbol. */ 299 1.1 skrll #define COFF_LINK_HASH_PE_SECTION_SYMBOL (01) 300 1.1 skrll }; 301 1.1 skrll 302 1.1 skrll /* COFF linker hash table. */ 303 1.1 skrll 304 1.1 skrll struct coff_link_hash_table 305 1.1 skrll { 306 1.1 skrll struct bfd_link_hash_table root; 307 1.1 skrll /* A pointer to information used to link stabs in sections. */ 308 1.1 skrll struct stab_info stab_info; 309 1.1.1.10 christos /* Hash table that maps undecorated names to their respective 310 1.1.1.10 christos * decorated coff_link_hash_entry as found in fixup_stdcalls */ 311 1.1.1.10 christos struct bfd_hash_table decoration_hash; 312 1.1 skrll }; 313 1.1 skrll 314 1.1.1.4 christos struct coff_reloc_cookie 315 1.1.1.4 christos { 316 1.1.1.6 christos struct internal_reloc * rels; 317 1.1.1.6 christos struct internal_reloc * rel; 318 1.1.1.6 christos struct internal_reloc * relend; 319 1.1.1.6 christos struct coff_symbol_struct * symbols; /* Symtab for input bfd. */ 320 1.1.1.6 christos bfd * abfd; 321 1.1.1.4 christos struct coff_link_hash_entry ** sym_hashes; 322 1.1.1.4 christos }; 323 1.1.1.4 christos 324 1.1 skrll /* Look up an entry in a COFF linker hash table. */ 325 1.1 skrll 326 1.1 skrll #define coff_link_hash_lookup(table, string, create, copy, follow) \ 327 1.1 skrll ((struct coff_link_hash_entry *) \ 328 1.1 skrll bfd_link_hash_lookup (&(table)->root, (string), (create), \ 329 1.1 skrll (copy), (follow))) 330 1.1 skrll 331 1.1 skrll /* Traverse a COFF linker hash table. */ 332 1.1 skrll 333 1.1 skrll #define coff_link_hash_traverse(table, func, info) \ 334 1.1 skrll (bfd_link_hash_traverse \ 335 1.1 skrll (&(table)->root, \ 336 1.1.1.9 christos (bool (*) (struct bfd_link_hash_entry *, void *)) (func), \ 337 1.1 skrll (info))) 338 1.1 skrll 339 1.1 skrll /* Get the COFF linker hash table from a link_info structure. */ 340 1.1 skrll 341 1.1 skrll #define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash)) 342 1.1 skrll 343 1.1.1.10 christos struct decoration_hash_entry 344 1.1.1.10 christos { 345 1.1.1.10 christos struct bfd_hash_entry root; 346 1.1.1.10 christos struct bfd_link_hash_entry *decorated_link; 347 1.1.1.10 christos }; 348 1.1.1.10 christos 349 1.1 skrll /* Functions in coffgen.c. */ 350 1.1.1.10 christos extern void coff_object_cleanup 351 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 352 1.1.1.10 christos extern bfd_cleanup coff_real_object_p 353 1.1.1.12 christos (bfd *, unsigned, struct internal_filehdr *, struct internal_aouthdr *) 354 1.1.1.12 christos ATTRIBUTE_HIDDEN; 355 1.1.1.9 christos extern bfd_cleanup coff_object_p 356 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 357 1.1 skrll extern struct bfd_section *coff_section_from_bfd_index 358 1.1 skrll (bfd *, int); 359 1.1 skrll extern long coff_get_symtab_upper_bound 360 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 361 1.1 skrll extern long coff_canonicalize_symtab 362 1.1.1.12 christos (bfd *, asymbol **) ATTRIBUTE_HIDDEN; 363 1.1 skrll extern int coff_count_linenumbers 364 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 365 1.1.1.9 christos extern bool coff_renumber_symbols 366 1.1.1.12 christos (bfd *, int *) ATTRIBUTE_HIDDEN; 367 1.1 skrll extern void coff_mangle_symbols 368 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 369 1.1.1.9 christos extern bool coff_write_symbols 370 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 371 1.1.1.9 christos extern bool coff_write_alien_symbol 372 1.1.1.9 christos (bfd *, asymbol *, struct internal_syment *, bfd_vma *, 373 1.1.1.12 christos struct bfd_strtab_hash *, bool, asection **, bfd_size_type *) 374 1.1.1.12 christos ATTRIBUTE_HIDDEN; 375 1.1.1.9 christos extern bool coff_write_linenumbers 376 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 377 1.1 skrll extern alent *coff_get_lineno 378 1.1.1.12 christos (bfd *, asymbol *) ATTRIBUTE_HIDDEN; 379 1.1 skrll extern asymbol *coff_section_symbol 380 1.1.1.12 christos (bfd *, char *) ATTRIBUTE_HIDDEN; 381 1.1.1.9 christos extern bool _bfd_coff_get_external_symbols 382 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 383 1.1 skrll extern const char *_bfd_coff_read_string_table 384 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 385 1.1.1.9 christos extern bool _bfd_coff_free_symbols 386 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 387 1.1 skrll extern struct coff_ptr_struct *coff_get_normalized_symtab 388 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 389 1.1 skrll extern long coff_get_reloc_upper_bound 390 1.1.1.12 christos (bfd *, sec_ptr) ATTRIBUTE_HIDDEN; 391 1.1 skrll extern asymbol *coff_make_empty_symbol 392 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 393 1.1 skrll extern void coff_print_symbol 394 1.1.1.12 christos (bfd *, void * filep, asymbol *, bfd_print_symbol_type) ATTRIBUTE_HIDDEN; 395 1.1 skrll extern void coff_get_symbol_info 396 1.1.1.12 christos (bfd *, asymbol *, symbol_info *ret) ATTRIBUTE_HIDDEN; 397 1.1.1.4 christos #define coff_get_symbol_version_string \ 398 1.1.1.4 christos _bfd_nosymbols_get_symbol_version_string 399 1.1.1.9 christos extern bool _bfd_coff_is_local_label_name 400 1.1.1.12 christos (bfd *, const char *) ATTRIBUTE_HIDDEN; 401 1.1 skrll extern asymbol *coff_bfd_make_debug_symbol 402 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 403 1.1.1.9 christos extern bool coff_find_nearest_line 404 1.1.1.4 christos (bfd *, asymbol **, asection *, bfd_vma, 405 1.1.1.12 christos const char **, const char **, unsigned int *, unsigned int *) 406 1.1.1.12 christos ATTRIBUTE_HIDDEN; 407 1.1.1.10 christos #define coff_find_nearest_line_with_alt \ 408 1.1.1.10 christos _bfd_nosymbols_find_nearest_line_with_alt 409 1.1.1.4 christos #define coff_find_line _bfd_nosymbols_find_line 410 1.1.1.3 christos struct dwarf_debug_section; 411 1.1.1.9 christos extern bool coff_find_nearest_line_with_names 412 1.1.1.4 christos (bfd *, asymbol **, asection *, bfd_vma, const char **, const char **, 413 1.1.1.12 christos unsigned int *, const struct dwarf_debug_section *) ATTRIBUTE_HIDDEN; 414 1.1.1.9 christos extern bool coff_find_inliner_info 415 1.1.1.12 christos (bfd *, const char **, const char **, unsigned int *) ATTRIBUTE_HIDDEN; 416 1.1 skrll extern int coff_sizeof_headers 417 1.1.1.12 christos (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 418 1.1.1.9 christos extern bool bfd_coff_reloc16_relax_section 419 1.1.1.12 christos (bfd *, asection *, struct bfd_link_info *, bool *) ATTRIBUTE_HIDDEN; 420 1.1 skrll extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents 421 1.1 skrll (bfd *, struct bfd_link_info *, struct bfd_link_order *, 422 1.1.1.12 christos bfd_byte *, bool, asymbol **) ATTRIBUTE_HIDDEN; 423 1.1 skrll extern bfd_vma bfd_coff_reloc16_get_value 424 1.1.1.12 christos (arelent *, struct bfd_link_info *, asection *) ATTRIBUTE_HIDDEN; 425 1.1 skrll extern void bfd_perform_slip 426 1.1.1.12 christos (bfd *, unsigned int, asection *, bfd_vma) ATTRIBUTE_HIDDEN; 427 1.1.1.10 christos extern bool _bfd_coff_free_cached_info 428 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 429 1.1 skrll 430 1.1 skrll /* Functions and types in cofflink.c. */ 431 1.1 skrll 432 1.1 skrll #define STRING_SIZE_SIZE 4 433 1.1 skrll 434 1.1 skrll /* We use a hash table to merge identical enum, struct, and union 435 1.1 skrll definitions in the linker. */ 436 1.1 skrll 437 1.1 skrll /* Information we keep for a single element (an enum value, a 438 1.1 skrll structure or union field) in the debug merge hash table. */ 439 1.1 skrll 440 1.1 skrll struct coff_debug_merge_element 441 1.1 skrll { 442 1.1 skrll /* Next element. */ 443 1.1 skrll struct coff_debug_merge_element *next; 444 1.1 skrll 445 1.1 skrll /* Name. */ 446 1.1 skrll const char *name; 447 1.1 skrll 448 1.1 skrll /* Type. */ 449 1.1 skrll unsigned int type; 450 1.1 skrll 451 1.1 skrll /* Symbol index for complex type. */ 452 1.1 skrll long tagndx; 453 1.1 skrll }; 454 1.1 skrll 455 1.1 skrll /* A linked list of debug merge entries for a given name. */ 456 1.1 skrll 457 1.1 skrll struct coff_debug_merge_type 458 1.1 skrll { 459 1.1 skrll /* Next type with the same name. */ 460 1.1 skrll struct coff_debug_merge_type *next; 461 1.1 skrll 462 1.1 skrll /* Class of type. */ 463 1.1.1.2 christos int type_class; 464 1.1 skrll 465 1.1 skrll /* Symbol index where this type is defined. */ 466 1.1 skrll long indx; 467 1.1 skrll 468 1.1 skrll /* List of elements. */ 469 1.1 skrll struct coff_debug_merge_element *elements; 470 1.1 skrll }; 471 1.1 skrll 472 1.1 skrll /* Information we store in the debug merge hash table. */ 473 1.1 skrll 474 1.1 skrll struct coff_debug_merge_hash_entry 475 1.1 skrll { 476 1.1 skrll struct bfd_hash_entry root; 477 1.1 skrll 478 1.1 skrll /* A list of types with this name. */ 479 1.1 skrll struct coff_debug_merge_type *types; 480 1.1 skrll }; 481 1.1 skrll 482 1.1 skrll /* The debug merge hash table. */ 483 1.1 skrll 484 1.1 skrll struct coff_debug_merge_hash_table 485 1.1 skrll { 486 1.1 skrll struct bfd_hash_table root; 487 1.1 skrll }; 488 1.1 skrll 489 1.1 skrll /* Initialize a COFF debug merge hash table. */ 490 1.1 skrll 491 1.1 skrll #define coff_debug_merge_hash_table_init(table) \ 492 1.1 skrll (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc, \ 493 1.1 skrll sizeof (struct coff_debug_merge_hash_entry))) 494 1.1 skrll 495 1.1 skrll /* Free a COFF debug merge hash table. */ 496 1.1 skrll 497 1.1 skrll #define coff_debug_merge_hash_table_free(table) \ 498 1.1 skrll (bfd_hash_table_free (&(table)->root)) 499 1.1 skrll 500 1.1 skrll /* Look up an entry in a COFF debug merge hash table. */ 501 1.1 skrll 502 1.1 skrll #define coff_debug_merge_hash_lookup(table, string, create, copy) \ 503 1.1 skrll ((struct coff_debug_merge_hash_entry *) \ 504 1.1 skrll bfd_hash_lookup (&(table)->root, (string), (create), (copy))) 505 1.1 skrll 506 1.1 skrll /* Information we keep for each section in the output file when doing 507 1.1 skrll a relocatable link. */ 508 1.1 skrll 509 1.1 skrll struct coff_link_section_info 510 1.1 skrll { 511 1.1 skrll /* The relocs to be output. */ 512 1.1 skrll struct internal_reloc *relocs; 513 1.1 skrll /* For each reloc against a global symbol whose index was not known 514 1.1 skrll when the reloc was handled, the global hash table entry. */ 515 1.1 skrll struct coff_link_hash_entry **rel_hashes; 516 1.1 skrll }; 517 1.1 skrll 518 1.1 skrll /* Information that we pass around while doing the final link step. */ 519 1.1 skrll 520 1.1 skrll struct coff_final_link_info 521 1.1 skrll { 522 1.1 skrll /* General link information. */ 523 1.1 skrll struct bfd_link_info *info; 524 1.1 skrll /* Output BFD. */ 525 1.1 skrll bfd *output_bfd; 526 1.1 skrll /* Used to indicate failure in traversal routine. */ 527 1.1.1.9 christos bool failed; 528 1.1 skrll /* If doing "task linking" set only during the time when we want the 529 1.1 skrll global symbol writer to convert the storage class of defined global 530 1.1 skrll symbols from global to static. */ 531 1.1.1.9 christos bool global_to_static; 532 1.1 skrll /* Hash table for long symbol names. */ 533 1.1 skrll struct bfd_strtab_hash *strtab; 534 1.1 skrll /* When doing a relocatable link, an array of information kept for 535 1.1 skrll each output section, indexed by the target_index field. */ 536 1.1 skrll struct coff_link_section_info *section_info; 537 1.1 skrll /* Symbol index of last C_FILE symbol (-1 if none). */ 538 1.1 skrll long last_file_index; 539 1.1 skrll /* Contents of last C_FILE symbol. */ 540 1.1 skrll struct internal_syment last_file; 541 1.1 skrll /* Symbol index of first aux entry of last .bf symbol with an empty 542 1.1 skrll endndx field (-1 if none). */ 543 1.1 skrll long last_bf_index; 544 1.1 skrll /* Contents of last_bf_index aux entry. */ 545 1.1 skrll union internal_auxent last_bf; 546 1.1 skrll /* Hash table used to merge debug information. */ 547 1.1 skrll struct coff_debug_merge_hash_table debug_merge; 548 1.1 skrll /* Buffer large enough to hold swapped symbols of any input file. */ 549 1.1 skrll struct internal_syment *internal_syms; 550 1.1 skrll /* Buffer large enough to hold sections of symbols of any input file. */ 551 1.1 skrll asection **sec_ptrs; 552 1.1 skrll /* Buffer large enough to hold output indices of symbols of any 553 1.1 skrll input file. */ 554 1.1 skrll long *sym_indices; 555 1.1 skrll /* Buffer large enough to hold output symbols for any input file. */ 556 1.1 skrll bfd_byte *outsyms; 557 1.1 skrll /* Buffer large enough to hold external line numbers for any input 558 1.1 skrll section. */ 559 1.1 skrll bfd_byte *linenos; 560 1.1 skrll /* Buffer large enough to hold any input section. */ 561 1.1 skrll bfd_byte *contents; 562 1.1 skrll /* Buffer large enough to hold external relocs of any input section. */ 563 1.1 skrll bfd_byte *external_relocs; 564 1.1 skrll /* Buffer large enough to hold swapped relocs of any input section. */ 565 1.1 skrll struct internal_reloc *internal_relocs; 566 1.1 skrll }; 567 1.1 skrll 568 1.1 skrll /* Most COFF variants have no way to record the alignment of a 569 1.1 skrll section. This struct is used to set a specific alignment based on 570 1.1 skrll the name of the section. */ 571 1.1 skrll 572 1.1 skrll struct coff_section_alignment_entry 573 1.1 skrll { 574 1.1 skrll /* The section name. */ 575 1.1 skrll const char *name; 576 1.1 skrll 577 1.1 skrll /* This is either (unsigned int) -1, indicating that the section 578 1.1 skrll name must match exactly, or it is the number of letters which 579 1.1 skrll must match at the start of the name. */ 580 1.1 skrll unsigned int comparison_length; 581 1.1 skrll 582 1.1 skrll /* These macros may be used to fill in the first two fields in a 583 1.1 skrll structure initialization. */ 584 1.1 skrll #define COFF_SECTION_NAME_EXACT_MATCH(name) (name), ((unsigned int) -1) 585 1.1 skrll #define COFF_SECTION_NAME_PARTIAL_MATCH(name) (name), (sizeof (name) - 1) 586 1.1 skrll 587 1.1 skrll /* Only use this entry if the default section alignment for this 588 1.1 skrll target is at least that much (as a power of two). If this field 589 1.1 skrll is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */ 590 1.1 skrll unsigned int default_alignment_min; 591 1.1 skrll 592 1.1 skrll /* Only use this entry if the default section alignment for this 593 1.1 skrll target is no greater than this (as a power of two). If this 594 1.1 skrll field is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */ 595 1.1 skrll unsigned int default_alignment_max; 596 1.1 skrll 597 1.1 skrll #define COFF_ALIGNMENT_FIELD_EMPTY ((unsigned int) -1) 598 1.1 skrll 599 1.1 skrll /* The desired alignment for this section (as a power of two). */ 600 1.1 skrll unsigned int alignment_power; 601 1.1 skrll }; 602 1.1 skrll 603 1.1.1.10 christos extern struct bfd_hash_entry *_decoration_hash_newfunc 604 1.1.1.12 christos (struct bfd_hash_entry *, struct bfd_hash_table *, const char *) 605 1.1.1.12 christos ATTRIBUTE_HIDDEN; 606 1.1 skrll extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc 607 1.1.1.12 christos (struct bfd_hash_entry *, struct bfd_hash_table *, const char *) 608 1.1.1.12 christos ATTRIBUTE_HIDDEN; 609 1.1.1.9 christos extern bool _bfd_coff_link_hash_table_init 610 1.1 skrll (struct coff_link_hash_table *, bfd *, 611 1.1 skrll struct bfd_hash_entry *(*) (struct bfd_hash_entry *, 612 1.1 skrll struct bfd_hash_table *, 613 1.1 skrll const char *), 614 1.1.1.12 christos unsigned int) ATTRIBUTE_HIDDEN; 615 1.1 skrll extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create 616 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 617 1.1 skrll extern const char *_bfd_coff_internal_syment_name 618 1.1.1.12 christos (bfd *, const struct internal_syment *, char *) ATTRIBUTE_HIDDEN; 619 1.1.1.9 christos extern bool _bfd_coff_section_already_linked 620 1.1.1.12 christos (bfd *, asection *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 621 1.1.1.9 christos extern bool _bfd_coff_link_add_symbols 622 1.1.1.12 christos (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 623 1.1.1.9 christos extern bool _bfd_coff_final_link 624 1.1.1.12 christos (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 625 1.1.1.12 christos extern struct internal_reloc *bfd_coff_read_internal_relocs 626 1.1.1.9 christos (bfd *, asection *, bool, bfd_byte *, bool, 627 1.1 skrll struct internal_reloc *); 628 1.1.1.9 christos extern bool _bfd_coff_generic_relocate_section 629 1.1 skrll (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 630 1.1.1.12 christos struct internal_reloc *, struct internal_syment *, asection **) 631 1.1.1.12 christos ATTRIBUTE_HIDDEN; 632 1.1 skrll extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc 633 1.1.1.12 christos (struct bfd_hash_entry *, struct bfd_hash_table *, const char *) 634 1.1.1.12 christos ATTRIBUTE_HIDDEN; 635 1.1.1.9 christos extern bool _bfd_coff_write_global_sym 636 1.1.1.12 christos (struct bfd_hash_entry *, void *) ATTRIBUTE_HIDDEN; 637 1.1.1.9 christos extern bool _bfd_coff_write_task_globals 638 1.1.1.12 christos (struct coff_link_hash_entry *, void *) ATTRIBUTE_HIDDEN; 639 1.1.1.9 christos extern bool _bfd_coff_link_input_bfd 640 1.1.1.12 christos (struct coff_final_link_info *, bfd *) ATTRIBUTE_HIDDEN; 641 1.1.1.9 christos extern bool _bfd_coff_reloc_link_order 642 1.1 skrll (bfd *, struct coff_final_link_info *, asection *, 643 1.1.1.12 christos struct bfd_link_order *) ATTRIBUTE_HIDDEN; 644 1.1.1.12 christos extern bool _bfd_coff_gc_sections 645 1.1.1.12 christos (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 646 1.1.1.12 christos extern const char *_bfd_coff_group_name 647 1.1.1.12 christos (bfd *, const asection *) ATTRIBUTE_HIDDEN; 648 1.1 skrll 649 1.1 skrll /* Functions in xcofflink.c. */ 650 1.1 skrll 651 1.1 skrll extern long _bfd_xcoff_get_dynamic_symtab_upper_bound 652 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 653 1.1 skrll extern long _bfd_xcoff_canonicalize_dynamic_symtab 654 1.1.1.12 christos (bfd *, asymbol **) ATTRIBUTE_HIDDEN; 655 1.1 skrll extern long _bfd_xcoff_get_dynamic_reloc_upper_bound 656 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 657 1.1 skrll extern long _bfd_xcoff_canonicalize_dynamic_reloc 658 1.1.1.12 christos (bfd *, arelent **, asymbol **) ATTRIBUTE_HIDDEN; 659 1.1 skrll extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create 660 1.1.1.12 christos (bfd *) ATTRIBUTE_HIDDEN; 661 1.1.1.9 christos extern bool _bfd_xcoff_bfd_link_add_symbols 662 1.1.1.12 christos (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 663 1.1.1.9 christos extern bool _bfd_xcoff_bfd_final_link 664 1.1.1.12 christos (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN; 665 1.1.1.9 christos extern bool _bfd_xcoff_define_common_symbol 666 1.1.1.12 christos (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *) 667 1.1.1.12 christos ATTRIBUTE_HIDDEN; 668 1.1.1.9 christos extern bool _bfd_ppc_xcoff_relocate_section 669 1.1 skrll (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 670 1.1.1.12 christos struct internal_reloc *, struct internal_syment *, asection **) 671 1.1.1.12 christos ATTRIBUTE_HIDDEN; 672