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