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