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