Subversion Repositories Kolibri OS

Rev

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