OSDN Git Service

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