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