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