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