Subversion Repositories Kolibri OS

Rev

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

  1. /* COFF specific linker code.
  2.    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
  3.    2004, 2005, 2006, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
  4.    Written by Ian Lance Taylor, Cygnus Support.
  5.  
  6.    This file is part of BFD, the Binary File Descriptor library.
  7.  
  8.    This program is free software; you can redistribute it and/or modify
  9.    it under the terms of the GNU General Public License as published by
  10.    the Free Software Foundation; either version 3 of the License, or
  11.    (at your option) any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful,
  14.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    GNU General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software
  20.    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  21.    MA 02110-1301, USA.  */
  22.  
  23. /* This file contains the COFF backend linker code.  */
  24.  
  25. #include "sysdep.h"
  26. #include "bfd.h"
  27. #include "bfdlink.h"
  28. #include "libbfd.h"
  29. #include "coff/internal.h"
  30. #include "libcoff.h"
  31. #include "safe-ctype.h"
  32.  
  33. static bfd_boolean coff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info);
  34. static bfd_boolean coff_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, bfd_boolean *pneeded);
  35. static bfd_boolean coff_link_add_symbols (bfd *abfd, struct bfd_link_info *info);
  36.  
  37. /* Return TRUE if SYM is a weak, external symbol.  */
  38. #define IS_WEAK_EXTERNAL(abfd, sym)                     \
  39.   ((sym).n_sclass == C_WEAKEXT                          \
  40.    || (obj_pe (abfd) && (sym).n_sclass == C_NT_WEAK))
  41.  
  42. /* Return TRUE if SYM is an external symbol.  */
  43. #define IS_EXTERNAL(abfd, sym)                          \
  44.   ((sym).n_sclass == C_EXT || IS_WEAK_EXTERNAL (abfd, sym))
  45.  
  46. /* Define macros so that the ISFCN, et. al., macros work correctly.
  47.    These macros are defined in include/coff/internal.h in terms of
  48.    N_TMASK, etc.  These definitions require a user to define local
  49.    variables with the appropriate names, and with values from the
  50.    coff_data (abfd) structure.  */
  51.  
  52. #define N_TMASK n_tmask
  53. #define N_BTSHFT n_btshft
  54. #define N_BTMASK n_btmask
  55.  
  56. /* Create an entry in a COFF linker hash table.  */
  57.  
  58. struct bfd_hash_entry *
  59. _bfd_coff_link_hash_newfunc (struct bfd_hash_entry *entry,
  60.                              struct bfd_hash_table *table,
  61.                              const char *string)
  62. {
  63.   struct coff_link_hash_entry *ret = (struct coff_link_hash_entry *) entry;
  64.  
  65.   /* Allocate the structure if it has not already been allocated by a
  66.      subclass.  */
  67.   if (ret == (struct coff_link_hash_entry *) NULL)
  68.     ret = ((struct coff_link_hash_entry *)
  69.            bfd_hash_allocate (table, sizeof (struct coff_link_hash_entry)));
  70.   if (ret == (struct coff_link_hash_entry *) NULL)
  71.     return (struct bfd_hash_entry *) ret;
  72.  
  73.   /* Call the allocation method of the superclass.  */
  74.   ret = ((struct coff_link_hash_entry *)
  75.          _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
  76.                                  table, string));
  77.   if (ret != (struct coff_link_hash_entry *) NULL)
  78.     {
  79.       /* Set local fields.  */
  80.       ret->indx = -1;
  81.       ret->type = T_NULL;
  82.       ret->symbol_class = C_NULL;
  83.       ret->numaux = 0;
  84.       ret->auxbfd = NULL;
  85.       ret->aux = NULL;
  86.     }
  87.  
  88.   return (struct bfd_hash_entry *) ret;
  89. }
  90.  
  91. /* Initialize a COFF linker hash table.  */
  92.  
  93. bfd_boolean
  94. _bfd_coff_link_hash_table_init (struct coff_link_hash_table *table,
  95.                                 bfd *abfd,
  96.                                 struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
  97.                                                                    struct bfd_hash_table *,
  98.                                                                    const char *),
  99.                                 unsigned int entsize)
  100. {
  101.   memset (&table->stab_info, 0, sizeof (table->stab_info));
  102.   return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize);
  103. }
  104.  
  105. /* Create a COFF linker hash table.  */
  106.  
  107. struct bfd_link_hash_table *
  108. _bfd_coff_link_hash_table_create (bfd *abfd)
  109. {
  110.   struct coff_link_hash_table *ret;
  111.   bfd_size_type amt = sizeof (struct coff_link_hash_table);
  112.  
  113.   ret = (struct coff_link_hash_table *) bfd_malloc (amt);
  114.   if (ret == NULL)
  115.     return NULL;
  116.  
  117.   if (! _bfd_coff_link_hash_table_init (ret, abfd,
  118.                                         _bfd_coff_link_hash_newfunc,
  119.                                         sizeof (struct coff_link_hash_entry)))
  120.     {
  121.       free (ret);
  122.       return (struct bfd_link_hash_table *) NULL;
  123.     }
  124.   return &ret->root;
  125. }
  126.  
  127. /* Create an entry in a COFF debug merge hash table.  */
  128.  
  129. struct bfd_hash_entry *
  130. _bfd_coff_debug_merge_hash_newfunc (struct bfd_hash_entry *entry,
  131.                                     struct bfd_hash_table *table,
  132.                                     const char *string)
  133. {
  134.   struct coff_debug_merge_hash_entry *ret =
  135.     (struct coff_debug_merge_hash_entry *) entry;
  136.  
  137.   /* Allocate the structure if it has not already been allocated by a
  138.      subclass.  */
  139.   if (ret == (struct coff_debug_merge_hash_entry *) NULL)
  140.     ret = ((struct coff_debug_merge_hash_entry *)
  141.            bfd_hash_allocate (table,
  142.                               sizeof (struct coff_debug_merge_hash_entry)));
  143.   if (ret == (struct coff_debug_merge_hash_entry *) NULL)
  144.     return (struct bfd_hash_entry *) ret;
  145.  
  146.   /* Call the allocation method of the superclass.  */
  147.   ret = ((struct coff_debug_merge_hash_entry *)
  148.          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
  149.   if (ret != (struct coff_debug_merge_hash_entry *) NULL)
  150.     {
  151.       /* Set local fields.  */
  152.       ret->types = NULL;
  153.     }
  154.  
  155.   return (struct bfd_hash_entry *) ret;
  156. }
  157.  
  158. /* Given a COFF BFD, add symbols to the global hash table as
  159.    appropriate.  */
  160.  
  161. bfd_boolean
  162. _bfd_coff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
  163. {
  164.   switch (bfd_get_format (abfd))
  165.     {
  166.     case bfd_object:
  167.       return coff_link_add_object_symbols (abfd, info);
  168.     case bfd_archive:
  169.       return _bfd_generic_link_add_archive_symbols
  170.         (abfd, info, coff_link_check_archive_element);
  171.     default:
  172.       bfd_set_error (bfd_error_wrong_format);
  173.       return FALSE;
  174.     }
  175. }
  176.  
  177. /* Add symbols from a COFF object file.  */
  178.  
  179. static bfd_boolean
  180. coff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
  181. {
  182.   if (! _bfd_coff_get_external_symbols (abfd))
  183.     return FALSE;
  184.   if (! coff_link_add_symbols (abfd, info))
  185.     return FALSE;
  186.  
  187.   if (! info->keep_memory
  188.       && ! _bfd_coff_free_symbols (abfd))
  189.     return FALSE;
  190.  
  191.   return TRUE;
  192. }
  193.  
  194. /* Look through the symbols to see if this object file should be
  195.    included in the link.  */
  196.  
  197. static bfd_boolean
  198. coff_link_check_ar_symbols (bfd *abfd,
  199.                             struct bfd_link_info *info,
  200.                             bfd_boolean *pneeded,
  201.                             bfd **subsbfd)
  202. {
  203.   bfd_size_type symesz;
  204.   bfd_byte *esym;
  205.   bfd_byte *esym_end;
  206.  
  207.   *pneeded = FALSE;
  208.  
  209.   symesz = bfd_coff_symesz (abfd);
  210.   esym = (bfd_byte *) obj_coff_external_syms (abfd);
  211.   esym_end = esym + obj_raw_syment_count (abfd) * symesz;
  212.   while (esym < esym_end)
  213.     {
  214.       struct internal_syment sym;
  215.       enum coff_symbol_classification classification;
  216.  
  217.       bfd_coff_swap_sym_in (abfd, esym, &sym);
  218.  
  219.       classification = bfd_coff_classify_symbol (abfd, &sym);
  220.       if (classification == COFF_SYMBOL_GLOBAL
  221.           || classification == COFF_SYMBOL_COMMON)
  222.         {
  223.           const char *name;
  224.           char buf[SYMNMLEN + 1];
  225.           struct bfd_link_hash_entry *h;
  226.  
  227.           /* This symbol is externally visible, and is defined by this
  228.              object file.  */
  229.           name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
  230.           if (name == NULL)
  231.             return FALSE;
  232.           h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
  233.  
  234.           /* Auto import.  */
  235.           if (!h
  236.               && info->pei386_auto_import
  237.               && CONST_STRNEQ (name, "__imp_"))
  238.             h = bfd_link_hash_lookup (info->hash, name + 6, FALSE, FALSE, TRUE);
  239.  
  240.           /* We are only interested in symbols that are currently
  241.              undefined.  If a symbol is currently known to be common,
  242.              COFF linkers do not bring in an object file which defines
  243.              it.  */
  244.           if (h != (struct bfd_link_hash_entry *) NULL
  245.               && h->type == bfd_link_hash_undefined)
  246.             {
  247.               if (!(*info->callbacks
  248.                     ->add_archive_element) (info, abfd, name, subsbfd))
  249.                 return FALSE;
  250.               *pneeded = TRUE;
  251.               return TRUE;
  252.             }
  253.         }
  254.  
  255.       esym += (sym.n_numaux + 1) * symesz;
  256.     }
  257.  
  258.   /* We do not need this object file.  */
  259.   return TRUE;
  260. }
  261.  
  262. /* Check a single archive element to see if we need to include it in
  263.    the link.  *PNEEDED is set according to whether this element is
  264.    needed in the link or not.  This is called via
  265.    _bfd_generic_link_add_archive_symbols.  */
  266.  
  267. static bfd_boolean
  268. coff_link_check_archive_element (bfd *abfd,
  269.                                  struct bfd_link_info *info,
  270.                                  bfd_boolean *pneeded)
  271. {
  272.   bfd *oldbfd;
  273.   bfd_boolean needed;
  274.  
  275.   if (!_bfd_coff_get_external_symbols (abfd))
  276.     return FALSE;
  277.  
  278.   oldbfd = abfd;
  279.   if (!coff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
  280.     return FALSE;
  281.  
  282.   needed = *pneeded;
  283.   if (needed)
  284.     {
  285.       /* Potentially, the add_archive_element hook may have set a
  286.          substitute BFD for us.  */
  287.       if (abfd != oldbfd)
  288.         {
  289.           if (!info->keep_memory
  290.               && !_bfd_coff_free_symbols (oldbfd))
  291.             return FALSE;
  292.           if (!_bfd_coff_get_external_symbols (abfd))
  293.             return FALSE;
  294.         }
  295.       if (!coff_link_add_symbols (abfd, info))
  296.         return FALSE;
  297.     }
  298.  
  299.   if (!info->keep_memory || !needed)
  300.     {
  301.       if (!_bfd_coff_free_symbols (abfd))
  302.         return FALSE;
  303.     }
  304.   return TRUE;
  305. }
  306.  
  307. /* Add all the symbols from an object file to the hash table.  */
  308.  
  309. static bfd_boolean
  310. coff_link_add_symbols (bfd *abfd,
  311.                        struct bfd_link_info *info)
  312. {
  313.   unsigned int n_tmask = coff_data (abfd)->local_n_tmask;
  314.   unsigned int n_btshft = coff_data (abfd)->local_n_btshft;
  315.   unsigned int n_btmask = coff_data (abfd)->local_n_btmask;
  316.   bfd_boolean keep_syms;
  317.   bfd_boolean default_copy;
  318.   bfd_size_type symcount;
  319.   struct coff_link_hash_entry **sym_hash;
  320.   bfd_size_type symesz;
  321.   bfd_byte *esym;
  322.   bfd_byte *esym_end;
  323.   bfd_size_type amt;
  324.  
  325.   symcount = obj_raw_syment_count (abfd);
  326.  
  327.   if (symcount == 0)
  328.     return TRUE;                /* Nothing to do.  */
  329.  
  330.   /* Keep the symbols during this function, in case the linker needs
  331.      to read the generic symbols in order to report an error message.  */
  332.   keep_syms = obj_coff_keep_syms (abfd);
  333.   obj_coff_keep_syms (abfd) = TRUE;
  334.  
  335.   if (info->keep_memory)
  336.     default_copy = FALSE;
  337.   else
  338.     default_copy = TRUE;
  339.  
  340.   /* We keep a list of the linker hash table entries that correspond
  341.      to particular symbols.  */
  342.   amt = symcount * sizeof (struct coff_link_hash_entry *);
  343.   sym_hash = (struct coff_link_hash_entry **) bfd_zalloc (abfd, amt);
  344.   if (sym_hash == NULL)
  345.     goto error_return;
  346.   obj_coff_sym_hashes (abfd) = sym_hash;
  347.  
  348.   symesz = bfd_coff_symesz (abfd);
  349.   BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
  350.   esym = (bfd_byte *) obj_coff_external_syms (abfd);
  351.   esym_end = esym + symcount * symesz;
  352.   while (esym < esym_end)
  353.     {
  354.       struct internal_syment sym;
  355.       enum coff_symbol_classification classification;
  356.       bfd_boolean copy;
  357.  
  358.       bfd_coff_swap_sym_in (abfd, esym, &sym);
  359.  
  360.       classification = bfd_coff_classify_symbol (abfd, &sym);
  361.       if (classification != COFF_SYMBOL_LOCAL)
  362.         {
  363.           const char *name;
  364.           char buf[SYMNMLEN + 1];
  365.           flagword flags;
  366.           asection *section;
  367.           bfd_vma value;
  368.           bfd_boolean addit;
  369.  
  370.           /* This symbol is externally visible.  */
  371.  
  372.           name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
  373.           if (name == NULL)
  374.             goto error_return;
  375.  
  376.           /* We must copy the name into memory if we got it from the
  377.              syment itself, rather than the string table.  */
  378.           copy = default_copy;
  379.           if (sym._n._n_n._n_zeroes != 0
  380.               || sym._n._n_n._n_offset == 0)
  381.             copy = TRUE;
  382.  
  383.           value = sym.n_value;
  384.  
  385.           switch (classification)
  386.             {
  387.             default:
  388.               abort ();
  389.  
  390.             case COFF_SYMBOL_GLOBAL:
  391.               flags = BSF_EXPORT | BSF_GLOBAL;
  392.               section = coff_section_from_bfd_index (abfd, sym.n_scnum);
  393.               if (! obj_pe (abfd))
  394.                 value -= section->vma;
  395.               break;
  396.  
  397.             case COFF_SYMBOL_UNDEFINED:
  398.               flags = 0;
  399.               section = bfd_und_section_ptr;
  400.               break;
  401.  
  402.             case COFF_SYMBOL_COMMON:
  403.               flags = BSF_GLOBAL;
  404.               section = bfd_com_section_ptr;
  405.               break;
  406.  
  407.             case COFF_SYMBOL_PE_SECTION:
  408.               flags = BSF_SECTION_SYM | BSF_GLOBAL;
  409.               section = coff_section_from_bfd_index (abfd, sym.n_scnum);
  410.               break;
  411.             }
  412.  
  413.           if (IS_WEAK_EXTERNAL (abfd, sym))
  414.             flags = BSF_WEAK;
  415.  
  416.           addit = TRUE;
  417.  
  418.           /* In the PE format, section symbols actually refer to the
  419.              start of the output section.  We handle them specially
  420.              here.  */
  421.           if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
  422.             {
  423.               *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
  424.                                                  name, FALSE, copy, FALSE);
  425.               if (*sym_hash != NULL)
  426.                 {
  427.                   if (((*sym_hash)->coff_link_hash_flags
  428.                        & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0
  429.                       && (*sym_hash)->root.type != bfd_link_hash_undefined
  430.                       && (*sym_hash)->root.type != bfd_link_hash_undefweak)
  431.                     (*_bfd_error_handler)
  432.                       ("Warning: symbol `%s' is both section and non-section",
  433.                        name);
  434.  
  435.                   addit = FALSE;
  436.                 }
  437.             }
  438.  
  439.           /* The Microsoft Visual C compiler does string pooling by
  440.              hashing the constants to an internal symbol name, and
  441.              relying on the linker comdat support to discard
  442.              duplicate names.  However, if one string is a literal and
  443.              one is a data initializer, one will end up in the .data
  444.              section and one will end up in the .rdata section.  The
  445.              Microsoft linker will combine them into the .data
  446.              section, which seems to be wrong since it might cause the
  447.              literal to change.
  448.  
  449.              As long as there are no external references to the
  450.              symbols, which there shouldn't be, we can treat the .data
  451.              and .rdata instances as separate symbols.  The comdat
  452.              code in the linker will do the appropriate merging.  Here
  453.              we avoid getting a multiple definition error for one of
  454.              these special symbols.
  455.  
  456.              FIXME: I don't think this will work in the case where
  457.              there are two object files which use the constants as a
  458.              literal and two object files which use it as a data
  459.              initializer.  One or the other of the second object files
  460.              is going to wind up with an inappropriate reference.  */
  461.           if (obj_pe (abfd)
  462.               && (classification == COFF_SYMBOL_GLOBAL
  463.                   || classification == COFF_SYMBOL_PE_SECTION)
  464.               && coff_section_data (abfd, section) != NULL
  465.               && coff_section_data (abfd, section)->comdat != NULL
  466.               && CONST_STRNEQ (name, "??_")
  467.               && strcmp (name, coff_section_data (abfd, section)->comdat->name) == 0)
  468.             {
  469.               if (*sym_hash == NULL)
  470.                 *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
  471.                                                    name, FALSE, copy, FALSE);
  472.               if (*sym_hash != NULL
  473.                   && (*sym_hash)->root.type == bfd_link_hash_defined
  474.                   && coff_section_data (abfd, (*sym_hash)->root.u.def.section)->comdat != NULL
  475.                   && strcmp (coff_section_data (abfd, (*sym_hash)->root.u.def.section)->comdat->name,
  476.                              coff_section_data (abfd, section)->comdat->name) == 0)
  477.                 addit = FALSE;
  478.             }
  479.  
  480.           if (addit)
  481.             {
  482.               if (! (bfd_coff_link_add_one_symbol
  483.                      (info, abfd, name, flags, section, value,
  484.                       (const char *) NULL, copy, FALSE,
  485.                       (struct bfd_link_hash_entry **) sym_hash)))
  486.                 goto error_return;
  487.             }
  488.  
  489.           if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
  490.             (*sym_hash)->coff_link_hash_flags |=
  491.               COFF_LINK_HASH_PE_SECTION_SYMBOL;
  492.  
  493.           /* Limit the alignment of a common symbol to the possible
  494.              alignment of a section.  There is no point to permitting
  495.              a higher alignment for a common symbol: we can not
  496.              guarantee it, and it may cause us to allocate extra space
  497.              in the common section.  */
  498.           if (section == bfd_com_section_ptr
  499.               && (*sym_hash)->root.type == bfd_link_hash_common
  500.               && ((*sym_hash)->root.u.c.p->alignment_power
  501.                   > bfd_coff_default_section_alignment_power (abfd)))
  502.             (*sym_hash)->root.u.c.p->alignment_power
  503.               = bfd_coff_default_section_alignment_power (abfd);
  504.  
  505.           if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
  506.             {
  507.               /* If we don't have any symbol information currently in
  508.                  the hash table, or if we are looking at a symbol
  509.                  definition, then update the symbol class and type in
  510.                  the hash table.  */
  511.               if (((*sym_hash)->symbol_class == C_NULL
  512.                    && (*sym_hash)->type == T_NULL)
  513.                   || sym.n_scnum != 0
  514.                   || (sym.n_value != 0
  515.                       && (*sym_hash)->root.type != bfd_link_hash_defined
  516.                       && (*sym_hash)->root.type != bfd_link_hash_defweak))
  517.                 {
  518.                   (*sym_hash)->symbol_class = sym.n_sclass;
  519.                   if (sym.n_type != T_NULL)
  520.                     {
  521.                       /* We want to warn if the type changed, but not
  522.                          if it changed from an unspecified type.
  523.                          Testing the whole type byte may work, but the
  524.                          change from (e.g.) a function of unspecified
  525.                          type to function of known type also wants to
  526.                          skip the warning.  */
  527.                       if ((*sym_hash)->type != T_NULL
  528.                           && (*sym_hash)->type != sym.n_type
  529.                           && !(DTYPE ((*sym_hash)->type) == DTYPE (sym.n_type)
  530.                                && (BTYPE ((*sym_hash)->type) == T_NULL
  531.                                    || BTYPE (sym.n_type) == T_NULL)))
  532.                         (*_bfd_error_handler)
  533.                           (_("Warning: type of symbol `%s' changed from %d to %d in %B"),
  534.                            abfd, name, (*sym_hash)->type, sym.n_type);
  535.  
  536.                       /* We don't want to change from a meaningful
  537.                          base type to a null one, but if we know
  538.                          nothing, take what little we might now know.  */
  539.                       if (BTYPE (sym.n_type) != T_NULL
  540.                           || (*sym_hash)->type == T_NULL)
  541.                         (*sym_hash)->type = sym.n_type;
  542.                     }
  543.                   (*sym_hash)->auxbfd = abfd;
  544.                   if (sym.n_numaux != 0)
  545.                     {
  546.                       union internal_auxent *alloc;
  547.                       unsigned int i;
  548.                       bfd_byte *eaux;
  549.                       union internal_auxent *iaux;
  550.  
  551.                       (*sym_hash)->numaux = sym.n_numaux;
  552.                       alloc = ((union internal_auxent *)
  553.                                bfd_hash_allocate (&info->hash->table,
  554.                                                   (sym.n_numaux
  555.                                                    * sizeof (*alloc))));
  556.                       if (alloc == NULL)
  557.                         goto error_return;
  558.                       for (i = 0, eaux = esym + symesz, iaux = alloc;
  559.                            i < sym.n_numaux;
  560.                            i++, eaux += symesz, iaux++)
  561.                         bfd_coff_swap_aux_in (abfd, eaux, sym.n_type,
  562.                                               sym.n_sclass, (int) i,
  563.                                               sym.n_numaux, iaux);
  564.                       (*sym_hash)->aux = alloc;
  565.                     }
  566.                 }
  567.             }
  568.  
  569.           if (classification == COFF_SYMBOL_PE_SECTION
  570.               && (*sym_hash)->numaux != 0)
  571.             {
  572.               /* Some PE sections (such as .bss) have a zero size in
  573.                  the section header, but a non-zero size in the AUX
  574.                  record.  Correct that here.
  575.  
  576.                  FIXME: This is not at all the right place to do this.
  577.                  For example, it won't help objdump.  This needs to be
  578.                  done when we swap in the section header.  */
  579.               BFD_ASSERT ((*sym_hash)->numaux == 1);
  580.               if (section->size == 0)
  581.                 section->size = (*sym_hash)->aux[0].x_scn.x_scnlen;
  582.  
  583.               /* FIXME: We could test whether the section sizes
  584.                  matches the size in the aux entry, but apparently
  585.                  that sometimes fails unexpectedly.  */
  586.             }
  587.         }
  588.  
  589.       esym += (sym.n_numaux + 1) * symesz;
  590.       sym_hash += sym.n_numaux + 1;
  591.     }
  592.  
  593.   /* If this is a non-traditional, non-relocatable link, try to
  594.      optimize the handling of any .stab/.stabstr sections.  */
  595.   if (! info->relocatable
  596.       && ! info->traditional_format
  597.       && bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd)
  598.       && (info->strip != strip_all && info->strip != strip_debugger))
  599.     {
  600.       asection *stabstr;
  601.  
  602.       stabstr = bfd_get_section_by_name (abfd, ".stabstr");
  603.  
  604.       if (stabstr != NULL)
  605.         {
  606.           bfd_size_type string_offset = 0;
  607.           asection *stab;
  608.  
  609.           for (stab = abfd->sections; stab; stab = stab->next)
  610.             if (CONST_STRNEQ (stab->name, ".stab")
  611.                 && (!stab->name[5]
  612.                     || (stab->name[5] == '.' && ISDIGIT (stab->name[6]))))
  613.             {
  614.               struct coff_link_hash_table *table;
  615.               struct coff_section_tdata *secdata
  616.                 = coff_section_data (abfd, stab);
  617.  
  618.               if (secdata == NULL)
  619.                 {
  620.                   amt = sizeof (struct coff_section_tdata);
  621.                   stab->used_by_bfd = bfd_zalloc (abfd, amt);
  622.                   if (stab->used_by_bfd == NULL)
  623.                     goto error_return;
  624.                   secdata = coff_section_data (abfd, stab);
  625.                 }
  626.  
  627.               table = coff_hash_table (info);
  628.  
  629.               if (! _bfd_link_section_stabs (abfd, &table->stab_info,
  630.                                              stab, stabstr,
  631.                                              &secdata->stab_info,
  632.                                              &string_offset))
  633.                 goto error_return;
  634.             }
  635.         }
  636.     }
  637.  
  638.   obj_coff_keep_syms (abfd) = keep_syms;
  639.  
  640.   return TRUE;
  641.  
  642.  error_return:
  643.   obj_coff_keep_syms (abfd) = keep_syms;
  644.   return FALSE;
  645. }
  646. /* Do the final link step.  */
  647.  
  648. bfd_boolean
  649. _bfd_coff_final_link (bfd *abfd,
  650.                       struct bfd_link_info *info)
  651. {
  652.   bfd_size_type symesz;
  653.   struct coff_final_link_info flaginfo;
  654.   bfd_boolean debug_merge_allocated;
  655.   bfd_boolean long_section_names;
  656.   asection *o;
  657.   struct bfd_link_order *p;
  658.   bfd_size_type max_sym_count;
  659.   bfd_size_type max_lineno_count;
  660.   bfd_size_type max_reloc_count;
  661.   bfd_size_type max_output_reloc_count;
  662.   bfd_size_type max_contents_size;
  663.   file_ptr rel_filepos;
  664.   unsigned int relsz;
  665.   file_ptr line_filepos;
  666.   unsigned int linesz;
  667.   bfd *sub;
  668.   bfd_byte *external_relocs = NULL;
  669.   char strbuf[STRING_SIZE_SIZE];
  670.   bfd_size_type amt;
  671.  
  672.   symesz = bfd_coff_symesz (abfd);
  673.  
  674.   flaginfo.info = info;
  675.   flaginfo.output_bfd = abfd;
  676.   flaginfo.strtab = NULL;
  677.   flaginfo.section_info = NULL;
  678.   flaginfo.last_file_index = -1;
  679.   flaginfo.last_bf_index = -1;
  680.   flaginfo.internal_syms = NULL;
  681.   flaginfo.sec_ptrs = NULL;
  682.   flaginfo.sym_indices = NULL;
  683.   flaginfo.outsyms = NULL;
  684.   flaginfo.linenos = NULL;
  685.   flaginfo.contents = NULL;
  686.   flaginfo.external_relocs = NULL;
  687.   flaginfo.internal_relocs = NULL;
  688.   flaginfo.global_to_static = FALSE;
  689.   debug_merge_allocated = FALSE;
  690.  
  691.   coff_data (abfd)->link_info = info;
  692.  
  693.   flaginfo.strtab = _bfd_stringtab_init ();
  694.   if (flaginfo.strtab == NULL)
  695.     goto error_return;
  696.  
  697.   if (! coff_debug_merge_hash_table_init (&flaginfo.debug_merge))
  698.     goto error_return;
  699.   debug_merge_allocated = TRUE;
  700.  
  701.   /* Compute the file positions for all the sections.  */
  702.   if (! abfd->output_has_begun)
  703.     {
  704.       if (! bfd_coff_compute_section_file_positions (abfd))
  705.         goto error_return;
  706.     }
  707.  
  708.   /* Count the line numbers and relocation entries required for the
  709.      output file.  Set the file positions for the relocs.  */
  710.   rel_filepos = obj_relocbase (abfd);
  711.   relsz = bfd_coff_relsz (abfd);
  712.   max_contents_size = 0;
  713.   max_lineno_count = 0;
  714.   max_reloc_count = 0;
  715.  
  716.   long_section_names = FALSE;
  717.   for (o = abfd->sections; o != NULL; o = o->next)
  718.     {
  719.       o->reloc_count = 0;
  720.       o->lineno_count = 0;
  721.       for (p = o->map_head.link_order; p != NULL; p = p->next)
  722.         {
  723.           if (p->type == bfd_indirect_link_order)
  724.             {
  725.               asection *sec;
  726.  
  727.               sec = p->u.indirect.section;
  728.  
  729.               /* Mark all sections which are to be included in the
  730.                  link.  This will normally be every section.  We need
  731.                  to do this so that we can identify any sections which
  732.                  the linker has decided to not include.  */
  733.               sec->linker_mark = TRUE;
  734.  
  735.               if (info->strip == strip_none
  736.                   || info->strip == strip_some)
  737.                 o->lineno_count += sec->lineno_count;
  738.  
  739.               if (info->relocatable)
  740.                 o->reloc_count += sec->reloc_count;
  741.  
  742.               if (sec->rawsize > max_contents_size)
  743.                 max_contents_size = sec->rawsize;
  744.               if (sec->size > max_contents_size)
  745.                 max_contents_size = sec->size;
  746.               if (sec->lineno_count > max_lineno_count)
  747.                 max_lineno_count = sec->lineno_count;
  748.               if (sec->reloc_count > max_reloc_count)
  749.                 max_reloc_count = sec->reloc_count;
  750.             }
  751.           else if (info->relocatable
  752.                    && (p->type == bfd_section_reloc_link_order
  753.                        || p->type == bfd_symbol_reloc_link_order))
  754.             ++o->reloc_count;
  755.         }
  756.       if (o->reloc_count == 0)
  757.         o->rel_filepos = 0;
  758.       else
  759.         {
  760.           o->flags |= SEC_RELOC;
  761.           o->rel_filepos = rel_filepos;
  762.           rel_filepos += o->reloc_count * relsz;
  763.           /* In PE COFF, if there are at least 0xffff relocations an
  764.              extra relocation will be written out to encode the count.  */
  765.           if (obj_pe (abfd) && o->reloc_count >= 0xffff)
  766.             rel_filepos += relsz;
  767.         }
  768.  
  769.       if (bfd_coff_long_section_names (abfd)
  770.           && strlen (o->name) > SCNNMLEN)
  771.         {
  772.           /* This section has a long name which must go in the string
  773.              table.  This must correspond to the code in
  774.              coff_write_object_contents which puts the string index
  775.              into the s_name field of the section header.  That is why
  776.              we pass hash as FALSE.  */
  777.           if (_bfd_stringtab_add (flaginfo.strtab, o->name, FALSE, FALSE)
  778.               == (bfd_size_type) -1)
  779.             goto error_return;
  780.           long_section_names = TRUE;
  781.         }
  782.     }
  783.  
  784.   /* If doing a relocatable link, allocate space for the pointers we
  785.      need to keep.  */
  786.   if (info->relocatable)
  787.     {
  788.       unsigned int i;
  789.  
  790.       /* We use section_count + 1, rather than section_count, because
  791.          the target_index fields are 1 based.  */
  792.       amt = abfd->section_count + 1;
  793.       amt *= sizeof (struct coff_link_section_info);
  794.       flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
  795.       if (flaginfo.section_info == NULL)
  796.         goto error_return;
  797.       for (i = 0; i <= abfd->section_count; i++)
  798.         {
  799.           flaginfo.section_info[i].relocs = NULL;
  800.           flaginfo.section_info[i].rel_hashes = NULL;
  801.         }
  802.     }
  803.  
  804.   /* We now know the size of the relocs, so we can determine the file
  805.      positions of the line numbers.  */
  806.   line_filepos = rel_filepos;
  807.   linesz = bfd_coff_linesz (abfd);
  808.   max_output_reloc_count = 0;
  809.   for (o = abfd->sections; o != NULL; o = o->next)
  810.     {
  811.       if (o->lineno_count == 0)
  812.         o->line_filepos = 0;
  813.       else
  814.         {
  815.           o->line_filepos = line_filepos;
  816.           line_filepos += o->lineno_count * linesz;
  817.         }
  818.  
  819.       if (o->reloc_count != 0)
  820.         {
  821.           /* We don't know the indices of global symbols until we have
  822.              written out all the local symbols.  For each section in
  823.              the output file, we keep an array of pointers to hash
  824.              table entries.  Each entry in the array corresponds to a
  825.              reloc.  When we find a reloc against a global symbol, we
  826.              set the corresponding entry in this array so that we can
  827.              fix up the symbol index after we have written out all the
  828.              local symbols.
  829.  
  830.              Because of this problem, we also keep the relocs in
  831.              memory until the end of the link.  This wastes memory,
  832.              but only when doing a relocatable link, which is not the
  833.              common case.  */
  834.           BFD_ASSERT (info->relocatable);
  835.           amt = o->reloc_count;
  836.           amt *= sizeof (struct internal_reloc);
  837.           flaginfo.section_info[o->target_index].relocs =
  838.               (struct internal_reloc *) bfd_malloc (amt);
  839.           amt = o->reloc_count;
  840.           amt *= sizeof (struct coff_link_hash_entry *);
  841.           flaginfo.section_info[o->target_index].rel_hashes =
  842.               (struct coff_link_hash_entry **) bfd_malloc (amt);
  843.           if (flaginfo.section_info[o->target_index].relocs == NULL
  844.               || flaginfo.section_info[o->target_index].rel_hashes == NULL)
  845.             goto error_return;
  846.  
  847.           if (o->reloc_count > max_output_reloc_count)
  848.             max_output_reloc_count = o->reloc_count;
  849.         }
  850.  
  851.       /* Reset the reloc and lineno counts, so that we can use them to
  852.          count the number of entries we have output so far.  */
  853.       o->reloc_count = 0;
  854.       o->lineno_count = 0;
  855.     }
  856.  
  857.   obj_sym_filepos (abfd) = line_filepos;
  858.  
  859.   /* Figure out the largest number of symbols in an input BFD.  Take
  860.      the opportunity to clear the output_has_begun fields of all the
  861.      input BFD's.  */
  862.   max_sym_count = 0;
  863.   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
  864.     {
  865.       size_t sz;
  866.  
  867.       sub->output_has_begun = FALSE;
  868.       sz = bfd_family_coff (sub) ? obj_raw_syment_count (sub) : 2;
  869.       if (sz > max_sym_count)
  870.         max_sym_count = sz;
  871.     }
  872.  
  873.   /* Allocate some buffers used while linking.  */
  874.   amt = max_sym_count * sizeof (struct internal_syment);
  875.   flaginfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
  876.   amt = max_sym_count * sizeof (asection *);
  877.   flaginfo.sec_ptrs = (asection **) bfd_malloc (amt);
  878.   amt = max_sym_count * sizeof (long);
  879.   flaginfo.sym_indices = (long int *) bfd_malloc (amt);
  880.   flaginfo.outsyms = (bfd_byte *) bfd_malloc ((max_sym_count + 1) * symesz);
  881.   amt = max_lineno_count * bfd_coff_linesz (abfd);
  882.   flaginfo.linenos = (bfd_byte *) bfd_malloc (amt);
  883.   flaginfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
  884.   amt = max_reloc_count * relsz;
  885.   flaginfo.external_relocs = (bfd_byte *) bfd_malloc (amt);
  886.   if (! info->relocatable)
  887.     {
  888.       amt = max_reloc_count * sizeof (struct internal_reloc);
  889.       flaginfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
  890.     }
  891.   if ((flaginfo.internal_syms == NULL && max_sym_count > 0)
  892.       || (flaginfo.sec_ptrs == NULL && max_sym_count > 0)
  893.       || (flaginfo.sym_indices == NULL && max_sym_count > 0)
  894.       || flaginfo.outsyms == NULL
  895.       || (flaginfo.linenos == NULL && max_lineno_count > 0)
  896.       || (flaginfo.contents == NULL && max_contents_size > 0)
  897.       || (flaginfo.external_relocs == NULL && max_reloc_count > 0)
  898.       || (! info->relocatable
  899.           && flaginfo.internal_relocs == NULL
  900.           && max_reloc_count > 0))
  901.     goto error_return;
  902.  
  903.   /* We now know the position of everything in the file, except that
  904.      we don't know the size of the symbol table and therefore we don't
  905.      know where the string table starts.  We just build the string
  906.      table in memory as we go along.  We process all the relocations
  907.      for a single input file at once.  */
  908.   obj_raw_syment_count (abfd) = 0;
  909.  
  910.   if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
  911.     {
  912.       if (! bfd_coff_start_final_link (abfd, info))
  913.         goto error_return;
  914.     }
  915.  
  916.   for (o = abfd->sections; o != NULL; o = o->next)
  917.     {
  918.       for (p = o->map_head.link_order; p != NULL; p = p->next)
  919.         {
  920.           if (p->type == bfd_indirect_link_order
  921.               && bfd_family_coff (p->u.indirect.section->owner))
  922.             {
  923.               sub = p->u.indirect.section->owner;
  924.               if (! bfd_coff_link_output_has_begun (sub, & flaginfo))
  925.                 {
  926.                   if (! _bfd_coff_link_input_bfd (&flaginfo, sub))
  927.                     goto error_return;
  928.                   sub->output_has_begun = TRUE;
  929.                 }
  930.             }
  931.           else if (p->type == bfd_section_reloc_link_order
  932.                    || p->type == bfd_symbol_reloc_link_order)
  933.             {
  934.               if (! _bfd_coff_reloc_link_order (abfd, &flaginfo, o, p))
  935.                 goto error_return;
  936.             }
  937.           else
  938.             {
  939.               if (! _bfd_default_link_order (abfd, info, o, p))
  940.                 goto error_return;
  941.             }
  942.         }
  943.     }
  944.  
  945.   if (flaginfo.info->strip != strip_all && flaginfo.info->discard != discard_all)
  946.     {
  947.       /* Add local symbols from foreign inputs.  */
  948.       for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
  949.         {
  950.           unsigned int i;
  951.  
  952.           if (bfd_family_coff (sub) || ! bfd_get_outsymbols (sub))
  953.             continue;
  954.           for (i = 0; i < bfd_get_symcount (sub); ++i)
  955.             {
  956.               asymbol *sym = bfd_get_outsymbols (sub) [i];
  957.               file_ptr pos;
  958.               struct internal_syment isym;
  959.               bfd_size_type string_size = 0;
  960.               bfd_vma written = 0;
  961.               bfd_boolean rewrite = FALSE;
  962.  
  963.               if (! (sym->flags & BSF_LOCAL)
  964.                   || (sym->flags & (BSF_SECTION_SYM | BSF_DEBUGGING_RELOC
  965.                                     | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC
  966.                                     | BSF_SYNTHETIC))
  967.                   || ((sym->flags & BSF_DEBUGGING)
  968.                       && ! (sym->flags & BSF_FILE)))
  969.                 continue;
  970.  
  971.               /* See if we are discarding symbols with this name.  */
  972.               if ((flaginfo.info->strip == strip_some
  973.                    && (bfd_hash_lookup (flaginfo.info->keep_hash,
  974.                                         bfd_asymbol_name(sym), FALSE, FALSE)
  975.                        == NULL))
  976.                   || (((flaginfo.info->discard == discard_sec_merge
  977.                         && (bfd_get_section (sym)->flags & SEC_MERGE)
  978.                         && ! flaginfo.info->relocatable)
  979.                        || flaginfo.info->discard == discard_l)
  980.                       && bfd_is_local_label_name (sub, bfd_asymbol_name(sym))))
  981.                 continue;
  982.  
  983.               pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd)
  984.                                              * symesz;
  985.               if (bfd_seek (abfd, pos, SEEK_SET) != 0)
  986.                 goto error_return;
  987.               if (! coff_write_alien_symbol(abfd, sym, &isym, &written,
  988.                                             &string_size, NULL, NULL))
  989.                 goto error_return;
  990.  
  991.               if (string_size)
  992.                 {
  993.                   bfd_boolean hash = ! (abfd->flags & BFD_TRADITIONAL_FORMAT);
  994.                   bfd_size_type indx;
  995.  
  996.                   indx = _bfd_stringtab_add (flaginfo.strtab,
  997.                                              bfd_asymbol_name (sym), hash,
  998.                                              FALSE);
  999.                   if (indx == (bfd_size_type) -1)
  1000.                     goto error_return;
  1001.                   isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
  1002.                   bfd_coff_swap_sym_out (abfd, &isym, flaginfo.outsyms);
  1003.                   rewrite = TRUE;
  1004.                 }
  1005.  
  1006.               if (isym.n_sclass == C_FILE)
  1007.                 {
  1008.                   if (flaginfo.last_file_index != -1)
  1009.                     {
  1010.                       flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
  1011.                       bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
  1012.                                              flaginfo.outsyms);
  1013.                       pos = obj_sym_filepos (abfd) + flaginfo.last_file_index
  1014.                                                      * symesz;
  1015.                       rewrite = TRUE;
  1016.                     }
  1017.                   flaginfo.last_file_index = obj_raw_syment_count (abfd);
  1018.                   flaginfo.last_file = isym;
  1019.                 }
  1020.  
  1021.               if (rewrite
  1022.                   && (bfd_seek (abfd, pos, SEEK_SET) != 0
  1023.                       || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz))
  1024.                 goto error_return;
  1025.  
  1026.               obj_raw_syment_count (abfd) += written;
  1027.             }
  1028.         }
  1029.     }
  1030.  
  1031.   if (! bfd_coff_final_link_postscript (abfd, & flaginfo))
  1032.     goto error_return;
  1033.  
  1034.   /* Free up the buffers used by _bfd_coff_link_input_bfd.  */
  1035.  
  1036.   coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
  1037.   debug_merge_allocated = FALSE;
  1038.  
  1039.   if (flaginfo.internal_syms != NULL)
  1040.     {
  1041.       free (flaginfo.internal_syms);
  1042.       flaginfo.internal_syms = NULL;
  1043.     }
  1044.   if (flaginfo.sec_ptrs != NULL)
  1045.     {
  1046.       free (flaginfo.sec_ptrs);
  1047.       flaginfo.sec_ptrs = NULL;
  1048.     }
  1049.   if (flaginfo.sym_indices != NULL)
  1050.     {
  1051.       free (flaginfo.sym_indices);
  1052.       flaginfo.sym_indices = NULL;
  1053.     }
  1054.   if (flaginfo.linenos != NULL)
  1055.     {
  1056.       free (flaginfo.linenos);
  1057.       flaginfo.linenos = NULL;
  1058.     }
  1059.   if (flaginfo.contents != NULL)
  1060.     {
  1061.       free (flaginfo.contents);
  1062.       flaginfo.contents = NULL;
  1063.     }
  1064.   if (flaginfo.external_relocs != NULL)
  1065.     {
  1066.       free (flaginfo.external_relocs);
  1067.       flaginfo.external_relocs = NULL;
  1068.     }
  1069.   if (flaginfo.internal_relocs != NULL)
  1070.     {
  1071.       free (flaginfo.internal_relocs);
  1072.       flaginfo.internal_relocs = NULL;
  1073.     }
  1074.  
  1075.   /* The value of the last C_FILE symbol is supposed to be the symbol
  1076.      index of the first external symbol.  Write it out again if
  1077.      necessary.  */
  1078.   if (flaginfo.last_file_index != -1
  1079.       && (unsigned int) flaginfo.last_file.n_value != obj_raw_syment_count (abfd))
  1080.     {
  1081.       file_ptr pos;
  1082.  
  1083.       flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
  1084.       bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
  1085.                              flaginfo.outsyms);
  1086.  
  1087.       pos = obj_sym_filepos (abfd) + flaginfo.last_file_index * symesz;
  1088.       if (bfd_seek (abfd, pos, SEEK_SET) != 0
  1089.           || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz)
  1090.         return FALSE;
  1091.     }
  1092.  
  1093.   /* If doing task linking (ld --task-link) then make a pass through the
  1094.      global symbols, writing out any that are defined, and making them
  1095.      static.  */
  1096.   if (info->task_link)
  1097.     {
  1098.       flaginfo.failed = FALSE;
  1099.       coff_link_hash_traverse (coff_hash_table (info),
  1100.                                _bfd_coff_write_task_globals, &flaginfo);
  1101.       if (flaginfo.failed)
  1102.         goto error_return;
  1103.     }
  1104.  
  1105.   /* Write out the global symbols.  */
  1106.   flaginfo.failed = FALSE;
  1107.   bfd_hash_traverse (&info->hash->table, _bfd_coff_write_global_sym, &flaginfo);
  1108.   if (flaginfo.failed)
  1109.     goto error_return;
  1110.  
  1111.   /* The outsyms buffer is used by _bfd_coff_write_global_sym.  */
  1112.   if (flaginfo.outsyms != NULL)
  1113.     {
  1114.       free (flaginfo.outsyms);
  1115.       flaginfo.outsyms = NULL;
  1116.     }
  1117.  
  1118.   if (info->relocatable && max_output_reloc_count > 0)
  1119.     {
  1120.       /* Now that we have written out all the global symbols, we know
  1121.          the symbol indices to use for relocs against them, and we can
  1122.          finally write out the relocs.  */
  1123.       amt = max_output_reloc_count * relsz;
  1124.       external_relocs = (bfd_byte *) bfd_malloc (amt);
  1125.       if (external_relocs == NULL)
  1126.         goto error_return;
  1127.  
  1128.       for (o = abfd->sections; o != NULL; o = o->next)
  1129.         {
  1130.           struct internal_reloc *irel;
  1131.           struct internal_reloc *irelend;
  1132.           struct coff_link_hash_entry **rel_hash;
  1133.           bfd_byte *erel;
  1134.  
  1135.           if (o->reloc_count == 0)
  1136.             continue;
  1137.  
  1138.           irel = flaginfo.section_info[o->target_index].relocs;
  1139.           irelend = irel + o->reloc_count;
  1140.           rel_hash = flaginfo.section_info[o->target_index].rel_hashes;
  1141.           erel = external_relocs;
  1142.           for (; irel < irelend; irel++, rel_hash++, erel += relsz)
  1143.             {
  1144.               if (*rel_hash != NULL)
  1145.                 {
  1146.                   BFD_ASSERT ((*rel_hash)->indx >= 0);
  1147.                   irel->r_symndx = (*rel_hash)->indx;
  1148.                 }
  1149.               bfd_coff_swap_reloc_out (abfd, irel, erel);
  1150.             }
  1151.  
  1152.           if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
  1153.             goto error_return;
  1154.           if (obj_pe (abfd) && o->reloc_count >= 0xffff)
  1155.             {
  1156.               /* In PE COFF, write the count of relocs as the first
  1157.                  reloc.  The header overflow bit will be set
  1158.                  elsewhere. */
  1159.               struct internal_reloc incount;
  1160.               bfd_byte *excount = (bfd_byte *)bfd_malloc (relsz);
  1161.  
  1162.               memset (&incount, 0, sizeof (incount));
  1163.               incount.r_vaddr = o->reloc_count + 1;
  1164.               bfd_coff_swap_reloc_out (abfd, &incount, excount);
  1165.               if (bfd_bwrite (excount, relsz, abfd) != relsz)
  1166.                 /* We'll leak, but it's an error anyway. */
  1167.                 goto error_return;
  1168.               free (excount);
  1169.             }
  1170.           if (bfd_bwrite (external_relocs,
  1171.                           (bfd_size_type) relsz * o->reloc_count, abfd)
  1172.               != (bfd_size_type) relsz * o->reloc_count)
  1173.             goto error_return;
  1174.         }
  1175.  
  1176.       free (external_relocs);
  1177.       external_relocs = NULL;
  1178.     }
  1179.  
  1180.   /* Free up the section information.  */
  1181.   if (flaginfo.section_info != NULL)
  1182.     {
  1183.       unsigned int i;
  1184.  
  1185.       for (i = 0; i < abfd->section_count; i++)
  1186.         {
  1187.           if (flaginfo.section_info[i].relocs != NULL)
  1188.             free (flaginfo.section_info[i].relocs);
  1189.           if (flaginfo.section_info[i].rel_hashes != NULL)
  1190.             free (flaginfo.section_info[i].rel_hashes);
  1191.         }
  1192.       free (flaginfo.section_info);
  1193.       flaginfo.section_info = NULL;
  1194.     }
  1195.  
  1196.   /* If we have optimized stabs strings, output them.  */
  1197.   if (coff_hash_table (info)->stab_info.stabstr != NULL)
  1198.     {
  1199.       if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
  1200.         return FALSE;
  1201.     }
  1202.  
  1203.   /* Write out the string table.  */
  1204.   if (obj_raw_syment_count (abfd) != 0 || long_section_names)
  1205.     {
  1206.       file_ptr pos;
  1207.  
  1208.       pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
  1209.       if (bfd_seek (abfd, pos, SEEK_SET) != 0)
  1210.         return FALSE;
  1211.  
  1212. #if STRING_SIZE_SIZE == 4
  1213.       H_PUT_32 (abfd,
  1214.                 _bfd_stringtab_size (flaginfo.strtab) + STRING_SIZE_SIZE,
  1215.                 strbuf);
  1216. #else
  1217.  #error Change H_PUT_32 above
  1218. #endif
  1219.  
  1220.       if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
  1221.           != STRING_SIZE_SIZE)
  1222.         return FALSE;
  1223.  
  1224.       if (! _bfd_stringtab_emit (abfd, flaginfo.strtab))
  1225.         return FALSE;
  1226.  
  1227.       obj_coff_strings_written (abfd) = TRUE;
  1228.     }
  1229.  
  1230.   _bfd_stringtab_free (flaginfo.strtab);
  1231.  
  1232.   /* Setting bfd_get_symcount to 0 will cause write_object_contents to
  1233.      not try to write out the symbols.  */
  1234.   bfd_get_symcount (abfd) = 0;
  1235.  
  1236.   return TRUE;
  1237.  
  1238.  error_return:
  1239.   if (debug_merge_allocated)
  1240.     coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
  1241.   if (flaginfo.strtab != NULL)
  1242.     _bfd_stringtab_free (flaginfo.strtab);
  1243.   if (flaginfo.section_info != NULL)
  1244.     {
  1245.       unsigned int i;
  1246.  
  1247.       for (i = 0; i < abfd->section_count; i++)
  1248.         {
  1249.           if (flaginfo.section_info[i].relocs != NULL)
  1250.             free (flaginfo.section_info[i].relocs);
  1251.           if (flaginfo.section_info[i].rel_hashes != NULL)
  1252.             free (flaginfo.section_info[i].rel_hashes);
  1253.         }
  1254.       free (flaginfo.section_info);
  1255.     }
  1256.   if (flaginfo.internal_syms != NULL)
  1257.     free (flaginfo.internal_syms);
  1258.   if (flaginfo.sec_ptrs != NULL)
  1259.     free (flaginfo.sec_ptrs);
  1260.   if (flaginfo.sym_indices != NULL)
  1261.     free (flaginfo.sym_indices);
  1262.   if (flaginfo.outsyms != NULL)
  1263.     free (flaginfo.outsyms);
  1264.   if (flaginfo.linenos != NULL)
  1265.     free (flaginfo.linenos);
  1266.   if (flaginfo.contents != NULL)
  1267.     free (flaginfo.contents);
  1268.   if (flaginfo.external_relocs != NULL)
  1269.     free (flaginfo.external_relocs);
  1270.   if (flaginfo.internal_relocs != NULL)
  1271.     free (flaginfo.internal_relocs);
  1272.   if (external_relocs != NULL)
  1273.     free (external_relocs);
  1274.   return FALSE;
  1275. }
  1276.  
  1277. /* Parse out a -heap <reserved>,<commit> line.  */
  1278.  
  1279. static char *
  1280. dores_com (char *ptr, bfd *output_bfd, int heap)
  1281. {
  1282.   if (coff_data(output_bfd)->pe)
  1283.     {
  1284.       int val = strtoul (ptr, &ptr, 0);
  1285.  
  1286.       if (heap)
  1287.         pe_data(output_bfd)->pe_opthdr.SizeOfHeapReserve = val;
  1288.       else
  1289.         pe_data(output_bfd)->pe_opthdr.SizeOfStackReserve = val;
  1290.  
  1291.       if (ptr[0] == ',')
  1292.         {
  1293.           val = strtoul (ptr+1, &ptr, 0);
  1294.           if (heap)
  1295.             pe_data(output_bfd)->pe_opthdr.SizeOfHeapCommit = val;
  1296.           else
  1297.             pe_data(output_bfd)->pe_opthdr.SizeOfStackCommit = val;
  1298.         }
  1299.     }
  1300.   return ptr;
  1301. }
  1302.  
  1303. static char *
  1304. get_name (char *ptr, char **dst)
  1305. {
  1306.   while (*ptr == ' ')
  1307.     ptr++;
  1308.   *dst = ptr;
  1309.   while (*ptr && *ptr != ' ')
  1310.     ptr++;
  1311.   *ptr = 0;
  1312.   return ptr+1;
  1313. }
  1314.  
  1315. /* Process any magic embedded commands in a section called .drectve.  */
  1316.  
  1317. static int
  1318. process_embedded_commands (bfd *output_bfd,
  1319.                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
  1320.                            bfd *abfd)
  1321. {
  1322.   asection *sec = bfd_get_section_by_name (abfd, ".drectve");
  1323.   char *s;
  1324.   char *e;
  1325.   bfd_byte *copy;
  1326.  
  1327.   if (!sec)
  1328.     return 1;
  1329.  
  1330.   if (!bfd_malloc_and_get_section (abfd, sec, &copy))
  1331.     {
  1332.       if (copy != NULL)
  1333.         free (copy);
  1334.       return 0;
  1335.     }
  1336.   e = (char *) copy + sec->size;
  1337.  
  1338.   for (s = (char *) copy; s < e ; )
  1339.     {
  1340.       if (s[0] != '-')
  1341.         {
  1342.           s++;
  1343.           continue;
  1344.         }
  1345.       if (CONST_STRNEQ (s, "-attr"))
  1346.         {
  1347.           char *name;
  1348.           char *attribs;
  1349.           asection *asec;
  1350.           int loop = 1;
  1351.           int had_write = 0;
  1352.           int had_exec= 0;
  1353.  
  1354.           s += 5;
  1355.           s = get_name (s, &name);
  1356.           s = get_name (s, &attribs);
  1357.  
  1358.           while (loop)
  1359.             {
  1360.               switch (*attribs++)
  1361.                 {
  1362.                 case 'W':
  1363.                   had_write = 1;
  1364.                   break;
  1365.                 case 'R':
  1366.                   break;
  1367.                 case 'S':
  1368.                   break;
  1369.                 case 'X':
  1370.                   had_exec = 1;
  1371.                   break;
  1372.                 default:
  1373.                   loop = 0;
  1374.                 }
  1375.             }
  1376.           asec = bfd_get_section_by_name (abfd, name);
  1377.           if (asec)
  1378.             {
  1379.               if (had_exec)
  1380.                 asec->flags |= SEC_CODE;
  1381.               if (!had_write)
  1382.                 asec->flags |= SEC_READONLY;
  1383.             }
  1384.         }
  1385.       else if (CONST_STRNEQ (s, "-heap"))
  1386.         s = dores_com (s + 5, output_bfd, 1);
  1387.  
  1388.       else if (CONST_STRNEQ (s, "-stack"))
  1389.         s = dores_com (s + 6, output_bfd, 0);
  1390.  
  1391.       /* GNU extension for aligned commons.  */
  1392.       else if (CONST_STRNEQ (s, "-aligncomm:"))
  1393.         {
  1394.           /* Common symbols must be aligned on reading, as it
  1395.           is too late to do anything here, after they have
  1396.           already been allocated, so just skip the directive.  */
  1397.           s += 11;
  1398.         }
  1399.  
  1400.       else
  1401.         s++;
  1402.     }
  1403.   free (copy);
  1404.   return 1;
  1405. }
  1406.  
  1407. /* Place a marker against all symbols which are used by relocations.
  1408.    This marker can be picked up by the 'do we skip this symbol ?'
  1409.    loop in _bfd_coff_link_input_bfd() and used to prevent skipping
  1410.    that symbol.  */
  1411.  
  1412. static void
  1413. mark_relocs (struct coff_final_link_info *flaginfo, bfd *input_bfd)
  1414. {
  1415.   asection * a;
  1416.  
  1417.   if ((bfd_get_file_flags (input_bfd) & HAS_SYMS) == 0)
  1418.     return;
  1419.  
  1420.   for (a = input_bfd->sections; a != (asection *) NULL; a = a->next)
  1421.     {
  1422.       struct internal_reloc *   internal_relocs;
  1423.       struct internal_reloc *   irel;
  1424.       struct internal_reloc *   irelend;
  1425.  
  1426.       if ((a->flags & SEC_RELOC) == 0 || a->reloc_count  < 1
  1427.           || a->linker_mark == 0)
  1428.         continue;
  1429.       /* Don't mark relocs in excluded sections.  */
  1430.       if (a->output_section == bfd_abs_section_ptr)
  1431.         continue;
  1432.  
  1433.       /* Read in the relocs.  */
  1434.       internal_relocs = _bfd_coff_read_internal_relocs
  1435.         (input_bfd, a, FALSE,
  1436.          flaginfo->external_relocs,
  1437.          flaginfo->info->relocatable,
  1438.          (flaginfo->info->relocatable
  1439.           ? (flaginfo->section_info[ a->output_section->target_index ].relocs + a->output_section->reloc_count)
  1440.           : flaginfo->internal_relocs)
  1441.         );
  1442.  
  1443.       if (internal_relocs == NULL)
  1444.         continue;
  1445.  
  1446.       irel     = internal_relocs;
  1447.       irelend  = irel + a->reloc_count;
  1448.  
  1449.       /* Place a mark in the sym_indices array (whose entries have
  1450.          been initialised to 0) for all of the symbols that are used
  1451.          in the relocation table.  This will then be picked up in the
  1452.          skip/don't-skip pass.  */
  1453.       for (; irel < irelend; irel++)
  1454.         flaginfo->sym_indices[ irel->r_symndx ] = -1;
  1455.     }
  1456. }
  1457.  
  1458. /* Link an input file into the linker output file.  This function
  1459.    handles all the sections and relocations of the input file at once.  */
  1460.  
  1461. bfd_boolean
  1462. _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
  1463. {
  1464.   unsigned int n_tmask = coff_data (input_bfd)->local_n_tmask;
  1465.   unsigned int n_btshft = coff_data (input_bfd)->local_n_btshft;
  1466.   bfd_boolean (*adjust_symndx)
  1467.     (bfd *, struct bfd_link_info *, bfd *, asection *,
  1468.      struct internal_reloc *, bfd_boolean *);
  1469.   bfd *output_bfd;
  1470.   const char *strings;
  1471.   bfd_size_type syment_base;
  1472.   bfd_boolean copy, hash;
  1473.   bfd_size_type isymesz;
  1474.   bfd_size_type osymesz;
  1475.   bfd_size_type linesz;
  1476.   bfd_byte *esym;
  1477.   bfd_byte *esym_end;
  1478.   struct internal_syment *isymp;
  1479.   asection **secpp;
  1480.   long *indexp;
  1481.   unsigned long output_index;
  1482.   bfd_byte *outsym;
  1483.   struct coff_link_hash_entry **sym_hash;
  1484.   asection *o;
  1485.  
  1486.   /* Move all the symbols to the output file.  */
  1487.  
  1488.   output_bfd = flaginfo->output_bfd;
  1489.   strings = NULL;
  1490.   syment_base = obj_raw_syment_count (output_bfd);
  1491.   isymesz = bfd_coff_symesz (input_bfd);
  1492.   osymesz = bfd_coff_symesz (output_bfd);
  1493.   linesz = bfd_coff_linesz (input_bfd);
  1494.   BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
  1495.  
  1496.   copy = FALSE;
  1497.   if (! flaginfo->info->keep_memory)
  1498.     copy = TRUE;
  1499.   hash = TRUE;
  1500.   if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
  1501.     hash = FALSE;
  1502.  
  1503.   if (! _bfd_coff_get_external_symbols (input_bfd))
  1504.     return FALSE;
  1505.  
  1506.   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
  1507.   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
  1508.   isymp = flaginfo->internal_syms;
  1509.   secpp = flaginfo->sec_ptrs;
  1510.   indexp = flaginfo->sym_indices;
  1511.   output_index = syment_base;
  1512.   outsym = flaginfo->outsyms;
  1513.  
  1514.   if (coff_data (output_bfd)->pe
  1515.       && ! process_embedded_commands (output_bfd, flaginfo->info, input_bfd))
  1516.     return FALSE;
  1517.  
  1518.   /* If we are going to perform relocations and also strip/discard some
  1519.      symbols then we must make sure that we do not strip/discard those
  1520.      symbols that are going to be involved in the relocations.  */
  1521.   if ((   flaginfo->info->strip   != strip_none
  1522.        || flaginfo->info->discard != discard_none)
  1523.       && flaginfo->info->relocatable)
  1524.     {
  1525.       /* Mark the symbol array as 'not-used'.  */
  1526.       memset (indexp, 0, obj_raw_syment_count (input_bfd) * sizeof * indexp);
  1527.  
  1528.       mark_relocs (flaginfo, input_bfd);
  1529.     }
  1530.  
  1531.   while (esym < esym_end)
  1532.     {
  1533.       struct internal_syment isym;
  1534.       enum coff_symbol_classification classification;
  1535.       bfd_boolean skip;
  1536.       bfd_boolean global;
  1537.       bfd_boolean dont_skip_symbol;
  1538.       int add;
  1539.  
  1540.       bfd_coff_swap_sym_in (input_bfd, esym, isymp);
  1541.  
  1542.       /* Make a copy of *isymp so that the relocate_section function
  1543.          always sees the original values.  This is more reliable than
  1544.          always recomputing the symbol value even if we are stripping
  1545.          the symbol.  */
  1546.       isym = *isymp;
  1547.  
  1548.       classification = bfd_coff_classify_symbol (input_bfd, &isym);
  1549.       switch (classification)
  1550.         {
  1551.         default:
  1552.           abort ();
  1553.         case COFF_SYMBOL_GLOBAL:
  1554.         case COFF_SYMBOL_PE_SECTION:
  1555.         case COFF_SYMBOL_LOCAL:
  1556.           *secpp = coff_section_from_bfd_index (input_bfd, isym.n_scnum);
  1557.           break;
  1558.         case COFF_SYMBOL_COMMON:
  1559.           *secpp = bfd_com_section_ptr;
  1560.           break;
  1561.         case COFF_SYMBOL_UNDEFINED:
  1562.           *secpp = bfd_und_section_ptr;
  1563.           break;
  1564.         }
  1565.  
  1566.       /* Extract the flag indicating if this symbol is used by a
  1567.          relocation.  */
  1568.       if ((flaginfo->info->strip != strip_none
  1569.            || flaginfo->info->discard != discard_none)
  1570.           && flaginfo->info->relocatable)
  1571.         dont_skip_symbol = *indexp;
  1572.       else
  1573.         dont_skip_symbol = FALSE;
  1574.  
  1575.       *indexp = -1;
  1576.  
  1577.       skip = FALSE;
  1578.       global = FALSE;
  1579.       add = 1 + isym.n_numaux;
  1580.  
  1581.       /* If we are stripping all symbols, we want to skip this one.  */
  1582.       if (flaginfo->info->strip == strip_all && ! dont_skip_symbol)
  1583.         skip = TRUE;
  1584.  
  1585.       if (! skip)
  1586.         {
  1587.           switch (classification)
  1588.             {
  1589.             default:
  1590.               abort ();
  1591.             case COFF_SYMBOL_GLOBAL:
  1592.             case COFF_SYMBOL_COMMON:
  1593.             case COFF_SYMBOL_PE_SECTION:
  1594.               /* This is a global symbol.  Global symbols come at the
  1595.                  end of the symbol table, so skip them for now.
  1596.                  Locally defined function symbols, however, are an
  1597.                  exception, and are not moved to the end.  */
  1598.               global = TRUE;
  1599.               if (! ISFCN (isym.n_type))
  1600.                 skip = TRUE;
  1601.               break;
  1602.  
  1603.             case COFF_SYMBOL_UNDEFINED:
  1604.               /* Undefined symbols are left for the end.  */
  1605.               global = TRUE;
  1606.               skip = TRUE;
  1607.               break;
  1608.  
  1609.             case COFF_SYMBOL_LOCAL:
  1610.               /* This is a local symbol.  Skip it if we are discarding
  1611.                  local symbols.  */
  1612.               if (flaginfo->info->discard == discard_all && ! dont_skip_symbol)
  1613.                 skip = TRUE;
  1614.               break;
  1615.             }
  1616.         }
  1617.  
  1618. #ifndef COFF_WITH_PE
  1619.       /* Skip section symbols for sections which are not going to be
  1620.          emitted.  */
  1621.       if (!skip
  1622.           && !dont_skip_symbol
  1623.           && isym.n_sclass == C_STAT
  1624.           && isym.n_type == T_NULL
  1625.           && isym.n_numaux > 0
  1626.           && ((*secpp)->output_section == bfd_abs_section_ptr
  1627.               || bfd_section_removed_from_list (output_bfd,
  1628.                                                 (*secpp)->output_section)))
  1629.         skip = TRUE;
  1630. #endif
  1631.  
  1632.       /* If we stripping debugging symbols, and this is a debugging
  1633.          symbol, then skip it.  FIXME: gas sets the section to N_ABS
  1634.          for some types of debugging symbols; I don't know if this is
  1635.          a bug or not.  In any case, we handle it here.  */
  1636.       if (! skip
  1637.           && flaginfo->info->strip == strip_debugger
  1638.           && ! dont_skip_symbol
  1639.           && (isym.n_scnum == N_DEBUG
  1640.               || (isym.n_scnum == N_ABS
  1641.                   && (isym.n_sclass == C_AUTO
  1642.                       || isym.n_sclass == C_REG
  1643.                       || isym.n_sclass == C_MOS
  1644.                       || isym.n_sclass == C_MOE
  1645.                       || isym.n_sclass == C_MOU
  1646.                       || isym.n_sclass == C_ARG
  1647.                       || isym.n_sclass == C_REGPARM
  1648.                       || isym.n_sclass == C_FIELD
  1649.                       || isym.n_sclass == C_EOS))))
  1650.         skip = TRUE;
  1651.  
  1652.       /* If some symbols are stripped based on the name, work out the
  1653.          name and decide whether to skip this symbol.  */
  1654.       if (! skip
  1655.           && (flaginfo->info->strip == strip_some
  1656.               || flaginfo->info->discard == discard_l))
  1657.         {
  1658.           const char *name;
  1659.           char buf[SYMNMLEN + 1];
  1660.  
  1661.           name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
  1662.           if (name == NULL)
  1663.             return FALSE;
  1664.  
  1665.           if (! dont_skip_symbol
  1666.               && ((flaginfo->info->strip == strip_some
  1667.                    && (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE,
  1668.                                     FALSE) == NULL))
  1669.                    || (! global
  1670.                        && flaginfo->info->discard == discard_l
  1671.                        && bfd_is_local_label_name (input_bfd, name))))
  1672.             skip = TRUE;
  1673.         }
  1674.  
  1675.       /* If this is an enum, struct, or union tag, see if we have
  1676.          already output an identical type.  */
  1677.       if (! skip
  1678.           && (flaginfo->output_bfd->flags & BFD_TRADITIONAL_FORMAT) == 0
  1679.           && (isym.n_sclass == C_ENTAG
  1680.               || isym.n_sclass == C_STRTAG
  1681.               || isym.n_sclass == C_UNTAG)
  1682.           && isym.n_numaux == 1)
  1683.         {
  1684.           const char *name;
  1685.           char buf[SYMNMLEN + 1];
  1686.           struct coff_debug_merge_hash_entry *mh;
  1687.           struct coff_debug_merge_type *mt;
  1688.           union internal_auxent aux;
  1689.           struct coff_debug_merge_element **epp;
  1690.           bfd_byte *esl, *eslend;
  1691.           struct internal_syment *islp;
  1692.           bfd_size_type amt;
  1693.  
  1694.           name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
  1695.           if (name == NULL)
  1696.             return FALSE;
  1697.  
  1698.           /* Ignore fake names invented by compiler; treat them all as
  1699.              the same name.  */
  1700.           if (*name == '~' || *name == '.' || *name == '$'
  1701.               || (*name == bfd_get_symbol_leading_char (input_bfd)
  1702.                   && (name[1] == '~' || name[1] == '.' || name[1] == '$')))
  1703.             name = "";
  1704.  
  1705.           mh = coff_debug_merge_hash_lookup (&flaginfo->debug_merge, name,
  1706.                                              TRUE, TRUE);
  1707.           if (mh == NULL)
  1708.             return FALSE;
  1709.  
  1710.           /* Allocate memory to hold type information.  If this turns
  1711.              out to be a duplicate, we pass this address to
  1712.              bfd_release.  */
  1713.           amt = sizeof (struct coff_debug_merge_type);
  1714.           mt = (struct coff_debug_merge_type *) bfd_alloc (input_bfd, amt);
  1715.           if (mt == NULL)
  1716.             return FALSE;
  1717.           mt->type_class = isym.n_sclass;
  1718.  
  1719.           /* Pick up the aux entry, which points to the end of the tag
  1720.              entries.  */
  1721.           bfd_coff_swap_aux_in (input_bfd, (esym + isymesz),
  1722.                                 isym.n_type, isym.n_sclass, 0, isym.n_numaux,
  1723.                                 &aux);
  1724.  
  1725.           /* Gather the elements.  */
  1726.           epp = &mt->elements;
  1727.           mt->elements = NULL;
  1728.           islp = isymp + 2;
  1729.           esl = esym + 2 * isymesz;
  1730.           eslend = ((bfd_byte *) obj_coff_external_syms (input_bfd)
  1731.                     + aux.x_sym.x_fcnary.x_fcn.x_endndx.l * isymesz);
  1732.           while (esl < eslend)
  1733.             {
  1734.               const char *elename;
  1735.               char elebuf[SYMNMLEN + 1];
  1736.               char *name_copy;
  1737.  
  1738.               bfd_coff_swap_sym_in (input_bfd, esl, islp);
  1739.  
  1740.               amt = sizeof (struct coff_debug_merge_element);
  1741.               *epp = (struct coff_debug_merge_element *)
  1742.                   bfd_alloc (input_bfd, amt);
  1743.               if (*epp == NULL)
  1744.                 return FALSE;
  1745.  
  1746.               elename = _bfd_coff_internal_syment_name (input_bfd, islp,
  1747.                                                         elebuf);
  1748.               if (elename == NULL)
  1749.                 return FALSE;
  1750.  
  1751.               amt = strlen (elename) + 1;
  1752.               name_copy = (char *) bfd_alloc (input_bfd, amt);
  1753.               if (name_copy == NULL)
  1754.                 return FALSE;
  1755.               strcpy (name_copy, elename);
  1756.  
  1757.               (*epp)->name = name_copy;
  1758.               (*epp)->type = islp->n_type;
  1759.               (*epp)->tagndx = 0;
  1760.               if (islp->n_numaux >= 1
  1761.                   && islp->n_type != T_NULL
  1762.                   && islp->n_sclass != C_EOS)
  1763.                 {
  1764.                   union internal_auxent eleaux;
  1765.                   long indx;
  1766.  
  1767.                   bfd_coff_swap_aux_in (input_bfd, (esl + isymesz),
  1768.                                         islp->n_type, islp->n_sclass, 0,
  1769.                                         islp->n_numaux, &eleaux);
  1770.                   indx = eleaux.x_sym.x_tagndx.l;
  1771.  
  1772.                   /* FIXME: If this tagndx entry refers to a symbol
  1773.                      defined later in this file, we just ignore it.
  1774.                      Handling this correctly would be tedious, and may
  1775.                      not be required.  */
  1776.                   if (indx > 0
  1777.                       && (indx
  1778.                           < ((esym -
  1779.                               (bfd_byte *) obj_coff_external_syms (input_bfd))
  1780.                              / (long) isymesz)))
  1781.                     {
  1782.                       (*epp)->tagndx = flaginfo->sym_indices[indx];
  1783.                       if ((*epp)->tagndx < 0)
  1784.                         (*epp)->tagndx = 0;
  1785.                     }
  1786.                 }
  1787.               epp = &(*epp)->next;
  1788.               *epp = NULL;
  1789.  
  1790.               esl += (islp->n_numaux + 1) * isymesz;
  1791.               islp += islp->n_numaux + 1;
  1792.             }
  1793.  
  1794.           /* See if we already have a definition which matches this
  1795.              type.  We always output the type if it has no elements,
  1796.              for simplicity.  */
  1797.           if (mt->elements == NULL)
  1798.             bfd_release (input_bfd, mt);
  1799.           else
  1800.             {
  1801.               struct coff_debug_merge_type *mtl;
  1802.  
  1803.               for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
  1804.                 {
  1805.                   struct coff_debug_merge_element *me, *mel;
  1806.  
  1807.                   if (mtl->type_class != mt->type_class)
  1808.                     continue;
  1809.  
  1810.                   for (me = mt->elements, mel = mtl->elements;
  1811.                        me != NULL && mel != NULL;
  1812.                        me = me->next, mel = mel->next)
  1813.                     {
  1814.                       if (strcmp (me->name, mel->name) != 0
  1815.                           || me->type != mel->type
  1816.                           || me->tagndx != mel->tagndx)
  1817.                         break;
  1818.                     }
  1819.  
  1820.                   if (me == NULL && mel == NULL)
  1821.                     break;
  1822.                 }
  1823.  
  1824.               if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
  1825.                 {
  1826.                   /* This is the first definition of this type.  */
  1827.                   mt->indx = output_index;
  1828.                   mt->next = mh->types;
  1829.                   mh->types = mt;
  1830.                 }
  1831.               else
  1832.                 {
  1833.                   /* This is a redefinition which can be merged.  */
  1834.                   bfd_release (input_bfd, mt);
  1835.                   *indexp = mtl->indx;
  1836.                   add = (eslend - esym) / isymesz;
  1837.                   skip = TRUE;
  1838.                 }
  1839.             }
  1840.         }
  1841.  
  1842.       /* We now know whether we are to skip this symbol or not.  */
  1843.       if (! skip)
  1844.         {
  1845.           /* Adjust the symbol in order to output it.  */
  1846.  
  1847.           if (isym._n._n_n._n_zeroes == 0
  1848.               && isym._n._n_n._n_offset != 0)
  1849.             {
  1850.               const char *name;
  1851.               bfd_size_type indx;
  1852.  
  1853.               /* This symbol has a long name.  Enter it in the string
  1854.                  table we are building.  Note that we do not check
  1855.                  bfd_coff_symname_in_debug.  That is only true for
  1856.                  XCOFF, and XCOFF requires different linking code
  1857.                  anyhow.  */
  1858.               name = _bfd_coff_internal_syment_name (input_bfd, &isym, NULL);
  1859.               if (name == NULL)
  1860.                 return FALSE;
  1861.               indx = _bfd_stringtab_add (flaginfo->strtab, name, hash, copy);
  1862.               if (indx == (bfd_size_type) -1)
  1863.                 return FALSE;
  1864.               isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
  1865.             }
  1866.  
  1867.           switch (isym.n_sclass)
  1868.             {
  1869.             case C_AUTO:
  1870.             case C_MOS:
  1871.             case C_EOS:
  1872.             case C_MOE:
  1873.             case C_MOU:
  1874.             case C_UNTAG:
  1875.             case C_STRTAG:
  1876.             case C_ENTAG:
  1877.             case C_TPDEF:
  1878.             case C_ARG:
  1879.             case C_USTATIC:
  1880.             case C_REG:
  1881.             case C_REGPARM:
  1882.             case C_FIELD:
  1883.               /* The symbol value should not be modified.  */
  1884.               break;
  1885.  
  1886.             case C_FCN:
  1887.               if (obj_pe (input_bfd)
  1888.                   && strcmp (isym.n_name, ".bf") != 0
  1889.                   && isym.n_scnum > 0)
  1890.                 {
  1891.                   /* For PE, .lf and .ef get their value left alone,
  1892.                      while .bf gets relocated.  However, they all have
  1893.                      "real" section numbers, and need to be moved into
  1894.                      the new section.  */
  1895.                   isym.n_scnum = (*secpp)->output_section->target_index;
  1896.                   break;
  1897.                 }
  1898.               /* Fall through.  */
  1899.             default:
  1900.             case C_LABEL:  /* Not completely sure about these 2 */
  1901.             case C_EXTDEF:
  1902.             case C_BLOCK:
  1903.             case C_EFCN:
  1904.             case C_NULL:
  1905.             case C_EXT:
  1906.             case C_STAT:
  1907.             case C_SECTION:
  1908.             case C_NT_WEAK:
  1909.               /* Compute new symbol location.  */
  1910.             if (isym.n_scnum > 0)
  1911.               {
  1912.                 isym.n_scnum = (*secpp)->output_section->target_index;
  1913.                 isym.n_value += (*secpp)->output_offset;
  1914.                 if (! obj_pe (input_bfd))
  1915.                   isym.n_value -= (*secpp)->vma;
  1916.                 if (! obj_pe (flaginfo->output_bfd))
  1917.                   isym.n_value += (*secpp)->output_section->vma;
  1918.               }
  1919.             break;
  1920.  
  1921.             case C_FILE:
  1922.               /* The value of a C_FILE symbol is the symbol index of
  1923.                  the next C_FILE symbol.  The value of the last C_FILE
  1924.                  symbol is the symbol index to the first external
  1925.                  symbol (actually, coff_renumber_symbols does not get
  1926.                  this right--it just sets the value of the last C_FILE
  1927.                  symbol to zero--and nobody has ever complained about
  1928.                  it).  We try to get this right, below, just before we
  1929.                  write the symbols out, but in the general case we may
  1930.                  have to write the symbol out twice.  */
  1931.               if (flaginfo->last_file_index != -1
  1932.                   && flaginfo->last_file.n_value != (bfd_vma) output_index)
  1933.                 {
  1934.                   /* We must correct the value of the last C_FILE
  1935.                      entry.  */
  1936.                   flaginfo->last_file.n_value = output_index;
  1937.                   if ((bfd_size_type) flaginfo->last_file_index >= syment_base)
  1938.                     {
  1939.                       /* The last C_FILE symbol is in this input file.  */
  1940.                       bfd_coff_swap_sym_out (output_bfd,
  1941.                                              &flaginfo->last_file,
  1942.                                              (flaginfo->outsyms
  1943.                                               + ((flaginfo->last_file_index
  1944.                                                   - syment_base)
  1945.                                                  * osymesz)));
  1946.                     }
  1947.                   else
  1948.                     {
  1949.                       file_ptr pos;
  1950.  
  1951.                       /* We have already written out the last C_FILE
  1952.                          symbol.  We need to write it out again.  We
  1953.                          borrow *outsym temporarily.  */
  1954.                       bfd_coff_swap_sym_out (output_bfd,
  1955.                                              &flaginfo->last_file, outsym);
  1956.                       pos = obj_sym_filepos (output_bfd);
  1957.                       pos += flaginfo->last_file_index * osymesz;
  1958.                       if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
  1959.                           || bfd_bwrite (outsym, osymesz, output_bfd) != osymesz)
  1960.                         return FALSE;
  1961.                     }
  1962.                 }
  1963.  
  1964.               flaginfo->last_file_index = output_index;
  1965.               flaginfo->last_file = isym;
  1966.               break;
  1967.             }
  1968.  
  1969.           /* If doing task linking, convert normal global function symbols to
  1970.              static functions.  */
  1971.           if (flaginfo->info->task_link && IS_EXTERNAL (input_bfd, isym))
  1972.             isym.n_sclass = C_STAT;
  1973.  
  1974.           /* Output the symbol.  */
  1975.           bfd_coff_swap_sym_out (output_bfd, &isym, outsym);
  1976.  
  1977.           *indexp = output_index;
  1978.  
  1979.           if (global)
  1980.             {
  1981.               long indx;
  1982.               struct coff_link_hash_entry *h;
  1983.  
  1984.               indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
  1985.                       / isymesz);
  1986.               h = obj_coff_sym_hashes (input_bfd)[indx];
  1987.               if (h == NULL)
  1988.                 {
  1989.                   /* This can happen if there were errors earlier in
  1990.                      the link.  */
  1991.                   bfd_set_error (bfd_error_bad_value);
  1992.                   return FALSE;
  1993.                 }
  1994.               h->indx = output_index;
  1995.             }
  1996.  
  1997.           output_index += add;
  1998.           outsym += add * osymesz;
  1999.         }
  2000.  
  2001.       esym += add * isymesz;
  2002.       isymp += add;
  2003.       ++secpp;
  2004.       ++indexp;
  2005.       for (--add; add > 0; --add)
  2006.         {
  2007.           *secpp++ = NULL;
  2008.           *indexp++ = -1;
  2009.         }
  2010.     }
  2011.  
  2012.   /* Fix up the aux entries.  This must be done in a separate pass,
  2013.      because we don't know the correct symbol indices until we have
  2014.      already decided which symbols we are going to keep.  */
  2015.   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
  2016.   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
  2017.   isymp = flaginfo->internal_syms;
  2018.   indexp = flaginfo->sym_indices;
  2019.   sym_hash = obj_coff_sym_hashes (input_bfd);
  2020.   outsym = flaginfo->outsyms;
  2021.  
  2022.   while (esym < esym_end)
  2023.     {
  2024.       int add;
  2025.  
  2026.       add = 1 + isymp->n_numaux;
  2027.  
  2028.       if ((*indexp < 0
  2029.            || (bfd_size_type) *indexp < syment_base)
  2030.           && (*sym_hash == NULL
  2031.               || (*sym_hash)->auxbfd != input_bfd))
  2032.         esym += add * isymesz;
  2033.       else
  2034.         {
  2035.           struct coff_link_hash_entry *h;
  2036.           int i;
  2037.  
  2038.           h = NULL;
  2039.           if (*indexp < 0)
  2040.             {
  2041.               h = *sym_hash;
  2042.  
  2043.               /* The m68k-motorola-sysv assembler will sometimes
  2044.                  generate two symbols with the same name, but only one
  2045.                  will have aux entries.  */
  2046.               BFD_ASSERT (isymp->n_numaux == 0
  2047.                           || h->numaux == 0
  2048.                           || h->numaux == isymp->n_numaux);
  2049.             }
  2050.  
  2051.           esym += isymesz;
  2052.  
  2053.           if (h == NULL)
  2054.             outsym += osymesz;
  2055.  
  2056.           /* Handle the aux entries.  This handling is based on
  2057.              coff_pointerize_aux.  I don't know if it always correct.  */
  2058.           for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
  2059.             {
  2060.               union internal_auxent aux;
  2061.               union internal_auxent *auxp;
  2062.  
  2063.               if (h != NULL && h->aux != NULL && (h->numaux > i))
  2064.                 auxp = h->aux + i;
  2065.               else
  2066.                 {
  2067.                   bfd_coff_swap_aux_in (input_bfd, esym, isymp->n_type,
  2068.                                         isymp->n_sclass, i, isymp->n_numaux, &aux);
  2069.                   auxp = &aux;
  2070.                 }
  2071.  
  2072.               if (isymp->n_sclass == C_FILE)
  2073.                 {
  2074.                   /* If this is a long filename, we must put it in the
  2075.                      string table.  */
  2076.                   if (auxp->x_file.x_n.x_zeroes == 0
  2077.                       && auxp->x_file.x_n.x_offset != 0)
  2078.                     {
  2079.                       const char *filename;
  2080.                       bfd_size_type indx;
  2081.  
  2082.                       BFD_ASSERT (auxp->x_file.x_n.x_offset
  2083.                                   >= STRING_SIZE_SIZE);
  2084.                       if (strings == NULL)
  2085.                         {
  2086.                           strings = _bfd_coff_read_string_table (input_bfd);
  2087.                           if (strings == NULL)
  2088.                             return FALSE;
  2089.                         }
  2090.                       filename = strings + auxp->x_file.x_n.x_offset;
  2091.                       indx = _bfd_stringtab_add (flaginfo->strtab, filename,
  2092.                                                  hash, copy);
  2093.                       if (indx == (bfd_size_type) -1)
  2094.                         return FALSE;
  2095.                       auxp->x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
  2096.                     }
  2097.                 }
  2098.               else if ((isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
  2099.                        && isymp->n_sclass != C_NT_WEAK)
  2100.                 {
  2101.                   unsigned long indx;
  2102.  
  2103.                   if (ISFCN (isymp->n_type)
  2104.                       || ISTAG (isymp->n_sclass)
  2105.                       || isymp->n_sclass == C_BLOCK
  2106.                       || isymp->n_sclass == C_FCN)
  2107.                     {
  2108.                       indx = auxp->x_sym.x_fcnary.x_fcn.x_endndx.l;
  2109.                       if (indx > 0
  2110.                           && indx < obj_raw_syment_count (input_bfd))
  2111.                         {
  2112.                           /* We look forward through the symbol for
  2113.                              the index of the next symbol we are going
  2114.                              to include.  I don't know if this is
  2115.                              entirely right.  */
  2116.                           while ((flaginfo->sym_indices[indx] < 0
  2117.                                   || ((bfd_size_type) flaginfo->sym_indices[indx]
  2118.                                       < syment_base))
  2119.                                  && indx < obj_raw_syment_count (input_bfd))
  2120.                             ++indx;
  2121.                           if (indx >= obj_raw_syment_count (input_bfd))
  2122.                             indx = output_index;
  2123.                           else
  2124.                             indx = flaginfo->sym_indices[indx];
  2125.                           auxp->x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
  2126.                         }
  2127.                     }
  2128.  
  2129.                   indx = auxp->x_sym.x_tagndx.l;
  2130.                   if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
  2131.                     {
  2132.                       long symindx;
  2133.  
  2134.                       symindx = flaginfo->sym_indices[indx];
  2135.                       if (symindx < 0)
  2136.                         auxp->x_sym.x_tagndx.l = 0;
  2137.                       else
  2138.                         auxp->x_sym.x_tagndx.l = symindx;
  2139.                     }
  2140.  
  2141.                   /* The .bf symbols are supposed to be linked through
  2142.                      the endndx field.  We need to carry this list
  2143.                      across object files.  */
  2144.                   if (i == 0
  2145.                       && h == NULL
  2146.                       && isymp->n_sclass == C_FCN
  2147.                       && (isymp->_n._n_n._n_zeroes != 0
  2148.                           || isymp->_n._n_n._n_offset == 0)
  2149.                       && isymp->_n._n_name[0] == '.'
  2150.                       && isymp->_n._n_name[1] == 'b'
  2151.                       && isymp->_n._n_name[2] == 'f'
  2152.                       && isymp->_n._n_name[3] == '\0')
  2153.                     {
  2154.                       if (flaginfo->last_bf_index != -1)
  2155.                         {
  2156.                           flaginfo->last_bf.x_sym.x_fcnary.x_fcn.x_endndx.l =
  2157.                             *indexp;
  2158.  
  2159.                           if ((bfd_size_type) flaginfo->last_bf_index
  2160.                               >= syment_base)
  2161.                             {
  2162.                               void *auxout;
  2163.  
  2164.                               /* The last .bf symbol is in this input
  2165.                                  file.  This will only happen if the
  2166.                                  assembler did not set up the .bf
  2167.                                  endndx symbols correctly.  */
  2168.                               auxout = (flaginfo->outsyms
  2169.                                         + ((flaginfo->last_bf_index
  2170.                                             - syment_base)
  2171.                                            * osymesz));
  2172.  
  2173.                               bfd_coff_swap_aux_out (output_bfd,
  2174.                                                      &flaginfo->last_bf,
  2175.                                                      isymp->n_type,
  2176.                                                      isymp->n_sclass,
  2177.                                                      0, isymp->n_numaux,
  2178.                                                      auxout);
  2179.                             }
  2180.                           else
  2181.                             {
  2182.                               file_ptr pos;
  2183.  
  2184.                               /* We have already written out the last
  2185.                                  .bf aux entry.  We need to write it
  2186.                                  out again.  We borrow *outsym
  2187.                                  temporarily.  FIXME: This case should
  2188.                                  be made faster.  */
  2189.                               bfd_coff_swap_aux_out (output_bfd,
  2190.                                                      &flaginfo->last_bf,
  2191.                                                      isymp->n_type,
  2192.                                                      isymp->n_sclass,
  2193.                                                      0, isymp->n_numaux,
  2194.                                                      outsym);
  2195.                               pos = obj_sym_filepos (output_bfd);
  2196.                               pos += flaginfo->last_bf_index * osymesz;
  2197.                               if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
  2198.                                   || (bfd_bwrite (outsym, osymesz, output_bfd)
  2199.                                       != osymesz))
  2200.                                 return FALSE;
  2201.                             }
  2202.                         }
  2203.  
  2204.                       if (auxp->x_sym.x_fcnary.x_fcn.x_endndx.l != 0)
  2205.                         flaginfo->last_bf_index = -1;
  2206.                       else
  2207.                         {
  2208.                           /* The endndx field of this aux entry must
  2209.                              be updated with the symbol number of the
  2210.                              next .bf symbol.  */
  2211.                           flaginfo->last_bf = *auxp;
  2212.                           flaginfo->last_bf_index = (((outsym - flaginfo->outsyms)
  2213.                                                    / osymesz)
  2214.                                                   + syment_base);
  2215.                         }
  2216.                     }
  2217.                 }
  2218.  
  2219.               if (h == NULL)
  2220.                 {
  2221.                   bfd_coff_swap_aux_out (output_bfd, auxp, isymp->n_type,
  2222.                                          isymp->n_sclass, i, isymp->n_numaux,
  2223.                                          outsym);
  2224.                   outsym += osymesz;
  2225.                 }
  2226.  
  2227.               esym += isymesz;
  2228.             }
  2229.         }
  2230.  
  2231.       indexp += add;
  2232.       isymp += add;
  2233.       sym_hash += add;
  2234.     }
  2235.  
  2236.   /* Relocate the line numbers, unless we are stripping them.  */
  2237.   if (flaginfo->info->strip == strip_none
  2238.       || flaginfo->info->strip == strip_some)
  2239.     {
  2240.       for (o = input_bfd->sections; o != NULL; o = o->next)
  2241.         {
  2242.           bfd_vma offset;
  2243.           bfd_byte *eline;
  2244.           bfd_byte *elineend;
  2245.           bfd_byte *oeline;
  2246.           bfd_boolean skipping;
  2247.           file_ptr pos;
  2248.           bfd_size_type amt;
  2249.  
  2250.           /* FIXME: If SEC_HAS_CONTENTS is not for the section, then
  2251.              build_link_order in ldwrite.c will not have created a
  2252.              link order, which means that we will not have seen this
  2253.              input section in _bfd_coff_final_link, which means that
  2254.              we will not have allocated space for the line numbers of
  2255.              this section.  I don't think line numbers can be
  2256.              meaningful for a section which does not have
  2257.              SEC_HAS_CONTENTS set, but, if they do, this must be
  2258.              changed.  */
  2259.           if (o->lineno_count == 0
  2260.               || (o->output_section->flags & SEC_HAS_CONTENTS) == 0)
  2261.             continue;
  2262.  
  2263.           if (bfd_seek (input_bfd, o->line_filepos, SEEK_SET) != 0
  2264.               || bfd_bread (flaginfo->linenos, linesz * o->lineno_count,
  2265.                            input_bfd) != linesz * o->lineno_count)
  2266.             return FALSE;
  2267.  
  2268.           offset = o->output_section->vma + o->output_offset - o->vma;
  2269.           eline = flaginfo->linenos;
  2270.           oeline = flaginfo->linenos;
  2271.           elineend = eline + linesz * o->lineno_count;
  2272.           skipping = FALSE;
  2273.           for (; eline < elineend; eline += linesz)
  2274.             {
  2275.               struct internal_lineno iline;
  2276.  
  2277.               bfd_coff_swap_lineno_in (input_bfd, eline, &iline);
  2278.  
  2279.               if (iline.l_lnno != 0)
  2280.                 iline.l_addr.l_paddr += offset;
  2281.               else if (iline.l_addr.l_symndx >= 0
  2282.                        && ((unsigned long) iline.l_addr.l_symndx
  2283.                            < obj_raw_syment_count (input_bfd)))
  2284.                 {
  2285.                   long indx;
  2286.  
  2287.                   indx = flaginfo->sym_indices[iline.l_addr.l_symndx];
  2288.  
  2289.                   if (indx < 0)
  2290.                     {
  2291.                       /* These line numbers are attached to a symbol
  2292.                          which we are stripping.  We must discard the
  2293.                          line numbers because reading them back with
  2294.                          no associated symbol (or associating them all
  2295.                          with symbol #0) will fail.  We can't regain
  2296.                          the space in the output file, but at least
  2297.                          they're dense.  */
  2298.                       skipping = TRUE;
  2299.                     }
  2300.                   else
  2301.                     {
  2302.                       struct internal_syment is;
  2303.                       union internal_auxent ia;
  2304.  
  2305.                       /* Fix up the lnnoptr field in the aux entry of
  2306.                          the symbol.  It turns out that we can't do
  2307.                          this when we modify the symbol aux entries,
  2308.                          because gas sometimes screws up the lnnoptr
  2309.                          field and makes it an offset from the start
  2310.                          of the line numbers rather than an absolute
  2311.                          file index.  */
  2312.                       bfd_coff_swap_sym_in (output_bfd,
  2313.                                             (flaginfo->outsyms
  2314.                                              + ((indx - syment_base)
  2315.                                                 * osymesz)), &is);
  2316.                       if ((ISFCN (is.n_type)
  2317.                            || is.n_sclass == C_BLOCK)
  2318.                           && is.n_numaux >= 1)
  2319.                         {
  2320.                           void *auxptr;
  2321.  
  2322.                           auxptr = (flaginfo->outsyms
  2323.                                     + ((indx - syment_base + 1)
  2324.                                        * osymesz));
  2325.                           bfd_coff_swap_aux_in (output_bfd, auxptr,
  2326.                                                 is.n_type, is.n_sclass,
  2327.                                                 0, is.n_numaux, &ia);
  2328.                           ia.x_sym.x_fcnary.x_fcn.x_lnnoptr =
  2329.                             (o->output_section->line_filepos
  2330.                              + o->output_section->lineno_count * linesz
  2331.                              + eline - flaginfo->linenos);
  2332.                           bfd_coff_swap_aux_out (output_bfd, &ia,
  2333.                                                  is.n_type, is.n_sclass, 0,
  2334.                                                  is.n_numaux, auxptr);
  2335.                         }
  2336.  
  2337.                       skipping = FALSE;
  2338.                     }
  2339.  
  2340.                   iline.l_addr.l_symndx = indx;
  2341.                 }
  2342.  
  2343.               if (!skipping)
  2344.                 {
  2345.                   bfd_coff_swap_lineno_out (output_bfd, &iline, oeline);
  2346.                   oeline += linesz;
  2347.                 }
  2348.             }
  2349.  
  2350.           pos = o->output_section->line_filepos;
  2351.           pos += o->output_section->lineno_count * linesz;
  2352.           amt = oeline - flaginfo->linenos;
  2353.           if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
  2354.               || bfd_bwrite (flaginfo->linenos, amt, output_bfd) != amt)
  2355.             return FALSE;
  2356.  
  2357.           o->output_section->lineno_count += amt / linesz;
  2358.         }
  2359.     }
  2360.  
  2361.   /* If we swapped out a C_FILE symbol, guess that the next C_FILE
  2362.      symbol will be the first symbol in the next input file.  In the
  2363.      normal case, this will save us from writing out the C_FILE symbol
  2364.      again.  */
  2365.   if (flaginfo->last_file_index != -1
  2366.       && (bfd_size_type) flaginfo->last_file_index >= syment_base)
  2367.     {
  2368.       flaginfo->last_file.n_value = output_index;
  2369.       bfd_coff_swap_sym_out (output_bfd, &flaginfo->last_file,
  2370.                              (flaginfo->outsyms
  2371.                               + ((flaginfo->last_file_index - syment_base)
  2372.                                  * osymesz)));
  2373.     }
  2374.  
  2375.   /* Write the modified symbols to the output file.  */
  2376.   if (outsym > flaginfo->outsyms)
  2377.     {
  2378.       file_ptr pos;
  2379.       bfd_size_type amt;
  2380.  
  2381.       pos = obj_sym_filepos (output_bfd) + syment_base * osymesz;
  2382.       amt = outsym - flaginfo->outsyms;
  2383.       if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
  2384.           || bfd_bwrite (flaginfo->outsyms, amt, output_bfd) != amt)
  2385.         return FALSE;
  2386.  
  2387.       BFD_ASSERT ((obj_raw_syment_count (output_bfd)
  2388.                    + (outsym - flaginfo->outsyms) / osymesz)
  2389.                   == output_index);
  2390.  
  2391.       obj_raw_syment_count (output_bfd) = output_index;
  2392.     }
  2393.  
  2394.   /* Relocate the contents of each section.  */
  2395.   adjust_symndx = coff_backend_info (input_bfd)->_bfd_coff_adjust_symndx;
  2396.   for (o = input_bfd->sections; o != NULL; o = o->next)
  2397.     {
  2398.       bfd_byte *contents;
  2399.       struct coff_section_tdata *secdata;
  2400.  
  2401.       if (! o->linker_mark)
  2402.         /* This section was omitted from the link.  */
  2403.         continue;
  2404.  
  2405.       if ((o->flags & SEC_LINKER_CREATED) != 0)
  2406.         continue;
  2407.  
  2408.       if ((o->flags & SEC_HAS_CONTENTS) == 0
  2409.           || (o->size == 0 && (o->flags & SEC_RELOC) == 0))
  2410.         {
  2411.           if ((o->flags & SEC_RELOC) != 0
  2412.               && o->reloc_count != 0)
  2413.             {
  2414.               (*_bfd_error_handler)
  2415.                 (_("%B: relocs in section `%A', but it has no contents"),
  2416.                  input_bfd, o);
  2417.               bfd_set_error (bfd_error_no_contents);
  2418.               return FALSE;
  2419.             }
  2420.  
  2421.           continue;
  2422.         }
  2423.  
  2424.       secdata = coff_section_data (input_bfd, o);
  2425.       if (secdata != NULL && secdata->contents != NULL)
  2426.         contents = secdata->contents;
  2427.       else
  2428.         {
  2429.           contents = flaginfo->contents;
  2430.           if (! bfd_get_full_section_contents (input_bfd, o, &contents))
  2431.             return FALSE;
  2432.         }
  2433.  
  2434.       if ((o->flags & SEC_RELOC) != 0)
  2435.         {
  2436.           int target_index;
  2437.           struct internal_reloc *internal_relocs;
  2438.           struct internal_reloc *irel;
  2439.  
  2440.           /* Read in the relocs.  */
  2441.           target_index = o->output_section->target_index;
  2442.           internal_relocs = (_bfd_coff_read_internal_relocs
  2443.                              (input_bfd, o, FALSE, flaginfo->external_relocs,
  2444.                               flaginfo->info->relocatable,
  2445.                               (flaginfo->info->relocatable
  2446.                                ? (flaginfo->section_info[target_index].relocs
  2447.                                   + o->output_section->reloc_count)
  2448.                                : flaginfo->internal_relocs)));
  2449.           if (internal_relocs == NULL
  2450.               && o->reloc_count > 0)
  2451.             return FALSE;
  2452.  
  2453.           /* Run through the relocs looking for relocs against symbols
  2454.              coming from discarded sections and complain about them.  */
  2455.           irel = internal_relocs;
  2456.           for (; irel < &internal_relocs[o->reloc_count]; irel++)
  2457.             {
  2458.               struct coff_link_hash_entry *h;
  2459.               asection *ps = NULL;
  2460.               long symndx = irel->r_symndx;
  2461.               if (symndx < 0)
  2462.                 continue;
  2463.               h = obj_coff_sym_hashes (input_bfd)[symndx];
  2464.               if (h == NULL)
  2465.                 continue;
  2466.               while (h->root.type == bfd_link_hash_indirect
  2467.                      || h->root.type == bfd_link_hash_warning)
  2468.                 h = (struct coff_link_hash_entry *) h->root.u.i.link;
  2469.               if (h->root.type == bfd_link_hash_defined
  2470.                   || h->root.type == bfd_link_hash_defweak)
  2471.                 ps = h->root.u.def.section;
  2472.               if (ps == NULL)
  2473.                 continue;
  2474.               /* Complain if definition comes from an excluded section.  */
  2475.               if (ps->flags & SEC_EXCLUDE)
  2476.                 (*flaginfo->info->callbacks->einfo)
  2477.                   (_("%X`%s' referenced in section `%A' of %B: "
  2478.                      "defined in discarded section `%A' of %B\n"),
  2479.                    h->root.root.string, o, input_bfd, ps, ps->owner);
  2480.             }
  2481.  
  2482.           /* Call processor specific code to relocate the section
  2483.              contents.  */
  2484.           if (! bfd_coff_relocate_section (output_bfd, flaginfo->info,
  2485.                                            input_bfd, o,
  2486.                                            contents,
  2487.                                            internal_relocs,
  2488.                                            flaginfo->internal_syms,
  2489.                                            flaginfo->sec_ptrs))
  2490.             return FALSE;
  2491.  
  2492.           if (flaginfo->info->relocatable)
  2493.             {
  2494.               bfd_vma offset;
  2495.               struct internal_reloc *irelend;
  2496.               struct coff_link_hash_entry **rel_hash;
  2497.  
  2498.               offset = o->output_section->vma + o->output_offset - o->vma;
  2499.               irel = internal_relocs;
  2500.               irelend = irel + o->reloc_count;
  2501.               rel_hash = (flaginfo->section_info[target_index].rel_hashes
  2502.                           + o->output_section->reloc_count);
  2503.               for (; irel < irelend; irel++, rel_hash++)
  2504.                 {
  2505.                   struct coff_link_hash_entry *h;
  2506.                   bfd_boolean adjusted;
  2507.  
  2508.                   *rel_hash = NULL;
  2509.  
  2510.                   /* Adjust the reloc address and symbol index.  */
  2511.                   irel->r_vaddr += offset;
  2512.  
  2513.                   if (irel->r_symndx == -1)
  2514.                     continue;
  2515.  
  2516.                   if (adjust_symndx)
  2517.                     {
  2518.                       if (! (*adjust_symndx) (output_bfd, flaginfo->info,
  2519.                                               input_bfd, o, irel,
  2520.                                               &adjusted))
  2521.                         return FALSE;
  2522.                       if (adjusted)
  2523.                         continue;
  2524.                     }
  2525.  
  2526.                   h = obj_coff_sym_hashes (input_bfd)[irel->r_symndx];
  2527.                   if (h != NULL)
  2528.                     {
  2529.                       /* This is a global symbol.  */
  2530.                       if (h->indx >= 0)
  2531.                         irel->r_symndx = h->indx;
  2532.                       else
  2533.                         {
  2534.                           /* This symbol is being written at the end
  2535.                              of the file, and we do not yet know the
  2536.                              symbol index.  We save the pointer to the
  2537.                              hash table entry in the rel_hash list.
  2538.                              We set the indx field to -2 to indicate
  2539.                              that this symbol must not be stripped.  */
  2540.                           *rel_hash = h;
  2541.                           h->indx = -2;
  2542.                         }
  2543.                     }
  2544.                   else
  2545.                     {
  2546.                       long indx;
  2547.  
  2548.                       indx = flaginfo->sym_indices[irel->r_symndx];
  2549.                       if (indx != -1)
  2550.                         irel->r_symndx = indx;
  2551.                       else
  2552.                         {
  2553.                           struct internal_syment *is;
  2554.                           const char *name;
  2555.                           char buf[SYMNMLEN + 1];
  2556.  
  2557.                           /* This reloc is against a symbol we are
  2558.                              stripping.  This should have been handled
  2559.                              by the 'dont_skip_symbol' code in the while
  2560.                              loop at the top of this function.  */
  2561.                           is = flaginfo->internal_syms + irel->r_symndx;
  2562.  
  2563.                           name = (_bfd_coff_internal_syment_name
  2564.                                   (input_bfd, is, buf));
  2565.                           if (name == NULL)
  2566.                             return FALSE;
  2567.  
  2568.                           if (! ((*flaginfo->info->callbacks->unattached_reloc)
  2569.                                  (flaginfo->info, name, input_bfd, o,
  2570.                                   irel->r_vaddr)))
  2571.                             return FALSE;
  2572.                         }
  2573.                     }
  2574.                 }
  2575.  
  2576.               o->output_section->reloc_count += o->reloc_count;
  2577.             }
  2578.         }
  2579.  
  2580.       /* Write out the modified section contents.  */
  2581.       if (secdata == NULL || secdata->stab_info == NULL)
  2582.         {
  2583.           file_ptr loc = o->output_offset * bfd_octets_per_byte (output_bfd);
  2584.           if (! bfd_set_section_contents (output_bfd, o->output_section,
  2585.                                           contents, loc, o->size))
  2586.             return FALSE;
  2587.         }
  2588.       else
  2589.         {
  2590.           if (! (_bfd_write_section_stabs
  2591.                  (output_bfd, &coff_hash_table (flaginfo->info)->stab_info,
  2592.                   o, &secdata->stab_info, contents)))
  2593.             return FALSE;
  2594.         }
  2595.     }
  2596.  
  2597.   if (! flaginfo->info->keep_memory
  2598.       && ! _bfd_coff_free_symbols (input_bfd))
  2599.     return FALSE;
  2600.  
  2601.   return TRUE;
  2602. }
  2603.  
  2604. /* Write out a global symbol.  Called via bfd_hash_traverse.  */
  2605.  
  2606. bfd_boolean
  2607. _bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data)
  2608. {
  2609.   struct coff_link_hash_entry *h = (struct coff_link_hash_entry *) bh;
  2610.   struct coff_final_link_info *flaginfo = (struct coff_final_link_info *) data;
  2611.   bfd *output_bfd;
  2612.   struct internal_syment isym;
  2613.   bfd_size_type symesz;
  2614.   unsigned int i;
  2615.   file_ptr pos;
  2616.  
  2617.   output_bfd = flaginfo->output_bfd;
  2618.  
  2619.   if (h->root.type == bfd_link_hash_warning)
  2620.     {
  2621.       h = (struct coff_link_hash_entry *) h->root.u.i.link;
  2622.       if (h->root.type == bfd_link_hash_new)
  2623.         return TRUE;
  2624.     }
  2625.  
  2626.   if (h->indx >= 0)
  2627.     return TRUE;
  2628.  
  2629.   if (h->indx != -2
  2630.       && (flaginfo->info->strip == strip_all
  2631.           || (flaginfo->info->strip == strip_some
  2632.               && (bfd_hash_lookup (flaginfo->info->keep_hash,
  2633.                                    h->root.root.string, FALSE, FALSE)
  2634.                   == NULL))))
  2635.     return TRUE;
  2636.  
  2637.   switch (h->root.type)
  2638.     {
  2639.     default:
  2640.     case bfd_link_hash_new:
  2641.     case bfd_link_hash_warning:
  2642.       abort ();
  2643.       return FALSE;
  2644.  
  2645.     case bfd_link_hash_undefined:
  2646.     case bfd_link_hash_undefweak:
  2647.       isym.n_scnum = N_UNDEF;
  2648.       isym.n_value = 0;
  2649.       break;
  2650.  
  2651.     case bfd_link_hash_defined:
  2652.     case bfd_link_hash_defweak:
  2653.       {
  2654.         asection *sec;
  2655.  
  2656.         sec = h->root.u.def.section->output_section;
  2657.         if (bfd_is_abs_section (sec))
  2658.           isym.n_scnum = N_ABS;
  2659.         else
  2660.           isym.n_scnum = sec->target_index;
  2661.         isym.n_value = (h->root.u.def.value
  2662.                         + h->root.u.def.section->output_offset);
  2663.         if (! obj_pe (flaginfo->output_bfd))
  2664.           isym.n_value += sec->vma;
  2665.       }
  2666.       break;
  2667.  
  2668.     case bfd_link_hash_common:
  2669.       isym.n_scnum = N_UNDEF;
  2670.       isym.n_value = h->root.u.c.size;
  2671.       break;
  2672.  
  2673.     case bfd_link_hash_indirect:
  2674.       /* Just ignore these.  They can't be handled anyhow.  */
  2675.       return TRUE;
  2676.     }
  2677.  
  2678.   if (strlen (h->root.root.string) <= SYMNMLEN)
  2679.     strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
  2680.   else
  2681.     {
  2682.       bfd_boolean hash;
  2683.       bfd_size_type indx;
  2684.  
  2685.       hash = TRUE;
  2686.       if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
  2687.         hash = FALSE;
  2688.       indx = _bfd_stringtab_add (flaginfo->strtab, h->root.root.string, hash,
  2689.                                  FALSE);
  2690.       if (indx == (bfd_size_type) -1)
  2691.         {
  2692.           flaginfo->failed = TRUE;
  2693.           return FALSE;
  2694.         }
  2695.       isym._n._n_n._n_zeroes = 0;
  2696.       isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
  2697.     }
  2698.  
  2699.   isym.n_sclass = h->symbol_class;
  2700.   isym.n_type = h->type;
  2701.  
  2702.   if (isym.n_sclass == C_NULL)
  2703.     isym.n_sclass = C_EXT;
  2704.  
  2705.   /* If doing task linking and this is the pass where we convert
  2706.      defined globals to statics, then do that conversion now.  If the
  2707.      symbol is not being converted, just ignore it and it will be
  2708.      output during a later pass.  */
  2709.   if (flaginfo->global_to_static)
  2710.     {
  2711.       if (! IS_EXTERNAL (output_bfd, isym))
  2712.         return TRUE;
  2713.  
  2714.       isym.n_sclass = C_STAT;
  2715.     }
  2716.  
  2717.   /* When a weak symbol is not overridden by a strong one,
  2718.      turn it into an external symbol when not building a
  2719.      shared or relocatable object.  */
  2720.   if (! flaginfo->info->shared
  2721.       && ! flaginfo->info->relocatable
  2722.       && IS_WEAK_EXTERNAL (flaginfo->output_bfd, isym))
  2723.     isym.n_sclass = C_EXT;
  2724.  
  2725.   isym.n_numaux = h->numaux;
  2726.  
  2727.   bfd_coff_swap_sym_out (output_bfd, &isym, flaginfo->outsyms);
  2728.  
  2729.   symesz = bfd_coff_symesz (output_bfd);
  2730.  
  2731.   pos = obj_sym_filepos (output_bfd);
  2732.   pos += obj_raw_syment_count (output_bfd) * symesz;
  2733.   if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
  2734.       || bfd_bwrite (flaginfo->outsyms, symesz, output_bfd) != symesz)
  2735.     {
  2736.       flaginfo->failed = TRUE;
  2737.       return FALSE;
  2738.     }
  2739.  
  2740.   h->indx = obj_raw_syment_count (output_bfd);
  2741.  
  2742.   ++obj_raw_syment_count (output_bfd);
  2743.  
  2744.   /* Write out any associated aux entries.  Most of the aux entries
  2745.      will have been modified in _bfd_coff_link_input_bfd.  We have to
  2746.      handle section aux entries here, now that we have the final
  2747.      relocation and line number counts.  */
  2748.   for (i = 0; i < isym.n_numaux; i++)
  2749.     {
  2750.       union internal_auxent *auxp;
  2751.  
  2752.       auxp = h->aux + i;
  2753.  
  2754.       /* Look for a section aux entry here using the same tests that
  2755.          coff_swap_aux_out uses.  */
  2756.       if (i == 0
  2757.           && (isym.n_sclass == C_STAT
  2758.               || isym.n_sclass == C_HIDDEN)
  2759.           && isym.n_type == T_NULL
  2760.           && (h->root.type == bfd_link_hash_defined
  2761.               || h->root.type == bfd_link_hash_defweak))
  2762.         {
  2763.           asection *sec;
  2764.  
  2765.           sec = h->root.u.def.section->output_section;
  2766.           if (sec != NULL)
  2767.             {
  2768.               auxp->x_scn.x_scnlen = sec->size;
  2769.  
  2770.               /* For PE, an overflow on the final link reportedly does
  2771.                  not matter.  FIXME: Why not?  */
  2772.               if (sec->reloc_count > 0xffff
  2773.                   && (! obj_pe (output_bfd)
  2774.                       || flaginfo->info->relocatable))
  2775.                 (*_bfd_error_handler)
  2776.                   (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
  2777.                    bfd_get_filename (output_bfd),
  2778.                    bfd_get_section_name (output_bfd, sec),
  2779.                    sec->reloc_count);
  2780.  
  2781.               if (sec->lineno_count > 0xffff
  2782.                   && (! obj_pe (output_bfd)
  2783.                       || flaginfo->info->relocatable))
  2784.                 (*_bfd_error_handler)
  2785.                   (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
  2786.                    bfd_get_filename (output_bfd),
  2787.                    bfd_get_section_name (output_bfd, sec),
  2788.                    sec->lineno_count);
  2789.  
  2790.               auxp->x_scn.x_nreloc = sec->reloc_count;
  2791.               auxp->x_scn.x_nlinno = sec->lineno_count;
  2792.               auxp->x_scn.x_checksum = 0;
  2793.               auxp->x_scn.x_associated = 0;
  2794.               auxp->x_scn.x_comdat = 0;
  2795.             }
  2796.         }
  2797.  
  2798.       bfd_coff_swap_aux_out (output_bfd, auxp, isym.n_type,
  2799.                              isym.n_sclass, (int) i, isym.n_numaux,
  2800.                              flaginfo->outsyms);
  2801.       if (bfd_bwrite (flaginfo->outsyms, symesz, output_bfd) != symesz)
  2802.         {
  2803.           flaginfo->failed = TRUE;
  2804.           return FALSE;
  2805.         }
  2806.       ++obj_raw_syment_count (output_bfd);
  2807.     }
  2808.  
  2809.   return TRUE;
  2810. }
  2811.  
  2812. /* Write out task global symbols, converting them to statics.  Called
  2813.    via coff_link_hash_traverse.  Calls bfd_coff_write_global_sym to do
  2814.    the dirty work, if the symbol we are processing needs conversion.  */
  2815.  
  2816. bfd_boolean
  2817. _bfd_coff_write_task_globals (struct coff_link_hash_entry *h, void *data)
  2818. {
  2819.   struct coff_final_link_info *flaginfo = (struct coff_final_link_info *) data;
  2820.   bfd_boolean rtnval = TRUE;
  2821.   bfd_boolean save_global_to_static;
  2822.  
  2823.   if (h->root.type == bfd_link_hash_warning)
  2824.     h = (struct coff_link_hash_entry *) h->root.u.i.link;
  2825.  
  2826.   if (h->indx < 0)
  2827.     {
  2828.       switch (h->root.type)
  2829.         {
  2830.         case bfd_link_hash_defined:
  2831.         case bfd_link_hash_defweak:
  2832.           save_global_to_static = flaginfo->global_to_static;
  2833.           flaginfo->global_to_static = TRUE;
  2834.           rtnval = _bfd_coff_write_global_sym (&h->root.root, data);
  2835.           flaginfo->global_to_static = save_global_to_static;
  2836.           break;
  2837.         default:
  2838.           break;
  2839.         }
  2840.     }
  2841.   return (rtnval);
  2842. }
  2843.  
  2844. /* Handle a link order which is supposed to generate a reloc.  */
  2845.  
  2846. bfd_boolean
  2847. _bfd_coff_reloc_link_order (bfd *output_bfd,
  2848.                             struct coff_final_link_info *flaginfo,
  2849.                             asection *output_section,
  2850.                             struct bfd_link_order *link_order)
  2851. {
  2852.   reloc_howto_type *howto;
  2853.   struct internal_reloc *irel;
  2854.   struct coff_link_hash_entry **rel_hash_ptr;
  2855.  
  2856.   howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
  2857.   if (howto == NULL)
  2858.     {
  2859.       bfd_set_error (bfd_error_bad_value);
  2860.       return FALSE;
  2861.     }
  2862.  
  2863.   if (link_order->u.reloc.p->addend != 0)
  2864.     {
  2865.       bfd_size_type size;
  2866.       bfd_byte *buf;
  2867.       bfd_reloc_status_type rstat;
  2868.       bfd_boolean ok;
  2869.       file_ptr loc;
  2870.  
  2871.       size = bfd_get_reloc_size (howto);
  2872.       buf = (bfd_byte *) bfd_zmalloc (size);
  2873.       if (buf == NULL)
  2874.         return FALSE;
  2875.  
  2876.       rstat = _bfd_relocate_contents (howto, output_bfd,
  2877.                                       (bfd_vma) link_order->u.reloc.p->addend,\
  2878.                                       buf);
  2879.       switch (rstat)
  2880.         {
  2881.         case bfd_reloc_ok:
  2882.           break;
  2883.         default:
  2884.         case bfd_reloc_outofrange:
  2885.           abort ();
  2886.         case bfd_reloc_overflow:
  2887.           if (! ((*flaginfo->info->callbacks->reloc_overflow)
  2888.                  (flaginfo->info, NULL,
  2889.                   (link_order->type == bfd_section_reloc_link_order
  2890.                    ? bfd_section_name (output_bfd,
  2891.                                        link_order->u.reloc.p->u.section)
  2892.                    : link_order->u.reloc.p->u.name),
  2893.                   howto->name, link_order->u.reloc.p->addend,
  2894.                   (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
  2895.             {
  2896.               free (buf);
  2897.               return FALSE;
  2898.             }
  2899.           break;
  2900.         }
  2901.       loc = link_order->offset * bfd_octets_per_byte (output_bfd);
  2902.       ok = bfd_set_section_contents (output_bfd, output_section, buf,
  2903.                                      loc, size);
  2904.       free (buf);
  2905.       if (! ok)
  2906.         return FALSE;
  2907.     }
  2908.  
  2909.   /* Store the reloc information in the right place.  It will get
  2910.      swapped and written out at the end of the final_link routine.  */
  2911.   irel = (flaginfo->section_info[output_section->target_index].relocs
  2912.           + output_section->reloc_count);
  2913.   rel_hash_ptr = (flaginfo->section_info[output_section->target_index].rel_hashes
  2914.                   + output_section->reloc_count);
  2915.  
  2916.   memset (irel, 0, sizeof (struct internal_reloc));
  2917.   *rel_hash_ptr = NULL;
  2918.  
  2919.   irel->r_vaddr = output_section->vma + link_order->offset;
  2920.  
  2921.   if (link_order->type == bfd_section_reloc_link_order)
  2922.     {
  2923.       /* We need to somehow locate a symbol in the right section.  The
  2924.          symbol must either have a value of zero, or we must adjust
  2925.          the addend by the value of the symbol.  FIXME: Write this
  2926.          when we need it.  The old linker couldn't handle this anyhow.  */
  2927.       abort ();
  2928.       *rel_hash_ptr = NULL;
  2929.       irel->r_symndx = 0;
  2930.     }
  2931.   else
  2932.     {
  2933.       struct coff_link_hash_entry *h;
  2934.  
  2935.       h = ((struct coff_link_hash_entry *)
  2936.            bfd_wrapped_link_hash_lookup (output_bfd, flaginfo->info,
  2937.                                          link_order->u.reloc.p->u.name,
  2938.                                          FALSE, FALSE, TRUE));
  2939.       if (h != NULL)
  2940.         {
  2941.           if (h->indx >= 0)
  2942.             irel->r_symndx = h->indx;
  2943.           else
  2944.             {
  2945.               /* Set the index to -2 to force this symbol to get
  2946.                  written out.  */
  2947.               h->indx = -2;
  2948.               *rel_hash_ptr = h;
  2949.               irel->r_symndx = 0;
  2950.             }
  2951.         }
  2952.       else
  2953.         {
  2954.           if (! ((*flaginfo->info->callbacks->unattached_reloc)
  2955.                  (flaginfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
  2956.                   (asection *) NULL, (bfd_vma) 0)))
  2957.             return FALSE;
  2958.           irel->r_symndx = 0;
  2959.         }
  2960.     }
  2961.  
  2962.   /* FIXME: Is this always right?  */
  2963.   irel->r_type = howto->type;
  2964.  
  2965.   /* r_size is only used on the RS/6000, which needs its own linker
  2966.      routines anyhow.  r_extern is only used for ECOFF.  */
  2967.  
  2968.   /* FIXME: What is the right value for r_offset?  Is zero OK?  */
  2969.   ++output_section->reloc_count;
  2970.  
  2971.   return TRUE;
  2972. }
  2973.  
  2974. /* A basic reloc handling routine which may be used by processors with
  2975.    simple relocs.  */
  2976.  
  2977. bfd_boolean
  2978. _bfd_coff_generic_relocate_section (bfd *output_bfd,
  2979.                                     struct bfd_link_info *info,
  2980.                                     bfd *input_bfd,
  2981.                                     asection *input_section,
  2982.                                     bfd_byte *contents,
  2983.                                     struct internal_reloc *relocs,
  2984.                                     struct internal_syment *syms,
  2985.                                     asection **sections)
  2986. {
  2987.   struct internal_reloc *rel;
  2988.   struct internal_reloc *relend;
  2989.  
  2990.   rel = relocs;
  2991.   relend = rel + input_section->reloc_count;
  2992.   for (; rel < relend; rel++)
  2993.     {
  2994.       long symndx;
  2995.       struct coff_link_hash_entry *h;
  2996.       struct internal_syment *sym;
  2997.       bfd_vma addend;
  2998.       bfd_vma val;
  2999.       reloc_howto_type *howto;
  3000.       bfd_reloc_status_type rstat;
  3001.  
  3002.       symndx = rel->r_symndx;
  3003.  
  3004.       if (symndx == -1)
  3005.         {
  3006.           h = NULL;
  3007.           sym = NULL;
  3008.         }
  3009.       else if (symndx < 0
  3010.                || (unsigned long) symndx >= obj_raw_syment_count (input_bfd))
  3011.         {
  3012.           (*_bfd_error_handler)
  3013.             ("%B: illegal symbol index %ld in relocs", input_bfd, symndx);
  3014.           return FALSE;
  3015.         }
  3016.       else
  3017.         {
  3018.           h = obj_coff_sym_hashes (input_bfd)[symndx];
  3019.           sym = syms + symndx;
  3020.         }
  3021.  
  3022.       /* COFF treats common symbols in one of two ways.  Either the
  3023.          size of the symbol is included in the section contents, or it
  3024.          is not.  We assume that the size is not included, and force
  3025.          the rtype_to_howto function to adjust the addend as needed.  */
  3026.       if (sym != NULL && sym->n_scnum != 0)
  3027.         addend = - sym->n_value;
  3028.       else
  3029.         addend = 0;
  3030.  
  3031.       howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
  3032.                                        sym, &addend);
  3033.       if (howto == NULL)
  3034.         return FALSE;
  3035.  
  3036.       /* If we are doing a relocatable link, then we can just ignore
  3037.          a PC relative reloc that is pcrel_offset.  It will already
  3038.          have the correct value.  If this is not a relocatable link,
  3039.          then we should ignore the symbol value.  */
  3040.       if (howto->pc_relative && howto->pcrel_offset)
  3041.         {
  3042.           if (info->relocatable)
  3043.             continue;
  3044.           if (sym != NULL && sym->n_scnum != 0)
  3045.             addend += sym->n_value;
  3046.         }
  3047.  
  3048.       val = 0;
  3049.  
  3050.       if (h == NULL)
  3051.         {
  3052.           asection *sec;
  3053.  
  3054.           if (symndx == -1)
  3055.             {
  3056.               sec = bfd_abs_section_ptr;
  3057.               val = 0;
  3058.             }
  3059.           else
  3060.             {
  3061.               sec = sections[symndx];
  3062.               val = (sec->output_section->vma
  3063.                      + sec->output_offset
  3064.                      + sym->n_value);
  3065.               if (! obj_pe (input_bfd))
  3066.                 val -= sec->vma;
  3067.             }
  3068.         }
  3069.       else
  3070.         {
  3071.           if (h->root.type == bfd_link_hash_defined
  3072.               || h->root.type == bfd_link_hash_defweak)
  3073.             {
  3074.               /* Defined weak symbols are a GNU extension. */
  3075.               asection *sec;
  3076.  
  3077.               sec = h->root.u.def.section;
  3078.               val = (h->root.u.def.value
  3079.                      + sec->output_section->vma
  3080.                      + sec->output_offset);
  3081.             }
  3082.  
  3083.           else if (h->root.type == bfd_link_hash_undefweak)
  3084.             {
  3085.               if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
  3086.                 {
  3087.                   /* See _Microsoft Portable Executable and Common Object
  3088.                      File Format Specification_, section 5.5.3.
  3089.                      Note that weak symbols without aux records are a GNU
  3090.                      extension.
  3091.                      FIXME: All weak externals are treated as having
  3092.                      characteristic IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY (1).
  3093.                      These behave as per SVR4 ABI:  A library member
  3094.                      will resolve a weak external only if a normal
  3095.                      external causes the library member to be linked.
  3096.                      See also linker.c: generic_link_check_archive_element. */
  3097.                   asection *sec;
  3098.                   struct coff_link_hash_entry *h2 =
  3099.                     h->auxbfd->tdata.coff_obj_data->sym_hashes[
  3100.                     h->aux->x_sym.x_tagndx.l];
  3101.  
  3102.                   if (!h2 || h2->root.type == bfd_link_hash_undefined)
  3103.                     {
  3104.                       sec = bfd_abs_section_ptr;
  3105.                       val = 0;
  3106.                     }
  3107.                   else
  3108.                     {
  3109.                       sec = h2->root.u.def.section;
  3110.                       val = h2->root.u.def.value
  3111.                         + sec->output_section->vma + sec->output_offset;
  3112.                     }
  3113.                 }
  3114.               else
  3115.                 /* This is a GNU extension.  */
  3116.                 val = 0;
  3117.             }
  3118.  
  3119.           else if (! info->relocatable)
  3120.             {
  3121.               if (! ((*info->callbacks->undefined_symbol)
  3122.                      (info, h->root.root.string, input_bfd, input_section,
  3123.                       rel->r_vaddr - input_section->vma, TRUE)))
  3124.                 return FALSE;
  3125.             }
  3126.         }
  3127.  
  3128.       if (info->base_file)
  3129.         {
  3130.           /* Emit a reloc if the backend thinks it needs it.  */
  3131.           if (sym && pe_data (output_bfd)->in_reloc_p (output_bfd, howto))
  3132.             {
  3133.               /* Relocation to a symbol in a section which isn't
  3134.                  absolute.  We output the address here to a file.
  3135.                  This file is then read by dlltool when generating the
  3136.                  reloc section.  Note that the base file is not
  3137.                  portable between systems.  We write out a bfd_vma here,
  3138.                  and dlltool reads in a bfd_vma.  */
  3139.               bfd_vma addr = (rel->r_vaddr
  3140.                            - input_section->vma
  3141.                            + input_section->output_offset
  3142.                            + input_section->output_section->vma);
  3143.               if (coff_data (output_bfd)->pe)
  3144.                 addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
  3145.               if (fwrite (&addr, 1, sizeof (bfd_vma), (FILE *) info->base_file)
  3146.                   != sizeof (bfd_vma))
  3147.                 {
  3148.                   bfd_set_error (bfd_error_system_call);
  3149.                   return FALSE;
  3150.                 }
  3151.             }
  3152.         }
  3153.  
  3154.       rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
  3155.                                         contents,
  3156.                                         rel->r_vaddr - input_section->vma,
  3157.                                         val, addend);
  3158.  
  3159.       switch (rstat)
  3160.         {
  3161.         default:
  3162.           abort ();
  3163.         case bfd_reloc_ok:
  3164.           break;
  3165.         case bfd_reloc_outofrange:
  3166.           (*_bfd_error_handler)
  3167.             (_("%B: bad reloc address 0x%lx in section `%A'"),
  3168.              input_bfd, input_section, (unsigned long) rel->r_vaddr);
  3169.           return FALSE;
  3170.         case bfd_reloc_overflow:
  3171.           {
  3172.             const char *name;
  3173.             char buf[SYMNMLEN + 1];
  3174.  
  3175.             if (symndx == -1)
  3176.               name = "*ABS*";
  3177.             else if (h != NULL)
  3178.               name = NULL;
  3179.             else
  3180.               {
  3181.                 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
  3182.                 if (name == NULL)
  3183.                   return FALSE;
  3184.               }
  3185.  
  3186.             if (! ((*info->callbacks->reloc_overflow)
  3187.                    (info, (h ? &h->root : NULL), name, howto->name,
  3188.                     (bfd_vma) 0, input_bfd, input_section,
  3189.                     rel->r_vaddr - input_section->vma)))
  3190.               return FALSE;
  3191.           }
  3192.         }
  3193.     }
  3194.   return TRUE;
  3195. }
  3196.