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