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