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