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