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