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