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