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