Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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