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