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