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