OSDN Git Service

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