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