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