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