libcoff.h revision 89857
12786Ssos/* DO NOT EDIT! -*- buffer-read-only: t -*- This file is automatically 22786Ssos generated from "libcoff-in.h" and "coffcode.h". 32786Ssos Run "make headers" in your build bfd/ to regenerate. */ 42786Ssos 52786Ssos/* BFD COFF object file private structure. 632822Syokota Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 72786Ssos 2000, 2001 82786Ssos Free Software Foundation, Inc. 92786Ssos Written by Cygnus Support. 102786Ssos 112786SsosThis file is part of BFD, the Binary File Descriptor library. 122786Ssos 132786SsosThis program is free software; you can redistribute it and/or modify 142786Ssosit under the terms of the GNU General Public License as published by 152786Ssosthe Free Software Foundation; either version 2 of the License, or 162786Ssos(at your option) any later version. 172786Ssos 182786SsosThis program is distributed in the hope that it will be useful, 197420Ssosbut WITHOUT ANY WARRANTY; without even the implied warranty of 202786SsosMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 212786SsosGNU General Public License for more details. 222786Ssos 232786SsosYou should have received a copy of the GNU General Public License 242786Ssosalong with this program; if not, write to the Free Software 252786SsosFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 262786Ssos 272786Ssos#include "bfdlink.h" 282786Ssos 292786Ssos/* Object file tdata; access macros */ 302786Ssos 312786Ssos#define coff_data(bfd) ((bfd)->tdata.coff_obj_data) 322786Ssos#define exec_hdr(bfd) (coff_data(bfd)->hdr) 332786Ssos#define obj_pe(bfd) (coff_data(bfd)->pe) 342786Ssos#define obj_symbols(bfd) (coff_data(bfd)->symbols) 352786Ssos#define obj_sym_filepos(bfd) (coff_data(bfd)->sym_filepos) 362786Ssos 372786Ssos#define obj_relocbase(bfd) (coff_data(bfd)->relocbase) 382786Ssos#define obj_raw_syments(bfd) (coff_data(bfd)->raw_syments) 392786Ssos#define obj_raw_syment_count(bfd) (coff_data(bfd)->raw_syment_count) 402786Ssos#define obj_convert(bfd) (coff_data(bfd)->conversion_table) 412786Ssos#define obj_conv_table_size(bfd) (coff_data(bfd)->conv_table_size) 422786Ssos 432786Ssos#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms) 442786Ssos#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms) 452786Ssos#define obj_coff_strings(bfd) (coff_data (bfd)->strings) 462786Ssos#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings) 472786Ssos#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes) 482786Ssos#define obj_coff_strings_written(bfd) (coff_data (bfd)->strings_written) 492786Ssos 502786Ssos#define obj_coff_local_toc_table(bfd) (coff_data(bfd)->local_toc_sym_map) 512786Ssos 522786Ssos/* `Tdata' information kept for COFF files. */ 532786Ssos 542786Ssostypedef struct coff_tdata 552786Ssos{ 562786Ssos struct coff_symbol_struct *symbols; /* symtab for input bfd */ 572786Ssos unsigned int *conversion_table; 582786Ssos int conv_table_size; 592786Ssos file_ptr sym_filepos; 602786Ssos 612786Ssos struct coff_ptr_struct *raw_syments; 6232822Syokota unsigned long raw_syment_count; 632786Ssos 642786Ssos /* These are only valid once writing has begun */ 652786Ssos long int relocbase; 662786Ssos 672786Ssos /* These members communicate important constants about the symbol table 682786Ssos to GDB's symbol-reading code. These `constants' unfortunately vary 692786Ssos from coff implementation to implementation... */ 702786Ssos unsigned local_n_btmask; 712786Ssos unsigned local_n_btshft; 722786Ssos unsigned local_n_tmask; 732786Ssos unsigned local_n_tshift; 742786Ssos unsigned local_symesz; 752786Ssos unsigned local_auxesz; 762786Ssos unsigned local_linesz; 772786Ssos 782786Ssos /* The unswapped external symbols. May be NULL. Read by 792786Ssos _bfd_coff_get_external_symbols. */ 802786Ssos PTR external_syms; 815994Ssos /* If this is true, the external_syms may not be freed. */ 822786Ssos boolean keep_syms; 832786Ssos 842786Ssos /* The string table. May be NULL. Read by 852786Ssos _bfd_coff_read_string_table. */ 862786Ssos char *strings; 872786Ssos /* If this is true, the strings may not be freed. */ 886045Ssos boolean keep_strings; 892786Ssos /* If this is true, the strings have been written out already. */ 902786Ssos boolean strings_written; 912786Ssos 922786Ssos /* is this a PE format coff file */ 932786Ssos int pe; 9418194Ssos /* Used by the COFF backend linker. */ 952786Ssos struct coff_link_hash_entry **sym_hashes; 962786Ssos 972786Ssos /* used by the pe linker for PowerPC */ 982786Ssos int *local_toc_sym_map; 992786Ssos 1002786Ssos struct bfd_link_info *link_info; 1012786Ssos 1022786Ssos /* Used by coff_find_nearest_line. */ 1032786Ssos PTR line_info; 1042786Ssos 1052786Ssos /* A place to stash dwarf2 info for this bfd. */ 1062786Ssos PTR dwarf2_find_line_info; 1072786Ssos 1086851Ssos /* The timestamp from the COFF file header. */ 1092786Ssos long timestamp; 1106851Ssos 1116851Ssos /* Copy of some of the f_flags bits in the COFF filehdr structure, 1126851Ssos used by ARM code. */ 113 flagword flags; 114 115} coff_data_type; 116 117/* Tdata for pe image files. */ 118typedef struct pe_tdata 119{ 120 coff_data_type coff; 121 struct internal_extra_pe_aouthdr pe_opthdr; 122 int dll; 123 int has_reloc_section; 124 boolean (*in_reloc_p) PARAMS((bfd *, reloc_howto_type *)); 125 flagword real_flags; 126 int target_subsystem; 127 boolean force_minimum_alignment; 128} pe_data_type; 129 130#define pe_data(bfd) ((bfd)->tdata.pe_obj_data) 131 132/* Tdata for XCOFF files. */ 133 134struct xcoff_tdata 135{ 136 /* Basic COFF information. */ 137 coff_data_type coff; 138 139 /* True if this is an XCOFF64 file. */ 140 boolean xcoff64; 141 142 /* True if a large a.out header should be generated. */ 143 boolean full_aouthdr; 144 145 /* TOC value. */ 146 bfd_vma toc; 147 148 /* Index of section holding TOC. */ 149 int sntoc; 150 151 /* Index of section holding entry point. */ 152 int snentry; 153 154 /* .text alignment from optional header. */ 155 int text_align_power; 156 157 /* .data alignment from optional header. */ 158 int data_align_power; 159 160 /* modtype from optional header. */ 161 short modtype; 162 163 /* cputype from optional header. */ 164 short cputype; 165 166 /* maxdata from optional header. */ 167 bfd_vma maxdata; 168 169 /* maxstack from optional header. */ 170 bfd_vma maxstack; 171 172 /* Used by the XCOFF backend linker. */ 173 asection **csects; 174 unsigned long *debug_indices; 175 unsigned int import_file_id; 176}; 177 178#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data) 179 180/* We take the address of the first element of an asymbol to ensure that the 181 * macro is only ever applied to an asymbol. */ 182#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd))) 183 184/* The used_by_bfd field of a section may be set to a pointer to this 185 structure. */ 186 187struct coff_section_tdata 188{ 189 /* The relocs, swapped into COFF internal form. This may be NULL. */ 190 struct internal_reloc *relocs; 191 /* If this is true, the relocs entry may not be freed. */ 192 boolean keep_relocs; 193 /* The section contents. This may be NULL. */ 194 bfd_byte *contents; 195 /* If this is true, the contents entry may not be freed. */ 196 boolean keep_contents; 197 /* Information cached by coff_find_nearest_line. */ 198 bfd_vma offset; 199 unsigned int i; 200 const char *function; 201 int line_base; 202 /* A pointer used for .stab linking optimizations. */ 203 PTR stab_info; 204 /* Available for individual backends. */ 205 PTR tdata; 206}; 207 208/* An accessor macro for the coff_section_tdata structure. */ 209#define coff_section_data(abfd, sec) \ 210 ((struct coff_section_tdata *) (sec)->used_by_bfd) 211 212/* Tdata for sections in XCOFF files. This is used by the linker. */ 213 214struct xcoff_section_tdata 215{ 216 /* Used for XCOFF csects created by the linker; points to the real 217 XCOFF section which contains this csect. */ 218 asection *enclosing; 219 /* The lineno_count field for the enclosing section, because we are 220 going to clobber it there. */ 221 unsigned int lineno_count; 222 /* The first and one past the last symbol indices for symbols used 223 by this csect. */ 224 unsigned long first_symndx; 225 unsigned long last_symndx; 226}; 227 228/* An accessor macro the xcoff_section_tdata structure. */ 229#define xcoff_section_data(abfd, sec) \ 230 ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata) 231 232/* Tdata for sections in PE files. */ 233 234struct pei_section_tdata 235{ 236 /* The virtual size of the section. */ 237 bfd_size_type virt_size; 238 /* The PE section flags. */ 239 long pe_flags; 240}; 241 242/* An accessor macro for the pei_section_tdata structure. */ 243#define pei_section_data(abfd, sec) \ 244 ((struct pei_section_tdata *) coff_section_data ((abfd), (sec))->tdata) 245 246/* COFF linker hash table entries. */ 247 248struct coff_link_hash_entry 249{ 250 struct bfd_link_hash_entry root; 251 252 /* Symbol index in output file. Set to -1 initially. Set to -2 if 253 there is a reloc against this symbol. */ 254 long indx; 255 256 /* Symbol type. */ 257 unsigned short type; 258 259 /* Symbol class. */ 260 unsigned char class; 261 262 /* Number of auxiliary entries. */ 263 char numaux; 264 265 /* BFD to take auxiliary entries from. */ 266 bfd *auxbfd; 267 268 /* Pointer to array of auxiliary entries, if any. */ 269 union internal_auxent *aux; 270 271 /* Flag word; legal values follow. */ 272 unsigned short coff_link_hash_flags; 273 /* Symbol is a PE section symbol. */ 274#define COFF_LINK_HASH_PE_SECTION_SYMBOL (01) 275}; 276 277/* COFF linker hash table. */ 278 279struct coff_link_hash_table 280{ 281 struct bfd_link_hash_table root; 282 /* A pointer to information used to link stabs in sections. */ 283 PTR stab_info; 284}; 285 286/* Look up an entry in a COFF linker hash table. */ 287 288#define coff_link_hash_lookup(table, string, create, copy, follow) \ 289 ((struct coff_link_hash_entry *) \ 290 bfd_link_hash_lookup (&(table)->root, (string), (create), \ 291 (copy), (follow))) 292 293/* Traverse a COFF linker hash table. */ 294 295#define coff_link_hash_traverse(table, func, info) \ 296 (bfd_link_hash_traverse \ 297 (&(table)->root, \ 298 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ 299 (info))) 300 301/* Get the COFF linker hash table from a link_info structure. */ 302 303#define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash)) 304 305/* Functions in coffgen.c. */ 306extern const bfd_target *coff_object_p 307 PARAMS ((bfd *)); 308extern struct sec *coff_section_from_bfd_index 309 PARAMS ((bfd *, int)); 310extern long coff_get_symtab_upper_bound 311 PARAMS ((bfd *)); 312extern long coff_get_symtab 313 PARAMS ((bfd *, asymbol **)); 314extern int coff_count_linenumbers 315 PARAMS ((bfd *)); 316extern struct coff_symbol_struct *coff_symbol_from 317 PARAMS ((bfd *, asymbol *)); 318extern boolean coff_renumber_symbols 319 PARAMS ((bfd *, int *)); 320extern void coff_mangle_symbols 321 PARAMS ((bfd *)); 322extern boolean coff_write_symbols 323 PARAMS ((bfd *)); 324extern boolean coff_write_linenumbers 325 PARAMS ((bfd *)); 326extern alent *coff_get_lineno 327 PARAMS ((bfd *, asymbol *)); 328extern asymbol *coff_section_symbol 329 PARAMS ((bfd *, char *)); 330extern boolean _bfd_coff_get_external_symbols 331 PARAMS ((bfd *)); 332extern const char *_bfd_coff_read_string_table 333 PARAMS ((bfd *)); 334extern boolean _bfd_coff_free_symbols 335 PARAMS ((bfd *)); 336extern struct coff_ptr_struct *coff_get_normalized_symtab 337 PARAMS ((bfd *)); 338extern long coff_get_reloc_upper_bound 339 PARAMS ((bfd *, sec_ptr)); 340extern asymbol *coff_make_empty_symbol 341 PARAMS ((bfd *)); 342extern void coff_print_symbol 343 PARAMS ((bfd *, PTR filep, asymbol *, bfd_print_symbol_type)); 344extern void coff_get_symbol_info 345 PARAMS ((bfd *, asymbol *, symbol_info *ret)); 346extern boolean _bfd_coff_is_local_label_name 347 PARAMS ((bfd *, const char *)); 348extern asymbol *coff_bfd_make_debug_symbol 349 PARAMS ((bfd *, PTR, unsigned long)); 350extern boolean coff_find_nearest_line 351 PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **, 352 const char **, unsigned int *)); 353extern int coff_sizeof_headers 354 PARAMS ((bfd *, boolean)); 355extern boolean bfd_coff_reloc16_relax_section 356 PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *)); 357extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents 358 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, 359 bfd_byte *, boolean, asymbol **)); 360extern bfd_vma bfd_coff_reloc16_get_value 361 PARAMS ((arelent *, struct bfd_link_info *, asection *)); 362extern void bfd_perform_slip 363 PARAMS ((bfd *, unsigned int, asection *, bfd_vma)); 364 365/* Functions and types in cofflink.c. */ 366 367#define STRING_SIZE_SIZE (4) 368 369/* We use a hash table to merge identical enum, struct, and union 370 definitions in the linker. */ 371 372/* Information we keep for a single element (an enum value, a 373 structure or union field) in the debug merge hash table. */ 374 375struct coff_debug_merge_element 376{ 377 /* Next element. */ 378 struct coff_debug_merge_element *next; 379 380 /* Name. */ 381 const char *name; 382 383 /* Type. */ 384 unsigned int type; 385 386 /* Symbol index for complex type. */ 387 long tagndx; 388}; 389 390/* A linked list of debug merge entries for a given name. */ 391 392struct coff_debug_merge_type 393{ 394 /* Next type with the same name. */ 395 struct coff_debug_merge_type *next; 396 397 /* Class of type. */ 398 int class; 399 400 /* Symbol index where this type is defined. */ 401 long indx; 402 403 /* List of elements. */ 404 struct coff_debug_merge_element *elements; 405}; 406 407/* Information we store in the debug merge hash table. */ 408 409struct coff_debug_merge_hash_entry 410{ 411 struct bfd_hash_entry root; 412 413 /* A list of types with this name. */ 414 struct coff_debug_merge_type *types; 415}; 416 417/* The debug merge hash table. */ 418 419struct coff_debug_merge_hash_table 420{ 421 struct bfd_hash_table root; 422}; 423 424/* Initialize a COFF debug merge hash table. */ 425 426#define coff_debug_merge_hash_table_init(table) \ 427 (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc)) 428 429/* Free a COFF debug merge hash table. */ 430 431#define coff_debug_merge_hash_table_free(table) \ 432 (bfd_hash_table_free (&(table)->root)) 433 434/* Look up an entry in a COFF debug merge hash table. */ 435 436#define coff_debug_merge_hash_lookup(table, string, create, copy) \ 437 ((struct coff_debug_merge_hash_entry *) \ 438 bfd_hash_lookup (&(table)->root, (string), (create), (copy))) 439 440/* Information we keep for each section in the output file when doing 441 a relocateable link. */ 442 443struct coff_link_section_info 444{ 445 /* The relocs to be output. */ 446 struct internal_reloc *relocs; 447 /* For each reloc against a global symbol whose index was not known 448 when the reloc was handled, the global hash table entry. */ 449 struct coff_link_hash_entry **rel_hashes; 450}; 451 452/* Information that we pass around while doing the final link step. */ 453 454struct coff_final_link_info 455{ 456 /* General link information. */ 457 struct bfd_link_info *info; 458 /* Output BFD. */ 459 bfd *output_bfd; 460 /* Used to indicate failure in traversal routine. */ 461 boolean failed; 462 /* If doing "task linking" set only during the time when we want the 463 global symbol writer to convert the storage class of defined global 464 symbols from global to static. */ 465 boolean global_to_static; 466 /* Hash table for long symbol names. */ 467 struct bfd_strtab_hash *strtab; 468 /* When doing a relocateable link, an array of information kept for 469 each output section, indexed by the target_index field. */ 470 struct coff_link_section_info *section_info; 471 /* Symbol index of last C_FILE symbol (-1 if none). */ 472 long last_file_index; 473 /* Contents of last C_FILE symbol. */ 474 struct internal_syment last_file; 475 /* Symbol index of first aux entry of last .bf symbol with an empty 476 endndx field (-1 if none). */ 477 long last_bf_index; 478 /* Contents of last_bf_index aux entry. */ 479 union internal_auxent last_bf; 480 /* Hash table used to merge debug information. */ 481 struct coff_debug_merge_hash_table debug_merge; 482 /* Buffer large enough to hold swapped symbols of any input file. */ 483 struct internal_syment *internal_syms; 484 /* Buffer large enough to hold sections of symbols of any input file. */ 485 asection **sec_ptrs; 486 /* Buffer large enough to hold output indices of symbols of any 487 input file. */ 488 long *sym_indices; 489 /* Buffer large enough to hold output symbols for any input file. */ 490 bfd_byte *outsyms; 491 /* Buffer large enough to hold external line numbers for any input 492 section. */ 493 bfd_byte *linenos; 494 /* Buffer large enough to hold any input section. */ 495 bfd_byte *contents; 496 /* Buffer large enough to hold external relocs of any input section. */ 497 bfd_byte *external_relocs; 498 /* Buffer large enough to hold swapped relocs of any input section. */ 499 struct internal_reloc *internal_relocs; 500}; 501 502/* Most COFF variants have no way to record the alignment of a 503 section. This struct is used to set a specific alignment based on 504 the name of the section. */ 505 506struct coff_section_alignment_entry 507{ 508 /* The section name. */ 509 const char *name; 510 511 /* This is either (unsigned int) -1, indicating that the section 512 name must match exactly, or it is the number of letters which 513 must match at the start of the name. */ 514 unsigned int comparison_length; 515 516 /* These macros may be used to fill in the first two fields in a 517 structure initialization. */ 518#define COFF_SECTION_NAME_EXACT_MATCH(name) (name), ((unsigned int) -1) 519#define COFF_SECTION_NAME_PARTIAL_MATCH(name) (name), (sizeof (name) - 1) 520 521 /* Only use this entry if the default section alignment for this 522 target is at least that much (as a power of two). If this field 523 is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */ 524 unsigned int default_alignment_min; 525 526 /* Only use this entry if the default section alignment for this 527 target is no greater than this (as a power of two). If this 528 field is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */ 529 unsigned int default_alignment_max; 530 531#define COFF_ALIGNMENT_FIELD_EMPTY ((unsigned int) -1) 532 533 /* The desired alignment for this section (as a power of two). */ 534 unsigned int alignment_power; 535}; 536 537extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc 538 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); 539extern boolean _bfd_coff_link_hash_table_init 540 PARAMS ((struct coff_link_hash_table *, bfd *, 541 struct bfd_hash_entry *(*) (struct bfd_hash_entry *, 542 struct bfd_hash_table *, 543 const char *))); 544extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create 545 PARAMS ((bfd *)); 546extern const char *_bfd_coff_internal_syment_name 547 PARAMS ((bfd *, const struct internal_syment *, char *)); 548extern boolean _bfd_coff_link_add_symbols 549 PARAMS ((bfd *, struct bfd_link_info *)); 550extern boolean _bfd_coff_final_link 551 PARAMS ((bfd *, struct bfd_link_info *)); 552extern struct internal_reloc *_bfd_coff_read_internal_relocs 553 PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean, 554 struct internal_reloc *)); 555extern boolean _bfd_coff_generic_relocate_section 556 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 557 struct internal_reloc *, struct internal_syment *, asection **)); 558 559extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc 560 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); 561extern boolean _bfd_coff_write_global_sym 562 PARAMS ((struct coff_link_hash_entry *, PTR)); 563extern boolean _bfd_coff_write_task_globals 564 PARAMS ((struct coff_link_hash_entry *, PTR)); 565extern boolean _bfd_coff_link_input_bfd 566 PARAMS ((struct coff_final_link_info *, bfd *)); 567extern boolean _bfd_coff_reloc_link_order 568 PARAMS ((bfd *, struct coff_final_link_info *, asection *, 569 struct bfd_link_order *)); 570 571 572#define coff_get_section_contents_in_window \ 573 _bfd_generic_get_section_contents_in_window 574 575/* Functions in xcofflink.c. */ 576 577extern long _bfd_xcoff_get_dynamic_symtab_upper_bound 578 PARAMS ((bfd *)); 579extern long _bfd_xcoff_canonicalize_dynamic_symtab 580 PARAMS ((bfd *, asymbol **)); 581extern long _bfd_xcoff_get_dynamic_reloc_upper_bound 582 PARAMS ((bfd *)); 583extern long _bfd_xcoff_canonicalize_dynamic_reloc 584 PARAMS ((bfd *, arelent **, asymbol **)); 585extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create 586 PARAMS ((bfd *)); 587extern boolean _bfd_xcoff_bfd_link_add_symbols 588 PARAMS ((bfd *, struct bfd_link_info *)); 589extern boolean _bfd_xcoff_bfd_final_link 590 PARAMS ((bfd *, struct bfd_link_info *)); 591extern boolean _bfd_ppc_xcoff_relocate_section 592 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 593 struct internal_reloc *, struct internal_syment *, asection **)); 594 595/* Functions in coff-ppc.c. FIXME: These are called be pe.em in the 596 linker, and so should start with bfd and be declared in bfd.h. */ 597 598extern boolean ppc_allocate_toc_section 599 PARAMS ((struct bfd_link_info *)); 600extern boolean ppc_process_before_allocation 601 PARAMS ((bfd *, struct bfd_link_info *)); 602 603/* And more taken from the source .. */ 604 605typedef struct coff_ptr_struct 606{ 607 /* Remembers the offset from the first symbol in the file for 608 this symbol. Generated by coff_renumber_symbols. */ 609 unsigned int offset; 610 611 /* Should the value of this symbol be renumbered. Used for 612 XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */ 613 unsigned int fix_value : 1; 614 615 /* Should the tag field of this symbol be renumbered. 616 Created by coff_pointerize_aux. */ 617 unsigned int fix_tag : 1; 618 619 /* Should the endidx field of this symbol be renumbered. 620 Created by coff_pointerize_aux. */ 621 unsigned int fix_end : 1; 622 623 /* Should the x_csect.x_scnlen field be renumbered. 624 Created by coff_pointerize_aux. */ 625 unsigned int fix_scnlen : 1; 626 627 /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the 628 index into the line number entries. Set by coff_slurp_symbol_table. */ 629 unsigned int fix_line : 1; 630 631 /* The container for the symbol structure as read and translated 632 from the file. */ 633 union 634 { 635 union internal_auxent auxent; 636 struct internal_syment syment; 637 } u; 638} combined_entry_type; 639 640 641/* Each canonical asymbol really looks like this: */ 642 643typedef struct coff_symbol_struct 644{ 645 /* The actual symbol which the rest of BFD works with */ 646 asymbol symbol; 647 648 /* A pointer to the hidden information for this symbol */ 649 combined_entry_type *native; 650 651 /* A pointer to the linenumber information for this symbol */ 652 struct lineno_cache_entry *lineno; 653 654 /* Have the line numbers been relocated yet ? */ 655 boolean done_lineno; 656} coff_symbol_type; 657/* COFF symbol classifications. */ 658 659enum coff_symbol_classification 660{ 661 /* Global symbol. */ 662 COFF_SYMBOL_GLOBAL, 663 /* Common symbol. */ 664 COFF_SYMBOL_COMMON, 665 /* Undefined symbol. */ 666 COFF_SYMBOL_UNDEFINED, 667 /* Local symbol. */ 668 COFF_SYMBOL_LOCAL, 669 /* PE section symbol. */ 670 COFF_SYMBOL_PE_SECTION 671}; 672 673typedef struct 674{ 675 void (*_bfd_coff_swap_aux_in) 676 PARAMS ((bfd *, PTR, int, int, int, int, PTR)); 677 678 void (*_bfd_coff_swap_sym_in) 679 PARAMS ((bfd *, PTR, PTR)); 680 681 void (*_bfd_coff_swap_lineno_in) 682 PARAMS ((bfd *, PTR, PTR)); 683 684 unsigned int (*_bfd_coff_swap_aux_out) 685 PARAMS ((bfd *, PTR, int, int, int, int, PTR)); 686 687 unsigned int (*_bfd_coff_swap_sym_out) 688 PARAMS ((bfd *, PTR, PTR)); 689 690 unsigned int (*_bfd_coff_swap_lineno_out) 691 PARAMS ((bfd *, PTR, PTR)); 692 693 unsigned int (*_bfd_coff_swap_reloc_out) 694 PARAMS ((bfd *, PTR, PTR)); 695 696 unsigned int (*_bfd_coff_swap_filehdr_out) 697 PARAMS ((bfd *, PTR, PTR)); 698 699 unsigned int (*_bfd_coff_swap_aouthdr_out) 700 PARAMS ((bfd *, PTR, PTR)); 701 702 unsigned int (*_bfd_coff_swap_scnhdr_out) 703 PARAMS ((bfd *, PTR, PTR)); 704 705 unsigned int _bfd_filhsz; 706 unsigned int _bfd_aoutsz; 707 unsigned int _bfd_scnhsz; 708 unsigned int _bfd_symesz; 709 unsigned int _bfd_auxesz; 710 unsigned int _bfd_relsz; 711 unsigned int _bfd_linesz; 712 unsigned int _bfd_filnmlen; 713 boolean _bfd_coff_long_filenames; 714 boolean _bfd_coff_long_section_names; 715 unsigned int _bfd_coff_default_section_alignment_power; 716 boolean _bfd_coff_force_symnames_in_strings; 717 unsigned int _bfd_coff_debug_string_prefix_length; 718 719 void (*_bfd_coff_swap_filehdr_in) 720 PARAMS ((bfd *, PTR, PTR)); 721 722 void (*_bfd_coff_swap_aouthdr_in) 723 PARAMS ((bfd *, PTR, PTR)); 724 725 void (*_bfd_coff_swap_scnhdr_in) 726 PARAMS ((bfd *, PTR, PTR)); 727 728 void (*_bfd_coff_swap_reloc_in) 729 PARAMS ((bfd *abfd, PTR, PTR)); 730 731 boolean (*_bfd_coff_bad_format_hook) 732 PARAMS ((bfd *, PTR)); 733 734 boolean (*_bfd_coff_set_arch_mach_hook) 735 PARAMS ((bfd *, PTR)); 736 737 PTR (*_bfd_coff_mkobject_hook) 738 PARAMS ((bfd *, PTR, PTR)); 739 740 boolean (*_bfd_styp_to_sec_flags_hook) 741 PARAMS ((bfd *, PTR, const char *, asection *, flagword *)); 742 743 void (*_bfd_set_alignment_hook) 744 PARAMS ((bfd *, asection *, PTR)); 745 746 boolean (*_bfd_coff_slurp_symbol_table) 747 PARAMS ((bfd *)); 748 749 boolean (*_bfd_coff_symname_in_debug) 750 PARAMS ((bfd *, struct internal_syment *)); 751 752 boolean (*_bfd_coff_pointerize_aux_hook) 753 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *, 754 unsigned int, combined_entry_type *)); 755 756 boolean (*_bfd_coff_print_aux) 757 PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *, 758 combined_entry_type *, unsigned int)); 759 760 void (*_bfd_coff_reloc16_extra_cases) 761 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, 762 bfd_byte *, unsigned int *, unsigned int *)); 763 764 int (*_bfd_coff_reloc16_estimate) 765 PARAMS ((bfd *, asection *, arelent *, unsigned int, 766 struct bfd_link_info *)); 767 768 enum coff_symbol_classification (*_bfd_coff_classify_symbol) 769 PARAMS ((bfd *, struct internal_syment *)); 770 771 boolean (*_bfd_coff_compute_section_file_positions) 772 PARAMS ((bfd *)); 773 774 boolean (*_bfd_coff_start_final_link) 775 PARAMS ((bfd *, struct bfd_link_info *)); 776 777 boolean (*_bfd_coff_relocate_section) 778 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 779 struct internal_reloc *, struct internal_syment *, asection **)); 780 781 reloc_howto_type *(*_bfd_coff_rtype_to_howto) 782 PARAMS ((bfd *, asection *, struct internal_reloc *, 783 struct coff_link_hash_entry *, struct internal_syment *, 784 bfd_vma *)); 785 786 boolean (*_bfd_coff_adjust_symndx)\ 787 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, 788 struct internal_reloc *, boolean *)); 789 790 boolean (*_bfd_coff_link_add_one_symbol) 791 PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, 792 asection *, bfd_vma, const char *, boolean, boolean, 793 struct bfd_link_hash_entry **)); 794 795 boolean (*_bfd_coff_link_output_has_begun) 796 PARAMS ((bfd *, struct coff_final_link_info *)); 797 798 boolean (*_bfd_coff_final_link_postscript) 799 PARAMS ((bfd *, struct coff_final_link_info *)); 800 801} bfd_coff_backend_data; 802 803#define coff_backend_info(abfd) \ 804 ((bfd_coff_backend_data *) (abfd)->xvec->backend_data) 805 806#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \ 807 ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i)) 808 809#define bfd_coff_swap_sym_in(a,e,i) \ 810 ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i)) 811 812#define bfd_coff_swap_lineno_in(a,e,i) \ 813 ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i)) 814 815#define bfd_coff_swap_reloc_out(abfd, i, o) \ 816 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o)) 817 818#define bfd_coff_swap_lineno_out(abfd, i, o) \ 819 ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o)) 820 821#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \ 822 ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o)) 823 824#define bfd_coff_swap_sym_out(abfd, i,o) \ 825 ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o)) 826 827#define bfd_coff_swap_scnhdr_out(abfd, i,o) \ 828 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o)) 829 830#define bfd_coff_swap_filehdr_out(abfd, i,o) \ 831 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o)) 832 833#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ 834 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o)) 835 836#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz) 837#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz) 838#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz) 839#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz) 840#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz) 841#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz) 842#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz) 843#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen) 844#define bfd_coff_long_filenames(abfd) \ 845 (coff_backend_info (abfd)->_bfd_coff_long_filenames) 846#define bfd_coff_long_section_names(abfd) \ 847 (coff_backend_info (abfd)->_bfd_coff_long_section_names) 848#define bfd_coff_default_section_alignment_power(abfd) \ 849 (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) 850#define bfd_coff_swap_filehdr_in(abfd, i,o) \ 851 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) 852 853#define bfd_coff_swap_aouthdr_in(abfd, i,o) \ 854 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o)) 855 856#define bfd_coff_swap_scnhdr_in(abfd, i,o) \ 857 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o)) 858 859#define bfd_coff_swap_reloc_in(abfd, i, o) \ 860 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o)) 861 862#define bfd_coff_bad_format_hook(abfd, filehdr) \ 863 ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr)) 864 865#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ 866 ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) 867#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ 868 ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr)) 869 870#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\ 871 ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ 872 (abfd, scnhdr, name, section, flags_ptr)) 873 874#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\ 875 ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr)) 876 877#define bfd_coff_slurp_symbol_table(abfd)\ 878 ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd)) 879 880#define bfd_coff_symname_in_debug(abfd, sym)\ 881 ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym)) 882 883#define bfd_coff_force_symnames_in_strings(abfd)\ 884 (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings) 885 886#define bfd_coff_debug_string_prefix_length(abfd)\ 887 (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length) 888 889#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\ 890 ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ 891 (abfd, file, base, symbol, aux, indaux)) 892 893#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\ 894 ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ 895 (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) 896 897#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\ 898 ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\ 899 (abfd, section, reloc, shrink, link_info)) 900 901#define bfd_coff_classify_symbol(abfd, sym)\ 902 ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\ 903 (abfd, sym)) 904 905#define bfd_coff_compute_section_file_positions(abfd)\ 906 ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\ 907 (abfd)) 908 909#define bfd_coff_start_final_link(obfd, info)\ 910 ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\ 911 (obfd, info)) 912#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ 913 ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ 914 (obfd, info, ibfd, o, con, rel, isyms, secs)) 915#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ 916 ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ 917 (abfd, sec, rel, h, sym, addendp)) 918#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ 919 ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ 920 (obfd, info, ibfd, sec, rel, adjustedp)) 921#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\ 922 ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\ 923 (info, abfd, name, flags, section, value, string, cp, coll, hashp)) 924 925#define bfd_coff_link_output_has_begun(a,p) \ 926 ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p)) 927#define bfd_coff_final_link_postscript(a,p) \ 928 ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p)) 929 930