xref: /netbsd-src/external/gpl3/gdb/dist/bfd/coffgen.c (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
1 /* Support for the generic parts of COFF, for BFD.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5    Written by Cygnus Support.
6 
7    This file is part of BFD, the Binary File Descriptor library.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23 
24 /* Most of this hacked by  Steve Chamberlain, sac@cygnus.com.
25    Split out of coffcode.h by Ian Taylor, ian@cygnus.com.  */
26 
27 /* This file contains COFF code that is not dependent on any
28    particular COFF target.  There is only one version of this file in
29    libbfd.a, so no target specific code may be put in here.  Or, to
30    put it another way,
31 
32    ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
33 
34    If you need to add some target specific behaviour, add a new hook
35    function to bfd_coff_backend_data.
36 
37    Some of these functions are also called by the ECOFF routines.
38    Those functions may not use any COFF specific information, such as
39    coff_data (abfd).  */
40 
41 #include "sysdep.h"
42 #include "bfd.h"
43 #include "libbfd.h"
44 #include "coff/internal.h"
45 #include "libcoff.h"
46 
47 /* Take a section header read from a coff file (in HOST byte order),
48    and make a BFD "section" out of it.  This is used by ECOFF.  */
49 
50 static bfd_boolean
51 make_a_section_from_file (bfd *abfd,
52 			  struct internal_scnhdr *hdr,
53 			  unsigned int target_index)
54 {
55   asection *return_section;
56   char *name;
57   bfd_boolean result = TRUE;
58   flagword flags;
59 
60   name = NULL;
61 
62   /* Handle long section names as in PE.  On reading, we want to
63     accept long names if the format permits them at all, regardless
64     of the current state of the flag that dictates if we would generate
65     them in outputs; this construct checks if that is the case by
66     attempting to set the flag, without changing its state; the call
67     will fail for formats that do not support long names at all.  */
68   if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd))
69       && hdr->s_name[0] == '/')
70     {
71       char buf[SCNNMLEN];
72       long strindex;
73       char *p;
74       const char *strings;
75 
76       /* Flag that this BFD uses long names, even though the format might
77          expect them to be off by default.  This won't directly affect the
78          format of any output BFD created from this one, but the information
79          can be used to decide what to do.  */
80       bfd_coff_set_long_section_names (abfd, TRUE);
81       memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
82       buf[SCNNMLEN - 1] = '\0';
83       strindex = strtol (buf, &p, 10);
84       if (*p == '\0' && strindex >= 0)
85 	{
86 	  strings = _bfd_coff_read_string_table (abfd);
87 	  if (strings == NULL)
88 	    return FALSE;
89 	  /* FIXME: For extra safety, we should make sure that
90              strindex does not run us past the end, but right now we
91              don't know the length of the string table.  */
92 	  strings += strindex;
93 	  name = (char *) bfd_alloc (abfd,
94                                      (bfd_size_type) strlen (strings) + 1 + 1);
95 	  if (name == NULL)
96 	    return FALSE;
97 	  strcpy (name, strings);
98 	}
99     }
100 
101   if (name == NULL)
102     {
103       /* Assorted wastage to null-terminate the name, thanks AT&T! */
104       name = (char *) bfd_alloc (abfd,
105                                  (bfd_size_type) sizeof (hdr->s_name) + 1 + 1);
106       if (name == NULL)
107 	return FALSE;
108       strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
109       name[sizeof (hdr->s_name)] = 0;
110     }
111 
112   return_section = bfd_make_section_anyway (abfd, name);
113   if (return_section == NULL)
114     return FALSE;
115 
116   return_section->vma = hdr->s_vaddr;
117   return_section->lma = hdr->s_paddr;
118   return_section->size = hdr->s_size;
119   return_section->filepos = hdr->s_scnptr;
120   return_section->rel_filepos = hdr->s_relptr;
121   return_section->reloc_count = hdr->s_nreloc;
122 
123   bfd_coff_set_alignment_hook (abfd, return_section, hdr);
124 
125   return_section->line_filepos = hdr->s_lnnoptr;
126 
127   return_section->lineno_count = hdr->s_nlnno;
128   return_section->userdata = NULL;
129   return_section->next = NULL;
130   return_section->target_index = target_index;
131 
132   if (! bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, return_section,
133 					 & flags))
134     result = FALSE;
135 
136   return_section->flags = flags;
137 
138   /* At least on i386-coff, the line number count for a shared library
139      section must be ignored.  */
140   if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
141     return_section->lineno_count = 0;
142 
143   if (hdr->s_nreloc != 0)
144     return_section->flags |= SEC_RELOC;
145   /* FIXME: should this check 'hdr->s_size > 0'.  */
146   if (hdr->s_scnptr != 0)
147     return_section->flags |= SEC_HAS_CONTENTS;
148 
149   /* Compress/decompress DWARF debug sections with names: .debug_* and
150      .zdebug_*, after the section flags is set.  */
151   if ((flags & SEC_DEBUGGING)
152       && ((name[1] == 'd' && name[6] == '_')
153 	  || (name[1] == 'z' && name[7] == '_')))
154     {
155       enum { nothing, compress, decompress } action = nothing;
156       char *new_name = NULL;
157 
158       if (bfd_is_section_compressed (abfd, return_section))
159 	{
160 	  /* Compressed section.  Check if we should decompress.  */
161 	  if ((abfd->flags & BFD_DECOMPRESS))
162 	    action = decompress;
163 	}
164       else if (!bfd_is_section_compressed (abfd, return_section))
165 	{
166 	  /* Normal section.  Check if we should compress.  */
167 	  if ((abfd->flags & BFD_COMPRESS) && return_section->size != 0)
168 	    action = compress;
169 	}
170 
171       switch (action)
172 	{
173 	case nothing:
174 	  break;
175 	case compress:
176 	  if (!bfd_init_section_compress_status (abfd, return_section))
177 	    {
178 	      (*_bfd_error_handler)
179 		(_("%B: unable to initialize compress status for section %s"),
180 		 abfd, name);
181 	      return FALSE;
182 	    }
183 	  if (name[1] != 'z')
184 	    {
185 	      unsigned int len = strlen (name);
186 
187 	      new_name = bfd_alloc (abfd, len + 2);
188 	      if (new_name == NULL)
189 		return FALSE;
190 	      new_name[0] = '.';
191 	      new_name[1] = 'z';
192 	      memcpy (new_name + 2, name + 1, len);
193 	    }
194 	  break;
195 	case decompress:
196 	  if (!bfd_init_section_decompress_status (abfd, return_section))
197 	    {
198 	      (*_bfd_error_handler)
199 		(_("%B: unable to initialize decompress status for section %s"),
200 		 abfd, name);
201 	      return FALSE;
202 	    }
203 	  if (name[1] == 'z')
204 	    {
205 	      unsigned int len = strlen (name);
206 
207 	      new_name = bfd_alloc (abfd, len);
208 	      if (new_name == NULL)
209 		return FALSE;
210 	      new_name[0] = '.';
211 	      memcpy (new_name + 1, name + 2, len - 1);
212 	    }
213 	  break;
214 	}
215       if (new_name != NULL)
216 	bfd_rename_section (abfd, return_section, new_name);
217     }
218 
219   return result;
220 }
221 
222 /* Read in a COFF object and make it into a BFD.  This is used by
223    ECOFF as well.  */
224 const bfd_target *
225 coff_real_object_p (bfd *,
226                     unsigned,
227                     struct internal_filehdr *,
228                     struct internal_aouthdr *);
229 const bfd_target *
230 coff_real_object_p (bfd *abfd,
231 		    unsigned nscns,
232 		    struct internal_filehdr *internal_f,
233 		    struct internal_aouthdr *internal_a)
234 {
235   flagword oflags = abfd->flags;
236   bfd_vma ostart = bfd_get_start_address (abfd);
237   void * tdata;
238   void * tdata_save;
239   bfd_size_type readsize;	/* Length of file_info.  */
240   unsigned int scnhsz;
241   char *external_sections;
242 
243   if (!(internal_f->f_flags & F_RELFLG))
244     abfd->flags |= HAS_RELOC;
245   if ((internal_f->f_flags & F_EXEC))
246     abfd->flags |= EXEC_P;
247   if (!(internal_f->f_flags & F_LNNO))
248     abfd->flags |= HAS_LINENO;
249   if (!(internal_f->f_flags & F_LSYMS))
250     abfd->flags |= HAS_LOCALS;
251 
252   /* FIXME: How can we set D_PAGED correctly?  */
253   if ((internal_f->f_flags & F_EXEC) != 0)
254     abfd->flags |= D_PAGED;
255 
256   bfd_get_symcount (abfd) = internal_f->f_nsyms;
257   if (internal_f->f_nsyms)
258     abfd->flags |= HAS_SYMS;
259 
260   if (internal_a != (struct internal_aouthdr *) NULL)
261     bfd_get_start_address (abfd) = internal_a->entry;
262   else
263     bfd_get_start_address (abfd) = 0;
264 
265   /* Set up the tdata area.  ECOFF uses its own routine, and overrides
266      abfd->flags.  */
267   tdata_save = abfd->tdata.any;
268   tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
269   if (tdata == NULL)
270     goto fail2;
271 
272   scnhsz = bfd_coff_scnhsz (abfd);
273   readsize = (bfd_size_type) nscns * scnhsz;
274   external_sections = (char *) bfd_alloc (abfd, readsize);
275   if (!external_sections)
276     goto fail;
277 
278   if (bfd_bread ((void *) external_sections, readsize, abfd) != readsize)
279     goto fail;
280 
281   /* Set the arch/mach *before* swapping in sections; section header swapping
282      may depend on arch/mach info.  */
283   if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f))
284     goto fail;
285 
286   /* Now copy data as required; construct all asections etc.  */
287   if (nscns != 0)
288     {
289       unsigned int i;
290       for (i = 0; i < nscns; i++)
291 	{
292 	  struct internal_scnhdr tmp;
293 	  bfd_coff_swap_scnhdr_in (abfd,
294 				   (void *) (external_sections + i * scnhsz),
295 				   (void *) & tmp);
296 	  if (! make_a_section_from_file (abfd, &tmp, i + 1))
297 	    goto fail;
298 	}
299     }
300 
301   return abfd->xvec;
302 
303  fail:
304   bfd_release (abfd, tdata);
305  fail2:
306   abfd->tdata.any = tdata_save;
307   abfd->flags = oflags;
308   bfd_get_start_address (abfd) = ostart;
309   return (const bfd_target *) NULL;
310 }
311 
312 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
313    not a COFF file.  This is also used by ECOFF.  */
314 
315 const bfd_target *
316 coff_object_p (bfd *abfd)
317 {
318   bfd_size_type filhsz;
319   bfd_size_type aoutsz;
320   unsigned int nscns;
321   void * filehdr;
322   struct internal_filehdr internal_f;
323   struct internal_aouthdr internal_a;
324 
325   /* Figure out how much to read.  */
326   filhsz = bfd_coff_filhsz (abfd);
327   aoutsz = bfd_coff_aoutsz (abfd);
328 
329   filehdr = bfd_alloc (abfd, filhsz);
330   if (filehdr == NULL)
331     return NULL;
332   if (bfd_bread (filehdr, filhsz, abfd) != filhsz)
333     {
334       if (bfd_get_error () != bfd_error_system_call)
335 	bfd_set_error (bfd_error_wrong_format);
336       bfd_release (abfd, filehdr);
337       return NULL;
338     }
339   bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
340   bfd_release (abfd, filehdr);
341 
342   /* The XCOFF format has two sizes for the f_opthdr.  SMALL_AOUTSZ
343      (less than aoutsz) used in object files and AOUTSZ (equal to
344      aoutsz) in executables.  The bfd_coff_swap_aouthdr_in function
345      expects this header to be aoutsz bytes in length, so we use that
346      value in the call to bfd_alloc below.  But we must be careful to
347      only read in f_opthdr bytes in the call to bfd_bread.  We should
348      also attempt to catch corrupt or non-COFF binaries with a strange
349      value for f_opthdr.  */
350   if (! bfd_coff_bad_format_hook (abfd, &internal_f)
351       || internal_f.f_opthdr > aoutsz)
352     {
353       bfd_set_error (bfd_error_wrong_format);
354       return NULL;
355     }
356   nscns = internal_f.f_nscns;
357 
358   if (internal_f.f_opthdr)
359     {
360       void * opthdr;
361 
362       opthdr = bfd_alloc (abfd, aoutsz);
363       if (opthdr == NULL)
364 	return NULL;
365       if (bfd_bread (opthdr, (bfd_size_type) internal_f.f_opthdr, abfd)
366 	  != internal_f.f_opthdr)
367 	{
368 	  bfd_release (abfd, opthdr);
369 	  return NULL;
370 	}
371       bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a);
372       bfd_release (abfd, opthdr);
373     }
374 
375   return coff_real_object_p (abfd, nscns, &internal_f,
376 			     (internal_f.f_opthdr != 0
377 			      ? &internal_a
378 			      : (struct internal_aouthdr *) NULL));
379 }
380 
381 /* Get the BFD section from a COFF symbol section number.  */
382 
383 asection *
384 coff_section_from_bfd_index (bfd *abfd, int section_index)
385 {
386   struct bfd_section *answer = abfd->sections;
387 
388   if (section_index == N_ABS)
389     return bfd_abs_section_ptr;
390   if (section_index == N_UNDEF)
391     return bfd_und_section_ptr;
392   if (section_index == N_DEBUG)
393     return bfd_abs_section_ptr;
394 
395   while (answer)
396     {
397       if (answer->target_index == section_index)
398 	return answer;
399       answer = answer->next;
400     }
401 
402   /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
403      has a bad symbol table in biglitpow.o.  */
404   return bfd_und_section_ptr;
405 }
406 
407 /* Get the upper bound of a COFF symbol table.  */
408 
409 long
410 coff_get_symtab_upper_bound (bfd *abfd)
411 {
412   if (!bfd_coff_slurp_symbol_table (abfd))
413     return -1;
414 
415   return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
416 }
417 
418 /* Canonicalize a COFF symbol table.  */
419 
420 long
421 coff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
422 {
423   unsigned int counter;
424   coff_symbol_type *symbase;
425   coff_symbol_type **location = (coff_symbol_type **) alocation;
426 
427   if (!bfd_coff_slurp_symbol_table (abfd))
428     return -1;
429 
430   symbase = obj_symbols (abfd);
431   counter = bfd_get_symcount (abfd);
432   while (counter-- > 0)
433     *location++ = symbase++;
434 
435   *location = NULL;
436 
437   return bfd_get_symcount (abfd);
438 }
439 
440 /* Get the name of a symbol.  The caller must pass in a buffer of size
441    >= SYMNMLEN + 1.  */
442 
443 const char *
444 _bfd_coff_internal_syment_name (bfd *abfd,
445 				const struct internal_syment *sym,
446 				char *buf)
447 {
448   /* FIXME: It's not clear this will work correctly if sizeof
449      (_n_zeroes) != 4.  */
450   if (sym->_n._n_n._n_zeroes != 0
451       || sym->_n._n_n._n_offset == 0)
452     {
453       memcpy (buf, sym->_n._n_name, SYMNMLEN);
454       buf[SYMNMLEN] = '\0';
455       return buf;
456     }
457   else
458     {
459       const char *strings;
460 
461       BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
462       strings = obj_coff_strings (abfd);
463       if (strings == NULL)
464 	{
465 	  strings = _bfd_coff_read_string_table (abfd);
466 	  if (strings == NULL)
467 	    return NULL;
468 	}
469       return strings + sym->_n._n_n._n_offset;
470     }
471 }
472 
473 /* Read in and swap the relocs.  This returns a buffer holding the
474    relocs for section SEC in file ABFD.  If CACHE is TRUE and
475    INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
476    the function is called again.  If EXTERNAL_RELOCS is not NULL, it
477    is a buffer large enough to hold the unswapped relocs.  If
478    INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
479    the swapped relocs.  If REQUIRE_INTERNAL is TRUE, then the return
480    value must be INTERNAL_RELOCS.  The function returns NULL on error.  */
481 
482 struct internal_reloc *
483 _bfd_coff_read_internal_relocs (bfd *abfd,
484 				asection *sec,
485 				bfd_boolean cache,
486 				bfd_byte *external_relocs,
487 				bfd_boolean require_internal,
488 				struct internal_reloc *internal_relocs)
489 {
490   bfd_size_type relsz;
491   bfd_byte *free_external = NULL;
492   struct internal_reloc *free_internal = NULL;
493   bfd_byte *erel;
494   bfd_byte *erel_end;
495   struct internal_reloc *irel;
496   bfd_size_type amt;
497 
498   if (sec->reloc_count == 0)
499     return internal_relocs;	/* Nothing to do.  */
500 
501   if (coff_section_data (abfd, sec) != NULL
502       && coff_section_data (abfd, sec)->relocs != NULL)
503     {
504       if (! require_internal)
505 	return coff_section_data (abfd, sec)->relocs;
506       memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
507 	      sec->reloc_count * sizeof (struct internal_reloc));
508       return internal_relocs;
509     }
510 
511   relsz = bfd_coff_relsz (abfd);
512 
513   amt = sec->reloc_count * relsz;
514   if (external_relocs == NULL)
515     {
516       free_external = (bfd_byte *) bfd_malloc (amt);
517       if (free_external == NULL)
518 	goto error_return;
519       external_relocs = free_external;
520     }
521 
522   if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
523       || bfd_bread (external_relocs, amt, abfd) != amt)
524     goto error_return;
525 
526   if (internal_relocs == NULL)
527     {
528       amt = sec->reloc_count;
529       amt *= sizeof (struct internal_reloc);
530       free_internal = (struct internal_reloc *) bfd_malloc (amt);
531       if (free_internal == NULL)
532 	goto error_return;
533       internal_relocs = free_internal;
534     }
535 
536   /* Swap in the relocs.  */
537   erel = external_relocs;
538   erel_end = erel + relsz * sec->reloc_count;
539   irel = internal_relocs;
540   for (; erel < erel_end; erel += relsz, irel++)
541     bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel);
542 
543   if (free_external != NULL)
544     {
545       free (free_external);
546       free_external = NULL;
547     }
548 
549   if (cache && free_internal != NULL)
550     {
551       if (coff_section_data (abfd, sec) == NULL)
552 	{
553 	  amt = sizeof (struct coff_section_tdata);
554 	  sec->used_by_bfd = bfd_zalloc (abfd, amt);
555 	  if (sec->used_by_bfd == NULL)
556 	    goto error_return;
557 	  coff_section_data (abfd, sec)->contents = NULL;
558 	}
559       coff_section_data (abfd, sec)->relocs = free_internal;
560     }
561 
562   return internal_relocs;
563 
564  error_return:
565   if (free_external != NULL)
566     free (free_external);
567   if (free_internal != NULL)
568     free (free_internal);
569   return NULL;
570 }
571 
572 /* Set lineno_count for the output sections of a COFF file.  */
573 
574 int
575 coff_count_linenumbers (bfd *abfd)
576 {
577   unsigned int limit = bfd_get_symcount (abfd);
578   unsigned int i;
579   int total = 0;
580   asymbol **p;
581   asection *s;
582 
583   if (limit == 0)
584     {
585       /* This may be from the backend linker, in which case the
586          lineno_count in the sections is correct.  */
587       for (s = abfd->sections; s != NULL; s = s->next)
588 	total += s->lineno_count;
589       return total;
590     }
591 
592   for (s = abfd->sections; s != NULL; s = s->next)
593     BFD_ASSERT (s->lineno_count == 0);
594 
595   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
596     {
597       asymbol *q_maybe = *p;
598 
599       if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
600 	{
601 	  coff_symbol_type *q = coffsymbol (q_maybe);
602 
603 	  /* The AIX 4.1 compiler can sometimes generate line numbers
604              attached to debugging symbols.  We try to simply ignore
605              those here.  */
606 	  if (q->lineno != NULL
607 	      && q->symbol.section->owner != NULL)
608 	    {
609 	      /* This symbol has line numbers.  Increment the owning
610 	         section's linenumber count.  */
611 	      alent *l = q->lineno;
612 
613 	      do
614 		{
615 		  asection * sec = q->symbol.section->output_section;
616 
617 		  /* Do not try to update fields in read-only sections.  */
618 		  if (! bfd_is_const_section (sec))
619 		    sec->lineno_count ++;
620 
621 		  ++total;
622 		  ++l;
623 		}
624 	      while (l->line_number != 0);
625 	    }
626 	}
627     }
628 
629   return total;
630 }
631 
632 /* Takes a bfd and a symbol, returns a pointer to the coff specific
633    area of the symbol if there is one.  */
634 
635 coff_symbol_type *
636 coff_symbol_from (bfd *ignore_abfd ATTRIBUTE_UNUSED,
637 		  asymbol *symbol)
638 {
639   if (!bfd_family_coff (bfd_asymbol_bfd (symbol)))
640     return (coff_symbol_type *) NULL;
641 
642   if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
643     return (coff_symbol_type *) NULL;
644 
645   return (coff_symbol_type *) symbol;
646 }
647 
648 static void
649 fixup_symbol_value (bfd *abfd,
650 		    coff_symbol_type *coff_symbol_ptr,
651 		    struct internal_syment *syment)
652 {
653   /* Normalize the symbol flags.  */
654   if (coff_symbol_ptr->symbol.section
655       && bfd_is_com_section (coff_symbol_ptr->symbol.section))
656     {
657       /* A common symbol is undefined with a value.  */
658       syment->n_scnum = N_UNDEF;
659       syment->n_value = coff_symbol_ptr->symbol.value;
660     }
661   else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
662 	   && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
663     {
664       syment->n_value = coff_symbol_ptr->symbol.value;
665     }
666   else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
667     {
668       syment->n_scnum = N_UNDEF;
669       syment->n_value = 0;
670     }
671   /* FIXME: Do we need to handle the absolute section here?  */
672   else
673     {
674       if (coff_symbol_ptr->symbol.section)
675 	{
676 	  syment->n_scnum =
677 	    coff_symbol_ptr->symbol.section->output_section->target_index;
678 
679 	  syment->n_value = (coff_symbol_ptr->symbol.value
680 			     + coff_symbol_ptr->symbol.section->output_offset);
681 	  if (! obj_pe (abfd))
682             {
683               syment->n_value += (syment->n_sclass == C_STATLAB)
684                 ? coff_symbol_ptr->symbol.section->output_section->lma
685                 : coff_symbol_ptr->symbol.section->output_section->vma;
686             }
687 	}
688       else
689 	{
690 	  BFD_ASSERT (0);
691 	  /* This can happen, but I don't know why yet (steve@cygnus.com) */
692 	  syment->n_scnum = N_ABS;
693 	  syment->n_value = coff_symbol_ptr->symbol.value;
694 	}
695     }
696 }
697 
698 /* Run through all the symbols in the symbol table and work out what
699    their indexes into the symbol table will be when output.
700 
701    Coff requires that each C_FILE symbol points to the next one in the
702    chain, and that the last one points to the first external symbol. We
703    do that here too.  */
704 
705 bfd_boolean
706 coff_renumber_symbols (bfd *bfd_ptr, int *first_undef)
707 {
708   unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
709   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
710   unsigned int native_index = 0;
711   struct internal_syment *last_file = NULL;
712   unsigned int symbol_index;
713 
714   /* COFF demands that undefined symbols come after all other symbols.
715      Since we don't need to impose this extra knowledge on all our
716      client programs, deal with that here.  Sort the symbol table;
717      just move the undefined symbols to the end, leaving the rest
718      alone.  The O'Reilly book says that defined global symbols come
719      at the end before the undefined symbols, so we do that here as
720      well.  */
721   /* @@ Do we have some condition we could test for, so we don't always
722      have to do this?  I don't think relocatability is quite right, but
723      I'm not certain.  [raeburn:19920508.1711EST]  */
724   {
725     asymbol **newsyms;
726     unsigned int i;
727     bfd_size_type amt;
728 
729     amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1);
730     newsyms = (asymbol **) bfd_alloc (bfd_ptr, amt);
731     if (!newsyms)
732       return FALSE;
733     bfd_ptr->outsymbols = newsyms;
734     for (i = 0; i < symbol_count; i++)
735       if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
736 	  || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
737 	      && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
738 	      && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
739 		  || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
740 		      == 0))))
741 	*newsyms++ = symbol_ptr_ptr[i];
742 
743     for (i = 0; i < symbol_count; i++)
744       if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
745 	  && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
746 	  && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
747 	      || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
748 		  && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
749 		      != 0))))
750 	*newsyms++ = symbol_ptr_ptr[i];
751 
752     *first_undef = newsyms - bfd_ptr->outsymbols;
753 
754     for (i = 0; i < symbol_count; i++)
755       if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
756 	  && bfd_is_und_section (symbol_ptr_ptr[i]->section))
757 	*newsyms++ = symbol_ptr_ptr[i];
758     *newsyms = (asymbol *) NULL;
759     symbol_ptr_ptr = bfd_ptr->outsymbols;
760   }
761 
762   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
763     {
764       coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
765       symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
766       if (coff_symbol_ptr && coff_symbol_ptr->native)
767 	{
768 	  combined_entry_type *s = coff_symbol_ptr->native;
769 	  int i;
770 
771 	  if (s->u.syment.n_sclass == C_FILE)
772 	    {
773 	      if (last_file != NULL)
774 		last_file->n_value = native_index;
775 	      last_file = &(s->u.syment);
776 	    }
777 	  else
778 	    /* Modify the symbol values according to their section and
779 	       type.  */
780 	    fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment));
781 
782 	  for (i = 0; i < s->u.syment.n_numaux + 1; i++)
783 	    s[i].offset = native_index++;
784 	}
785       else
786 	native_index++;
787     }
788 
789   obj_conv_table_size (bfd_ptr) = native_index;
790 
791   return TRUE;
792 }
793 
794 /* Run thorough the symbol table again, and fix it so that all
795    pointers to entries are changed to the entries' index in the output
796    symbol table.  */
797 
798 void
799 coff_mangle_symbols (bfd *bfd_ptr)
800 {
801   unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
802   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
803   unsigned int symbol_index;
804 
805   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
806     {
807       coff_symbol_type *coff_symbol_ptr =
808       coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
809 
810       if (coff_symbol_ptr && coff_symbol_ptr->native)
811 	{
812 	  int i;
813 	  combined_entry_type *s = coff_symbol_ptr->native;
814 
815 	  if (s->fix_value)
816 	    {
817 	      /* FIXME: We should use a union here.  */
818 	      s->u.syment.n_value =
819 		(bfd_hostptr_t) ((combined_entry_type *)
820 			  ((bfd_hostptr_t) s->u.syment.n_value))->offset;
821 	      s->fix_value = 0;
822 	    }
823 	  if (s->fix_line)
824 	    {
825 	      /* The value is the offset into the line number entries
826                  for the symbol's section.  On output, the symbol's
827                  section should be N_DEBUG.  */
828 	      s->u.syment.n_value =
829 		(coff_symbol_ptr->symbol.section->output_section->line_filepos
830 		 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
831 	      coff_symbol_ptr->symbol.section =
832 		coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
833 	      BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
834 	    }
835 	  for (i = 0; i < s->u.syment.n_numaux; i++)
836 	    {
837 	      combined_entry_type *a = s + i + 1;
838 	      if (a->fix_tag)
839 		{
840 		  a->u.auxent.x_sym.x_tagndx.l =
841 		    a->u.auxent.x_sym.x_tagndx.p->offset;
842 		  a->fix_tag = 0;
843 		}
844 	      if (a->fix_end)
845 		{
846 		  a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
847 		    a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
848 		  a->fix_end = 0;
849 		}
850 	      if (a->fix_scnlen)
851 		{
852 		  a->u.auxent.x_csect.x_scnlen.l =
853 		    a->u.auxent.x_csect.x_scnlen.p->offset;
854 		  a->fix_scnlen = 0;
855 		}
856 	    }
857 	}
858     }
859 }
860 
861 static void
862 coff_fix_symbol_name (bfd *abfd,
863 		      asymbol *symbol,
864 		      combined_entry_type *native,
865 		      bfd_size_type *string_size_p,
866 		      asection **debug_string_section_p,
867 		      bfd_size_type *debug_string_size_p)
868 {
869   unsigned int name_length;
870   union internal_auxent *auxent;
871   char *name = (char *) (symbol->name);
872 
873   if (name == NULL)
874     {
875       /* COFF symbols always have names, so we'll make one up.  */
876       symbol->name = "strange";
877       name = (char *) symbol->name;
878     }
879   name_length = strlen (name);
880 
881   if (native->u.syment.n_sclass == C_FILE
882       && native->u.syment.n_numaux > 0)
883     {
884       unsigned int filnmlen;
885 
886       if (bfd_coff_force_symnames_in_strings (abfd))
887 	{
888           native->u.syment._n._n_n._n_offset =
889 	      (*string_size_p + STRING_SIZE_SIZE);
890 	  native->u.syment._n._n_n._n_zeroes = 0;
891 	  *string_size_p += 6;  /* strlen(".file") + 1 */
892 	}
893       else
894   	strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
895 
896       auxent = &(native + 1)->u.auxent;
897 
898       filnmlen = bfd_coff_filnmlen (abfd);
899 
900       if (bfd_coff_long_filenames (abfd))
901 	{
902 	  if (name_length <= filnmlen)
903 	    strncpy (auxent->x_file.x_fname, name, filnmlen);
904 	  else
905 	    {
906 	      auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
907 	      auxent->x_file.x_n.x_zeroes = 0;
908 	      *string_size_p += name_length + 1;
909 	    }
910 	}
911       else
912 	{
913 	  strncpy (auxent->x_file.x_fname, name, filnmlen);
914 	  if (name_length > filnmlen)
915 	    name[filnmlen] = '\0';
916 	}
917     }
918   else
919     {
920       if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
921 	/* This name will fit into the symbol neatly.  */
922 	strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
923 
924       else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
925 	{
926 	  native->u.syment._n._n_n._n_offset = (*string_size_p
927 						+ STRING_SIZE_SIZE);
928 	  native->u.syment._n._n_n._n_zeroes = 0;
929 	  *string_size_p += name_length + 1;
930 	}
931       else
932 	{
933 	  file_ptr filepos;
934 	  bfd_byte buf[4];
935 	  int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
936 
937 	  /* This name should be written into the .debug section.  For
938 	     some reason each name is preceded by a two byte length
939 	     and also followed by a null byte.  FIXME: We assume that
940 	     the .debug section has already been created, and that it
941 	     is large enough.  */
942 	  if (*debug_string_section_p == (asection *) NULL)
943 	    *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
944 	  filepos = bfd_tell (abfd);
945 	  if (prefix_len == 4)
946 	    bfd_put_32 (abfd, (bfd_vma) (name_length + 1), buf);
947 	  else
948 	    bfd_put_16 (abfd, (bfd_vma) (name_length + 1), buf);
949 
950 	  if (!bfd_set_section_contents (abfd,
951 					 *debug_string_section_p,
952 					 (void *) buf,
953 					 (file_ptr) *debug_string_size_p,
954 					 (bfd_size_type) prefix_len)
955 	      || !bfd_set_section_contents (abfd,
956 					    *debug_string_section_p,
957 					    (void *) symbol->name,
958 					    (file_ptr) (*debug_string_size_p
959 							+ prefix_len),
960 					    (bfd_size_type) name_length + 1))
961 	    abort ();
962 	  if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
963 	    abort ();
964 	  native->u.syment._n._n_n._n_offset =
965 	      *debug_string_size_p + prefix_len;
966 	  native->u.syment._n._n_n._n_zeroes = 0;
967 	  *debug_string_size_p += name_length + 1 + prefix_len;
968 	}
969     }
970 }
971 
972 /* We need to keep track of the symbol index so that when we write out
973    the relocs we can get the index for a symbol.  This method is a
974    hack.  FIXME.  */
975 
976 #define set_index(symbol, idx)	((symbol)->udata.i = (idx))
977 
978 /* Write a symbol out to a COFF file.  */
979 
980 static bfd_boolean
981 coff_write_symbol (bfd *abfd,
982 		   asymbol *symbol,
983 		   combined_entry_type *native,
984 		   bfd_vma *written,
985 		   bfd_size_type *string_size_p,
986 		   asection **debug_string_section_p,
987 		   bfd_size_type *debug_string_size_p)
988 {
989   unsigned int numaux = native->u.syment.n_numaux;
990   int type = native->u.syment.n_type;
991   int n_sclass = (int) native->u.syment.n_sclass;
992   asection *output_section = symbol->section->output_section
993 			       ? symbol->section->output_section
994 			       : symbol->section;
995   void * buf;
996   bfd_size_type symesz;
997 
998   if (native->u.syment.n_sclass == C_FILE)
999     symbol->flags |= BSF_DEBUGGING;
1000 
1001   if (symbol->flags & BSF_DEBUGGING
1002       && bfd_is_abs_section (symbol->section))
1003     native->u.syment.n_scnum = N_DEBUG;
1004 
1005   else if (bfd_is_abs_section (symbol->section))
1006     native->u.syment.n_scnum = N_ABS;
1007 
1008   else if (bfd_is_und_section (symbol->section))
1009     native->u.syment.n_scnum = N_UNDEF;
1010 
1011   else
1012     native->u.syment.n_scnum =
1013       output_section->target_index;
1014 
1015   coff_fix_symbol_name (abfd, symbol, native, string_size_p,
1016 			debug_string_section_p, debug_string_size_p);
1017 
1018   symesz = bfd_coff_symesz (abfd);
1019   buf = bfd_alloc (abfd, symesz);
1020   if (!buf)
1021     return FALSE;
1022   bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
1023   if (bfd_bwrite (buf, symesz, abfd) != symesz)
1024     return FALSE;
1025   bfd_release (abfd, buf);
1026 
1027   if (native->u.syment.n_numaux > 0)
1028     {
1029       bfd_size_type auxesz;
1030       unsigned int j;
1031 
1032       auxesz = bfd_coff_auxesz (abfd);
1033       buf = bfd_alloc (abfd, auxesz);
1034       if (!buf)
1035 	return FALSE;
1036       for (j = 0; j < native->u.syment.n_numaux; j++)
1037 	{
1038 	  bfd_coff_swap_aux_out (abfd,
1039 				 &((native + j + 1)->u.auxent),
1040 				 type, n_sclass, (int) j,
1041 				 native->u.syment.n_numaux,
1042 				 buf);
1043 	  if (bfd_bwrite (buf, auxesz, abfd) != auxesz)
1044 	    return FALSE;
1045 	}
1046       bfd_release (abfd, buf);
1047     }
1048 
1049   /* Store the index for use when we write out the relocs.  */
1050   set_index (symbol, *written);
1051 
1052   *written += numaux + 1;
1053   return TRUE;
1054 }
1055 
1056 /* Write out a symbol to a COFF file that does not come from a COFF
1057    file originally.  This symbol may have been created by the linker,
1058    or we may be linking a non COFF file to a COFF file.  */
1059 
1060 bfd_boolean
1061 coff_write_alien_symbol (bfd *abfd,
1062 			 asymbol *symbol,
1063 			 struct internal_syment *isym,
1064 			 bfd_vma *written,
1065 			 bfd_size_type *string_size_p,
1066 			 asection **debug_string_section_p,
1067 			 bfd_size_type *debug_string_size_p)
1068 {
1069   combined_entry_type *native;
1070   combined_entry_type dummy[2];
1071   asection *output_section = symbol->section->output_section
1072 			       ? symbol->section->output_section
1073 			       : symbol->section;
1074   struct bfd_link_info *link_info = coff_data (abfd)->link_info;
1075   bfd_boolean ret;
1076 
1077   if ((!link_info || link_info->strip_discarded)
1078       && !bfd_is_abs_section (symbol->section)
1079       && symbol->section->output_section == bfd_abs_section_ptr)
1080     {
1081       symbol->name = "";
1082       if (isym != NULL)
1083         memset (isym, 0, sizeof(*isym));
1084       return TRUE;
1085     }
1086   native = dummy;
1087   native->u.syment.n_type = T_NULL;
1088   native->u.syment.n_flags = 0;
1089   native->u.syment.n_numaux = 0;
1090   if (bfd_is_und_section (symbol->section))
1091     {
1092       native->u.syment.n_scnum = N_UNDEF;
1093       native->u.syment.n_value = symbol->value;
1094     }
1095   else if (bfd_is_com_section (symbol->section))
1096     {
1097       native->u.syment.n_scnum = N_UNDEF;
1098       native->u.syment.n_value = symbol->value;
1099     }
1100   else if (symbol->flags & BSF_FILE)
1101     {
1102       native->u.syment.n_scnum = N_DEBUG;
1103       native->u.syment.n_numaux = 1;
1104     }
1105   else if (symbol->flags & BSF_DEBUGGING)
1106     {
1107       /* There isn't much point to writing out a debugging symbol
1108          unless we are prepared to convert it into COFF debugging
1109          format.  So, we just ignore them.  We must clobber the symbol
1110          name to keep it from being put in the string table.  */
1111       symbol->name = "";
1112       if (isym != NULL)
1113         memset (isym, 0, sizeof(*isym));
1114       return TRUE;
1115     }
1116   else
1117     {
1118       native->u.syment.n_scnum = output_section->target_index;
1119       native->u.syment.n_value = (symbol->value
1120 				  + symbol->section->output_offset);
1121       if (! obj_pe (abfd))
1122 	native->u.syment.n_value += output_section->vma;
1123 
1124       /* Copy the any flags from the file header into the symbol.
1125          FIXME: Why?  */
1126       {
1127 	coff_symbol_type *c = coff_symbol_from (abfd, symbol);
1128 	if (c != (coff_symbol_type *) NULL)
1129 	  native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
1130       }
1131     }
1132 
1133   native->u.syment.n_type = 0;
1134   if (symbol->flags & BSF_FILE)
1135     native->u.syment.n_sclass = C_FILE;
1136   else if (symbol->flags & BSF_LOCAL)
1137     native->u.syment.n_sclass = C_STAT;
1138   else if (symbol->flags & BSF_WEAK)
1139     native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1140   else
1141     native->u.syment.n_sclass = C_EXT;
1142 
1143   ret = coff_write_symbol (abfd, symbol, native, written, string_size_p,
1144 			   debug_string_section_p, debug_string_size_p);
1145   if (isym != NULL)
1146     *isym = native->u.syment;
1147   return ret;
1148 }
1149 
1150 /* Write a native symbol to a COFF file.  */
1151 
1152 static bfd_boolean
1153 coff_write_native_symbol (bfd *abfd,
1154 			  coff_symbol_type *symbol,
1155 			  bfd_vma *written,
1156 			  bfd_size_type *string_size_p,
1157 			  asection **debug_string_section_p,
1158 			  bfd_size_type *debug_string_size_p)
1159 {
1160   combined_entry_type *native = symbol->native;
1161   alent *lineno = symbol->lineno;
1162   struct bfd_link_info *link_info = coff_data (abfd)->link_info;
1163 
1164   if ((!link_info || link_info->strip_discarded)
1165       && !bfd_is_abs_section (symbol->symbol.section)
1166       && symbol->symbol.section->output_section == bfd_abs_section_ptr)
1167     {
1168       symbol->symbol.name = "";
1169       return TRUE;
1170     }
1171 
1172   /* If this symbol has an associated line number, we must store the
1173      symbol index in the line number field.  We also tag the auxent to
1174      point to the right place in the lineno table.  */
1175   if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
1176     {
1177       unsigned int count = 0;
1178 
1179       lineno[count].u.offset = *written;
1180       if (native->u.syment.n_numaux)
1181 	{
1182 	  union internal_auxent *a = &((native + 1)->u.auxent);
1183 
1184 	  a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1185 	    symbol->symbol.section->output_section->moving_line_filepos;
1186 	}
1187 
1188       /* Count and relocate all other linenumbers.  */
1189       count++;
1190       while (lineno[count].line_number != 0)
1191 	{
1192 	  lineno[count].u.offset +=
1193 	    (symbol->symbol.section->output_section->vma
1194 	     + symbol->symbol.section->output_offset);
1195 	  count++;
1196 	}
1197       symbol->done_lineno = TRUE;
1198 
1199       if (! bfd_is_const_section (symbol->symbol.section->output_section))
1200 	symbol->symbol.section->output_section->moving_line_filepos +=
1201 	  count * bfd_coff_linesz (abfd);
1202     }
1203 
1204   return coff_write_symbol (abfd, &(symbol->symbol), native, written,
1205 			    string_size_p, debug_string_section_p,
1206 			    debug_string_size_p);
1207 }
1208 
1209 static void
1210 null_error_handler (const char * fmt ATTRIBUTE_UNUSED, ...)
1211 {
1212 }
1213 
1214 /* Write out the COFF symbols.  */
1215 
1216 bfd_boolean
1217 coff_write_symbols (bfd *abfd)
1218 {
1219   bfd_size_type string_size;
1220   asection *debug_string_section;
1221   bfd_size_type debug_string_size;
1222   unsigned int i;
1223   unsigned int limit = bfd_get_symcount (abfd);
1224   bfd_vma written = 0;
1225   asymbol **p;
1226 
1227   string_size = 0;
1228   debug_string_section = NULL;
1229   debug_string_size = 0;
1230 
1231   /* If this target supports long section names, they must be put into
1232      the string table.  This is supported by PE.  This code must
1233      handle section names just as they are handled in
1234      coff_write_object_contents.  */
1235   if (bfd_coff_long_section_names (abfd))
1236     {
1237       asection *o;
1238 
1239       for (o = abfd->sections; o != NULL; o = o->next)
1240 	{
1241 	  size_t len;
1242 
1243 	  len = strlen (o->name);
1244 	  if (len > SCNNMLEN)
1245 	    string_size += len + 1;
1246 	}
1247     }
1248 
1249   /* Seek to the right place.  */
1250   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
1251     return FALSE;
1252 
1253   /* Output all the symbols we have.  */
1254   written = 0;
1255   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1256     {
1257       asymbol *symbol = *p;
1258       coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
1259 
1260       if (c_symbol == (coff_symbol_type *) NULL
1261 	  || c_symbol->native == (combined_entry_type *) NULL)
1262 	{
1263 	  if (!coff_write_alien_symbol (abfd, symbol, NULL, &written,
1264 					&string_size, &debug_string_section,
1265 					&debug_string_size))
1266 	    return FALSE;
1267 	}
1268       else
1269 	{
1270 	  if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
1271 	    {
1272 	      bfd_error_handler_type current_error_handler;
1273 	      enum coff_symbol_classification sym_class;
1274 	      unsigned char *n_sclass;
1275 
1276 	      /* Suppress error reporting by bfd_coff_classify_symbol.
1277 		 Error messages can be generated when we are processing a local
1278 		 symbol which has no associated section and we do not have to
1279 		 worry about this, all we need to know is that it is local.  */
1280 	      current_error_handler = bfd_set_error_handler (null_error_handler);
1281 	      sym_class = bfd_coff_classify_symbol (abfd,
1282                                                    &c_symbol->native->u.syment);
1283 	      (void) bfd_set_error_handler (current_error_handler);
1284 
1285 	      n_sclass = &c_symbol->native->u.syment.n_sclass;
1286 
1287 	      /* If the symbol class has been changed (eg objcopy/ld script/etc)
1288 		 we cannot retain the existing sclass from the original symbol.
1289 		 Weak symbols only have one valid sclass, so just set it always.
1290 		 If it is not local class and should be, set it C_STAT.
1291 		 If it is global and not classified as global, or if it is
1292 		 weak (which is also classified as global), set it C_EXT.  */
1293 
1294 	      if (symbol->flags & BSF_WEAK)
1295 		*n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1296 	      else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL)
1297 		*n_sclass = C_STAT;
1298 	      else if (symbol->flags & BSF_GLOBAL
1299 		       && (sym_class != COFF_SYMBOL_GLOBAL
1300 #ifdef COFF_WITH_PE
1301 			   || *n_sclass == C_NT_WEAK
1302 #endif
1303 			   || *n_sclass == C_WEAKEXT))
1304 		c_symbol->native->u.syment.n_sclass = C_EXT;
1305 	    }
1306 
1307 	  if (!coff_write_native_symbol (abfd, c_symbol, &written,
1308 					 &string_size, &debug_string_section,
1309 					 &debug_string_size))
1310 	    return FALSE;
1311 	}
1312     }
1313 
1314   obj_raw_syment_count (abfd) = written;
1315 
1316   /* Now write out strings.  */
1317   if (string_size != 0)
1318     {
1319       unsigned int size = string_size + STRING_SIZE_SIZE;
1320       bfd_byte buffer[STRING_SIZE_SIZE];
1321 
1322 #if STRING_SIZE_SIZE == 4
1323       H_PUT_32 (abfd, size, buffer);
1324 #else
1325  #error Change H_PUT_32
1326 #endif
1327       if (bfd_bwrite ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd)
1328 	  != sizeof (buffer))
1329 	return FALSE;
1330 
1331       /* Handle long section names.  This code must handle section
1332 	 names just as they are handled in coff_write_object_contents.  */
1333       if (bfd_coff_long_section_names (abfd))
1334 	{
1335 	  asection *o;
1336 
1337 	  for (o = abfd->sections; o != NULL; o = o->next)
1338 	    {
1339 	      size_t len;
1340 
1341 	      len = strlen (o->name);
1342 	      if (len > SCNNMLEN)
1343 		{
1344 		  if (bfd_bwrite (o->name, (bfd_size_type) (len + 1), abfd)
1345 		      != len + 1)
1346 		    return FALSE;
1347 		}
1348 	    }
1349 	}
1350 
1351       for (p = abfd->outsymbols, i = 0;
1352 	   i < limit;
1353 	   i++, p++)
1354 	{
1355 	  asymbol *q = *p;
1356 	  size_t name_length = strlen (q->name);
1357 	  coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
1358 	  size_t maxlen;
1359 
1360 	  /* Figure out whether the symbol name should go in the string
1361 	     table.  Symbol names that are short enough are stored
1362 	     directly in the syment structure.  File names permit a
1363 	     different, longer, length in the syment structure.  On
1364 	     XCOFF, some symbol names are stored in the .debug section
1365 	     rather than in the string table.  */
1366 
1367 	  if (c_symbol == NULL
1368 	      || c_symbol->native == NULL)
1369 	    /* This is not a COFF symbol, so it certainly is not a
1370 	       file name, nor does it go in the .debug section.  */
1371 	    maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1372 
1373 	  else if (bfd_coff_symname_in_debug (abfd,
1374 					      &c_symbol->native->u.syment))
1375 	    /* This symbol name is in the XCOFF .debug section.
1376 	       Don't write it into the string table.  */
1377 	    maxlen = name_length;
1378 
1379 	  else if (c_symbol->native->u.syment.n_sclass == C_FILE
1380 		   && c_symbol->native->u.syment.n_numaux > 0)
1381 	    {
1382 	      if (bfd_coff_force_symnames_in_strings (abfd))
1383 		{
1384 		  if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
1385 		    return FALSE;
1386 		}
1387 	      maxlen = bfd_coff_filnmlen (abfd);
1388 	    }
1389 	  else
1390 	    maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1391 
1392 	  if (name_length > maxlen)
1393 	    {
1394 	      if (bfd_bwrite ((void *) (q->name), (bfd_size_type) name_length + 1,
1395 			     abfd) != name_length + 1)
1396 		return FALSE;
1397 	    }
1398 	}
1399     }
1400   else
1401     {
1402       /* We would normally not write anything here, but we'll write
1403          out 4 so that any stupid coff reader which tries to read the
1404          string table even when there isn't one won't croak.  */
1405       unsigned int size = STRING_SIZE_SIZE;
1406       bfd_byte buffer[STRING_SIZE_SIZE];
1407 
1408 #if STRING_SIZE_SIZE == 4
1409       H_PUT_32 (abfd, size, buffer);
1410 #else
1411  #error Change H_PUT_32
1412 #endif
1413       if (bfd_bwrite ((void *) buffer, (bfd_size_type) STRING_SIZE_SIZE, abfd)
1414 	  != STRING_SIZE_SIZE)
1415 	return FALSE;
1416     }
1417 
1418   /* Make sure the .debug section was created to be the correct size.
1419      We should create it ourselves on the fly, but we don't because
1420      BFD won't let us write to any section until we know how large all
1421      the sections are.  We could still do it by making another pass
1422      over the symbols.  FIXME.  */
1423   BFD_ASSERT (debug_string_size == 0
1424 	      || (debug_string_section != (asection *) NULL
1425 		  && (BFD_ALIGN (debug_string_size,
1426 				 1 << debug_string_section->alignment_power)
1427 		      == debug_string_section->size)));
1428 
1429   return TRUE;
1430 }
1431 
1432 bfd_boolean
1433 coff_write_linenumbers (bfd *abfd)
1434 {
1435   asection *s;
1436   bfd_size_type linesz;
1437   void * buff;
1438 
1439   linesz = bfd_coff_linesz (abfd);
1440   buff = bfd_alloc (abfd, linesz);
1441   if (!buff)
1442     return FALSE;
1443   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1444     {
1445       if (s->lineno_count)
1446 	{
1447 	  asymbol **q = abfd->outsymbols;
1448 	  if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
1449 	    return FALSE;
1450 	  /* Find all the linenumbers in this section.  */
1451 	  while (*q)
1452 	    {
1453 	      asymbol *p = *q;
1454 	      if (p->section->output_section == s)
1455 		{
1456 		  alent *l =
1457 		  BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1458 			    (bfd_asymbol_bfd (p), p));
1459 		  if (l)
1460 		    {
1461 		      /* Found a linenumber entry, output.  */
1462 		      struct internal_lineno out;
1463 		      memset ((void *) & out, 0, sizeof (out));
1464 		      out.l_lnno = 0;
1465 		      out.l_addr.l_symndx = l->u.offset;
1466 		      bfd_coff_swap_lineno_out (abfd, &out, buff);
1467 		      if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1468 			  != linesz)
1469 			return FALSE;
1470 		      l++;
1471 		      while (l->line_number)
1472 			{
1473 			  out.l_lnno = l->line_number;
1474 			  out.l_addr.l_symndx = l->u.offset;
1475 			  bfd_coff_swap_lineno_out (abfd, &out, buff);
1476 			  if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1477 			      != linesz)
1478 			    return FALSE;
1479 			  l++;
1480 			}
1481 		    }
1482 		}
1483 	      q++;
1484 	    }
1485 	}
1486     }
1487   bfd_release (abfd, buff);
1488   return TRUE;
1489 }
1490 
1491 alent *
1492 coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
1493 {
1494   return coffsymbol (symbol)->lineno;
1495 }
1496 
1497 /* This function transforms the offsets into the symbol table into
1498    pointers to syments.  */
1499 
1500 static void
1501 coff_pointerize_aux (bfd *abfd,
1502 		     combined_entry_type *table_base,
1503 		     combined_entry_type *symbol,
1504 		     unsigned int indaux,
1505 		     combined_entry_type *auxent)
1506 {
1507   unsigned int type = symbol->u.syment.n_type;
1508   unsigned int n_sclass = symbol->u.syment.n_sclass;
1509 
1510   if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1511     {
1512       if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1513 	  (abfd, table_base, symbol, indaux, auxent))
1514 	return;
1515     }
1516 
1517   /* Don't bother if this is a file or a section.  */
1518   if (n_sclass == C_STAT && type == T_NULL)
1519     return;
1520   if (n_sclass == C_FILE)
1521     return;
1522 
1523   /* Otherwise patch up.  */
1524 #define N_TMASK coff_data  (abfd)->local_n_tmask
1525 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1526 
1527   if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK
1528        || n_sclass == C_FCN)
1529       && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
1530     {
1531       auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1532 	table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1533       auxent->fix_end = 1;
1534     }
1535   /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1536      generate one, so we must be careful to ignore it.  */
1537   if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
1538     {
1539       auxent->u.auxent.x_sym.x_tagndx.p =
1540 	table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1541       auxent->fix_tag = 1;
1542     }
1543 }
1544 
1545 /* Allocate space for the ".debug" section, and read it.
1546    We did not read the debug section until now, because
1547    we didn't want to go to the trouble until someone needed it.  */
1548 
1549 static char *
1550 build_debug_section (bfd *abfd)
1551 {
1552   char *debug_section;
1553   file_ptr position;
1554   bfd_size_type sec_size;
1555 
1556   asection *sect = bfd_get_section_by_name (abfd, ".debug");
1557 
1558   if (!sect)
1559     {
1560       bfd_set_error (bfd_error_no_debug_section);
1561       return NULL;
1562     }
1563 
1564   sec_size = sect->size;
1565   debug_section = (char *) bfd_alloc (abfd, sec_size);
1566   if (debug_section == NULL)
1567     return NULL;
1568 
1569   /* Seek to the beginning of the `.debug' section and read it.
1570      Save the current position first; it is needed by our caller.
1571      Then read debug section and reset the file pointer.  */
1572 
1573   position = bfd_tell (abfd);
1574   if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1575       || bfd_bread (debug_section, sec_size, abfd) != sec_size
1576       || bfd_seek (abfd, position, SEEK_SET) != 0)
1577     return NULL;
1578   return debug_section;
1579 }
1580 
1581 /* Return a pointer to a malloc'd copy of 'name'.  'name' may not be
1582    \0-terminated, but will not exceed 'maxlen' characters.  The copy *will*
1583    be \0-terminated.  */
1584 
1585 static char *
1586 copy_name (bfd *abfd, char *name, size_t maxlen)
1587 {
1588   size_t len;
1589   char *newname;
1590 
1591   for (len = 0; len < maxlen; ++len)
1592     if (name[len] == '\0')
1593       break;
1594 
1595   if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
1596     return NULL;
1597 
1598   strncpy (newname, name, len);
1599   newname[len] = '\0';
1600   return newname;
1601 }
1602 
1603 /* Read in the external symbols.  */
1604 
1605 bfd_boolean
1606 _bfd_coff_get_external_symbols (bfd *abfd)
1607 {
1608   bfd_size_type symesz;
1609   bfd_size_type size;
1610   void * syms;
1611 
1612   if (obj_coff_external_syms (abfd) != NULL)
1613     return TRUE;
1614 
1615   symesz = bfd_coff_symesz (abfd);
1616 
1617   size = obj_raw_syment_count (abfd) * symesz;
1618   if (size == 0)
1619     return TRUE;
1620 
1621   syms = bfd_malloc (size);
1622   if (syms == NULL)
1623     return FALSE;
1624 
1625   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1626       || bfd_bread (syms, size, abfd) != size)
1627     {
1628       if (syms != NULL)
1629 	free (syms);
1630       return FALSE;
1631     }
1632 
1633   obj_coff_external_syms (abfd) = syms;
1634 
1635   return TRUE;
1636 }
1637 
1638 /* Read in the external strings.  The strings are not loaded until
1639    they are needed.  This is because we have no simple way of
1640    detecting a missing string table in an archive.  */
1641 
1642 const char *
1643 _bfd_coff_read_string_table (bfd *abfd)
1644 {
1645   char extstrsize[STRING_SIZE_SIZE];
1646   bfd_size_type strsize;
1647   char *strings;
1648   file_ptr pos;
1649 
1650   if (obj_coff_strings (abfd) != NULL)
1651     return obj_coff_strings (abfd);
1652 
1653   if (obj_sym_filepos (abfd) == 0)
1654     {
1655       bfd_set_error (bfd_error_no_symbols);
1656       return NULL;
1657     }
1658 
1659   pos = obj_sym_filepos (abfd);
1660   pos += obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
1661   if (bfd_seek (abfd, pos, SEEK_SET) != 0)
1662     return NULL;
1663 
1664   if (bfd_bread (extstrsize, (bfd_size_type) sizeof extstrsize, abfd)
1665       != sizeof extstrsize)
1666     {
1667       if (bfd_get_error () != bfd_error_file_truncated)
1668 	return NULL;
1669 
1670       /* There is no string table.  */
1671       strsize = STRING_SIZE_SIZE;
1672     }
1673   else
1674     {
1675 #if STRING_SIZE_SIZE == 4
1676       strsize = H_GET_32 (abfd, extstrsize);
1677 #else
1678  #error Change H_GET_32
1679 #endif
1680     }
1681 
1682   if (strsize < STRING_SIZE_SIZE)
1683     {
1684       (*_bfd_error_handler)
1685 	(_("%B: bad string table size %lu"), abfd, (unsigned long) strsize);
1686       bfd_set_error (bfd_error_bad_value);
1687       return NULL;
1688     }
1689 
1690   strings = (char *) bfd_malloc (strsize);
1691   if (strings == NULL)
1692     return NULL;
1693 
1694   if (bfd_bread (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
1695       != strsize - STRING_SIZE_SIZE)
1696     {
1697       free (strings);
1698       return NULL;
1699     }
1700 
1701   obj_coff_strings (abfd) = strings;
1702 
1703   return strings;
1704 }
1705 
1706 /* Free up the external symbols and strings read from a COFF file.  */
1707 
1708 bfd_boolean
1709 _bfd_coff_free_symbols (bfd *abfd)
1710 {
1711   if (obj_coff_external_syms (abfd) != NULL
1712       && ! obj_coff_keep_syms (abfd))
1713     {
1714       free (obj_coff_external_syms (abfd));
1715       obj_coff_external_syms (abfd) = NULL;
1716     }
1717   if (obj_coff_strings (abfd) != NULL
1718       && ! obj_coff_keep_strings (abfd))
1719     {
1720       free (obj_coff_strings (abfd));
1721       obj_coff_strings (abfd) = NULL;
1722     }
1723   return TRUE;
1724 }
1725 
1726 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1727    knit the symbol names into a normalized form.  By normalized here I
1728    mean that all symbols have an n_offset pointer that points to a null-
1729    terminated string.  */
1730 
1731 combined_entry_type *
1732 coff_get_normalized_symtab (bfd *abfd)
1733 {
1734   combined_entry_type *internal;
1735   combined_entry_type *internal_ptr;
1736   combined_entry_type *symbol_ptr;
1737   combined_entry_type *internal_end;
1738   size_t symesz;
1739   char *raw_src;
1740   char *raw_end;
1741   const char *string_table = NULL;
1742   char *debug_section = NULL;
1743   bfd_size_type size;
1744 
1745   if (obj_raw_syments (abfd) != NULL)
1746     return obj_raw_syments (abfd);
1747 
1748   size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
1749   internal = (combined_entry_type *) bfd_zalloc (abfd, size);
1750   if (internal == NULL && size != 0)
1751     return NULL;
1752   internal_end = internal + obj_raw_syment_count (abfd);
1753 
1754   if (! _bfd_coff_get_external_symbols (abfd))
1755     return NULL;
1756 
1757   raw_src = (char *) obj_coff_external_syms (abfd);
1758 
1759   /* Mark the end of the symbols.  */
1760   symesz = bfd_coff_symesz (abfd);
1761   raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1762 
1763   /* FIXME SOMEDAY.  A string table size of zero is very weird, but
1764      probably possible.  If one shows up, it will probably kill us.  */
1765 
1766   /* Swap all the raw entries.  */
1767   for (internal_ptr = internal;
1768        raw_src < raw_end;
1769        raw_src += symesz, internal_ptr++)
1770     {
1771 
1772       unsigned int i;
1773       bfd_coff_swap_sym_in (abfd, (void *) raw_src,
1774 			    (void *) & internal_ptr->u.syment);
1775       symbol_ptr = internal_ptr;
1776 
1777       for (i = 0;
1778 	   i < symbol_ptr->u.syment.n_numaux;
1779 	   i++)
1780 	{
1781 	  internal_ptr++;
1782 	  raw_src += symesz;
1783 	  bfd_coff_swap_aux_in (abfd, (void *) raw_src,
1784 				symbol_ptr->u.syment.n_type,
1785 				symbol_ptr->u.syment.n_sclass,
1786 				(int) i, symbol_ptr->u.syment.n_numaux,
1787 				&(internal_ptr->u.auxent));
1788 	  coff_pointerize_aux (abfd, internal, symbol_ptr, i,
1789 			       internal_ptr);
1790 	}
1791     }
1792 
1793   /* Free the raw symbols, but not the strings (if we have them).  */
1794   obj_coff_keep_strings (abfd) = TRUE;
1795   if (! _bfd_coff_free_symbols (abfd))
1796     return NULL;
1797 
1798   for (internal_ptr = internal; internal_ptr < internal_end;
1799        internal_ptr++)
1800     {
1801       if (internal_ptr->u.syment.n_sclass == C_FILE
1802 	  && internal_ptr->u.syment.n_numaux > 0)
1803 	{
1804 	  /* Make a file symbol point to the name in the auxent, since
1805 	     the text ".file" is redundant.  */
1806 	  if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0)
1807 	    {
1808 	      /* The filename is a long one, point into the string table.  */
1809 	      if (string_table == NULL)
1810 		{
1811 		  string_table = _bfd_coff_read_string_table (abfd);
1812 		  if (string_table == NULL)
1813 		    return NULL;
1814 		}
1815 
1816 	      internal_ptr->u.syment._n._n_n._n_offset =
1817 		((bfd_hostptr_t)
1818 		 (string_table
1819 		  + (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset));
1820 	    }
1821 	  else
1822 	    {
1823 	      /* Ordinary short filename, put into memory anyway.  The
1824                  Microsoft PE tools sometimes store a filename in
1825                  multiple AUX entries.  */
1826 	      if (internal_ptr->u.syment.n_numaux > 1
1827 		  && coff_data (abfd)->pe)
1828 		internal_ptr->u.syment._n._n_n._n_offset =
1829 		  ((bfd_hostptr_t)
1830 		   copy_name (abfd,
1831 			      (internal_ptr + 1)->u.auxent.x_file.x_fname,
1832 			      internal_ptr->u.syment.n_numaux * symesz));
1833 	      else
1834 		internal_ptr->u.syment._n._n_n._n_offset =
1835 		  ((bfd_hostptr_t)
1836 		   copy_name (abfd,
1837 			      (internal_ptr + 1)->u.auxent.x_file.x_fname,
1838 			      (size_t) bfd_coff_filnmlen (abfd)));
1839 	    }
1840 	}
1841       else
1842 	{
1843 	  if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1844 	    {
1845 	      /* This is a "short" name.  Make it long.  */
1846 	      size_t i;
1847 	      char *newstring;
1848 
1849 	      /* Find the length of this string without walking into memory
1850 	         that isn't ours.  */
1851 	      for (i = 0; i < 8; ++i)
1852 		if (internal_ptr->u.syment._n._n_name[i] == '\0')
1853 		  break;
1854 
1855 	      newstring = (char *) bfd_zalloc (abfd, (bfd_size_type) (i + 1));
1856 	      if (newstring == NULL)
1857 		return NULL;
1858 	      strncpy (newstring, internal_ptr->u.syment._n._n_name, i);
1859 	      internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) newstring;
1860 	      internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1861 	    }
1862 	  else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1863 	    internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
1864 	  else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1865 	    {
1866 	      /* Long name already.  Point symbol at the string in the
1867                  table.  */
1868 	      if (string_table == NULL)
1869 		{
1870 		  string_table = _bfd_coff_read_string_table (abfd);
1871 		  if (string_table == NULL)
1872 		    return NULL;
1873 		}
1874 	      internal_ptr->u.syment._n._n_n._n_offset =
1875 		((bfd_hostptr_t)
1876 		 (string_table
1877 		  + internal_ptr->u.syment._n._n_n._n_offset));
1878 	    }
1879 	  else
1880 	    {
1881 	      /* Long name in debug section.  Very similar.  */
1882 	      if (debug_section == NULL)
1883 		debug_section = build_debug_section (abfd);
1884 	      internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t)
1885 		(debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1886 	    }
1887 	}
1888       internal_ptr += internal_ptr->u.syment.n_numaux;
1889     }
1890 
1891   obj_raw_syments (abfd) = internal;
1892   BFD_ASSERT (obj_raw_syment_count (abfd)
1893 	      == (unsigned int) (internal_ptr - internal));
1894 
1895   return internal;
1896 }
1897 
1898 long
1899 coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
1900 {
1901   if (bfd_get_format (abfd) != bfd_object)
1902     {
1903       bfd_set_error (bfd_error_invalid_operation);
1904       return -1;
1905     }
1906   return (asect->reloc_count + 1) * sizeof (arelent *);
1907 }
1908 
1909 asymbol *
1910 coff_make_empty_symbol (bfd *abfd)
1911 {
1912   bfd_size_type amt = sizeof (coff_symbol_type);
1913   coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt);
1914 
1915   if (new_symbol == NULL)
1916     return NULL;
1917   new_symbol->symbol.section = 0;
1918   new_symbol->native = 0;
1919   new_symbol->lineno = NULL;
1920   new_symbol->done_lineno = FALSE;
1921   new_symbol->symbol.the_bfd = abfd;
1922 
1923   return & new_symbol->symbol;
1924 }
1925 
1926 /* Make a debugging symbol.  */
1927 
1928 asymbol *
1929 coff_bfd_make_debug_symbol (bfd *abfd,
1930 			    void * ptr ATTRIBUTE_UNUSED,
1931 			    unsigned long sz ATTRIBUTE_UNUSED)
1932 {
1933   bfd_size_type amt = sizeof (coff_symbol_type);
1934   coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt);
1935 
1936   if (new_symbol == NULL)
1937     return NULL;
1938   /* @@ The 10 is a guess at a plausible maximum number of aux entries
1939      (but shouldn't be a constant).  */
1940   amt = sizeof (combined_entry_type) * 10;
1941   new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
1942   if (!new_symbol->native)
1943     return NULL;
1944   new_symbol->symbol.section = bfd_abs_section_ptr;
1945   new_symbol->symbol.flags = BSF_DEBUGGING;
1946   new_symbol->lineno = NULL;
1947   new_symbol->done_lineno = FALSE;
1948   new_symbol->symbol.the_bfd = abfd;
1949 
1950   return & new_symbol->symbol;
1951 }
1952 
1953 void
1954 coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
1955 {
1956   bfd_symbol_info (symbol, ret);
1957 
1958   if (coffsymbol (symbol)->native != NULL
1959       && coffsymbol (symbol)->native->fix_value)
1960     ret->value = coffsymbol (symbol)->native->u.syment.n_value -
1961       (bfd_hostptr_t) obj_raw_syments (abfd);
1962 }
1963 
1964 /* Return the COFF syment for a symbol.  */
1965 
1966 bfd_boolean
1967 bfd_coff_get_syment (bfd *abfd,
1968 		     asymbol *symbol,
1969 		     struct internal_syment *psyment)
1970 {
1971   coff_symbol_type *csym;
1972 
1973   csym = coff_symbol_from (abfd, symbol);
1974   if (csym == NULL || csym->native == NULL)
1975     {
1976       bfd_set_error (bfd_error_invalid_operation);
1977       return FALSE;
1978     }
1979 
1980   *psyment = csym->native->u.syment;
1981 
1982   if (csym->native->fix_value)
1983     psyment->n_value = psyment->n_value -
1984       (bfd_hostptr_t) obj_raw_syments (abfd);
1985 
1986   /* FIXME: We should handle fix_line here.  */
1987 
1988   return TRUE;
1989 }
1990 
1991 /* Return the COFF auxent for a symbol.  */
1992 
1993 bfd_boolean
1994 bfd_coff_get_auxent (bfd *abfd,
1995 		     asymbol *symbol,
1996 		     int indx,
1997 		     union internal_auxent *pauxent)
1998 {
1999   coff_symbol_type *csym;
2000   combined_entry_type *ent;
2001 
2002   csym = coff_symbol_from (abfd, symbol);
2003 
2004   if (csym == NULL
2005       || csym->native == NULL
2006       || indx >= csym->native->u.syment.n_numaux)
2007     {
2008       bfd_set_error (bfd_error_invalid_operation);
2009       return FALSE;
2010     }
2011 
2012   ent = csym->native + indx + 1;
2013 
2014   *pauxent = ent->u.auxent;
2015 
2016   if (ent->fix_tag)
2017     pauxent->x_sym.x_tagndx.l =
2018       ((combined_entry_type *) pauxent->x_sym.x_tagndx.p
2019        - obj_raw_syments (abfd));
2020 
2021   if (ent->fix_end)
2022     pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l =
2023       ((combined_entry_type *) pauxent->x_sym.x_fcnary.x_fcn.x_endndx.p
2024        - obj_raw_syments (abfd));
2025 
2026   if (ent->fix_scnlen)
2027     pauxent->x_csect.x_scnlen.l =
2028       ((combined_entry_type *) pauxent->x_csect.x_scnlen.p
2029        - obj_raw_syments (abfd));
2030 
2031   return TRUE;
2032 }
2033 
2034 /* Print out information about COFF symbol.  */
2035 
2036 void
2037 coff_print_symbol (bfd *abfd,
2038 		   void * filep,
2039 		   asymbol *symbol,
2040 		   bfd_print_symbol_type how)
2041 {
2042   FILE * file = (FILE *) filep;
2043 
2044   switch (how)
2045     {
2046     case bfd_print_symbol_name:
2047       fprintf (file, "%s", symbol->name);
2048       break;
2049 
2050     case bfd_print_symbol_more:
2051       fprintf (file, "coff %s %s",
2052 	       coffsymbol (symbol)->native ? "n" : "g",
2053 	       coffsymbol (symbol)->lineno ? "l" : " ");
2054       break;
2055 
2056     case bfd_print_symbol_all:
2057       if (coffsymbol (symbol)->native)
2058 	{
2059 	  bfd_vma val;
2060 	  unsigned int aux;
2061 	  combined_entry_type *combined = coffsymbol (symbol)->native;
2062 	  combined_entry_type *root = obj_raw_syments (abfd);
2063 	  struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
2064 
2065 	  fprintf (file, "[%3ld]", (long) (combined - root));
2066 
2067 	  if (! combined->fix_value)
2068 	    val = (bfd_vma) combined->u.syment.n_value;
2069 	  else
2070 	    val = combined->u.syment.n_value - (bfd_hostptr_t) root;
2071 
2072 	  fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
2073 		   combined->u.syment.n_scnum,
2074 		   combined->u.syment.n_flags,
2075 		   combined->u.syment.n_type,
2076 		   combined->u.syment.n_sclass,
2077 		   combined->u.syment.n_numaux);
2078 	  bfd_fprintf_vma (abfd, file, val);
2079 	  fprintf (file, " %s", symbol->name);
2080 
2081 	  for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
2082 	    {
2083 	      combined_entry_type *auxp = combined + aux + 1;
2084 	      long tagndx;
2085 
2086 	      if (auxp->fix_tag)
2087 		tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
2088 	      else
2089 		tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
2090 
2091 	      fprintf (file, "\n");
2092 
2093 	      if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
2094 		continue;
2095 
2096 	      switch (combined->u.syment.n_sclass)
2097 		{
2098 		case C_FILE:
2099 		  fprintf (file, "File ");
2100 		  break;
2101 
2102 		case C_STAT:
2103 		  if (combined->u.syment.n_type == T_NULL)
2104 		    /* Probably a section symbol ?  */
2105 		    {
2106 		      fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
2107 			       (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
2108 			       auxp->u.auxent.x_scn.x_nreloc,
2109 			       auxp->u.auxent.x_scn.x_nlinno);
2110 		      if (auxp->u.auxent.x_scn.x_checksum != 0
2111 			  || auxp->u.auxent.x_scn.x_associated != 0
2112 			  || auxp->u.auxent.x_scn.x_comdat != 0)
2113 			fprintf (file, " checksum 0x%lx assoc %d comdat %d",
2114 				 auxp->u.auxent.x_scn.x_checksum,
2115 				 auxp->u.auxent.x_scn.x_associated,
2116 				 auxp->u.auxent.x_scn.x_comdat);
2117 		      break;
2118 		    }
2119 		    /* Otherwise fall through.  */
2120 		case C_EXT:
2121 		case C_AIX_WEAKEXT:
2122 		  if (ISFCN (combined->u.syment.n_type))
2123 		    {
2124 		      long next, llnos;
2125 
2126 		      if (auxp->fix_end)
2127 			next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2128 			       - root);
2129 		      else
2130 			next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2131 		      llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
2132 		      fprintf (file,
2133 			       "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
2134 			       tagndx,
2135 			       (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
2136 			       llnos, next);
2137 		      break;
2138 		    }
2139 		  /* Otherwise fall through.  */
2140 		default:
2141 		  fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
2142 			   auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
2143 			   auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
2144 			   tagndx);
2145 		  if (auxp->fix_end)
2146 		    fprintf (file, " endndx %ld",
2147 			     ((long)
2148 			      (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2149 			       - root)));
2150 		  break;
2151 		}
2152 	    }
2153 
2154 	  if (l)
2155 	    {
2156 	      fprintf (file, "\n%s :", l->u.sym->name);
2157 	      l++;
2158 	      while (l->line_number)
2159 		{
2160 		  fprintf (file, "\n%4d : ", l->line_number);
2161 		  bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
2162 		  l++;
2163 		}
2164 	    }
2165 	}
2166       else
2167 	{
2168 	  bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2169 	  fprintf (file, " %-5s %s %s %s",
2170 		   symbol->section->name,
2171 		   coffsymbol (symbol)->native ? "n" : "g",
2172 		   coffsymbol (symbol)->lineno ? "l" : " ",
2173 		   symbol->name);
2174 	}
2175     }
2176 }
2177 
2178 /* Return whether a symbol name implies a local symbol.  In COFF,
2179    local symbols generally start with ``.L''.  Most targets use this
2180    function for the is_local_label_name entry point, but some may
2181    override it.  */
2182 
2183 bfd_boolean
2184 _bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
2185 			       const char *name)
2186 {
2187   return name[0] == '.' && name[1] == 'L';
2188 }
2189 
2190 /* Provided a BFD, a section and an offset (in bytes, not octets) into the
2191    section, calculate and return the name of the source file and the line
2192    nearest to the wanted location.  */
2193 
2194 bfd_boolean
2195 coff_find_nearest_line_with_names (bfd *abfd,
2196                                    const struct dwarf_debug_section *debug_sections,
2197                                    asection *section,
2198                                    asymbol **symbols,
2199                                    bfd_vma offset,
2200                                    const char **filename_ptr,
2201                                    const char **functionname_ptr,
2202                                    unsigned int *line_ptr)
2203 {
2204   bfd_boolean found;
2205   unsigned int i;
2206   unsigned int line_base;
2207   coff_data_type *cof = coff_data (abfd);
2208   /* Run through the raw syments if available.  */
2209   combined_entry_type *p;
2210   combined_entry_type *pend;
2211   alent *l;
2212   struct coff_section_tdata *sec_data;
2213   bfd_size_type amt;
2214 
2215   /* Before looking through the symbol table, try to use a .stab
2216      section to find the information.  */
2217   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2218 					     &found, filename_ptr,
2219 					     functionname_ptr, line_ptr,
2220 					     &coff_data(abfd)->line_info))
2221     return FALSE;
2222 
2223   if (found)
2224     return TRUE;
2225 
2226   /* Also try examining DWARF2 debugging information.  */
2227   if (_bfd_dwarf2_find_nearest_line (abfd, debug_sections,
2228                                      section, symbols, offset,
2229 				     filename_ptr, functionname_ptr,
2230 				     line_ptr, NULL, 0,
2231 				     &coff_data(abfd)->dwarf2_find_line_info))
2232     return TRUE;
2233 
2234   *filename_ptr = 0;
2235   *functionname_ptr = 0;
2236   *line_ptr = 0;
2237 
2238   /* Don't try and find line numbers in a non coff file.  */
2239   if (!bfd_family_coff (abfd))
2240     return FALSE;
2241 
2242   if (cof == NULL)
2243     return FALSE;
2244 
2245   /* Find the first C_FILE symbol.  */
2246   p = cof->raw_syments;
2247   if (!p)
2248     return FALSE;
2249 
2250   pend = p + cof->raw_syment_count;
2251   while (p < pend)
2252     {
2253       if (p->u.syment.n_sclass == C_FILE)
2254 	break;
2255       p += 1 + p->u.syment.n_numaux;
2256     }
2257 
2258   if (p < pend)
2259     {
2260       bfd_vma sec_vma;
2261       bfd_vma maxdiff;
2262 
2263       /* Look through the C_FILE symbols to find the best one.  */
2264       sec_vma = bfd_get_section_vma (abfd, section);
2265       *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2266       maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
2267       while (1)
2268 	{
2269 	  bfd_vma file_addr;
2270 	  combined_entry_type *p2;
2271 
2272 	  for (p2 = p + 1 + p->u.syment.n_numaux;
2273 	       p2 < pend;
2274 	       p2 += 1 + p2->u.syment.n_numaux)
2275 	    {
2276 	      if (p2->u.syment.n_scnum > 0
2277 		  && (section
2278 		      == coff_section_from_bfd_index (abfd,
2279 						      p2->u.syment.n_scnum)))
2280 		break;
2281 	      if (p2->u.syment.n_sclass == C_FILE)
2282 		{
2283 		  p2 = pend;
2284 		  break;
2285 		}
2286 	    }
2287 
2288 	  file_addr = (bfd_vma) p2->u.syment.n_value;
2289 	  /* PR 11512: Include the section address of the function name symbol.  */
2290 	  if (p2->u.syment.n_scnum > 0)
2291 	    file_addr += coff_section_from_bfd_index (abfd,
2292 						      p2->u.syment.n_scnum)->vma;
2293 	  /* We use <= MAXDIFF here so that if we get a zero length
2294              file, we actually use the next file entry.  */
2295 	  if (p2 < pend
2296 	      && offset + sec_vma >= file_addr
2297 	      && offset + sec_vma - file_addr <= maxdiff)
2298 	    {
2299 	      *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2300 	      maxdiff = offset + sec_vma - p2->u.syment.n_value;
2301 	    }
2302 
2303 	  /* Avoid endless loops on erroneous files by ensuring that
2304 	     we always move forward in the file.  */
2305 	  if (p >= cof->raw_syments + p->u.syment.n_value)
2306 	    break;
2307 
2308 	  p = cof->raw_syments + p->u.syment.n_value;
2309 	  if (p > pend || p->u.syment.n_sclass != C_FILE)
2310 	    break;
2311 	}
2312     }
2313 
2314   /* Now wander though the raw linenumbers of the section.  */
2315   /* If we have been called on this section before, and the offset we
2316      want is further down then we can prime the lookup loop.  */
2317   sec_data = coff_section_data (abfd, section);
2318   if (sec_data != NULL
2319       && sec_data->i > 0
2320       && offset >= sec_data->offset)
2321     {
2322       i = sec_data->i;
2323       *functionname_ptr = sec_data->function;
2324       line_base = sec_data->line_base;
2325     }
2326   else
2327     {
2328       i = 0;
2329       line_base = 0;
2330     }
2331 
2332   if (section->lineno != NULL)
2333     {
2334       bfd_vma last_value = 0;
2335 
2336       l = &section->lineno[i];
2337 
2338       for (; i < section->lineno_count; i++)
2339 	{
2340 	  if (l->line_number == 0)
2341 	    {
2342 	      /* Get the symbol this line number points at.  */
2343 	      coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
2344 	      if (coff->symbol.value > offset)
2345 		break;
2346 	      *functionname_ptr = coff->symbol.name;
2347 	      last_value = coff->symbol.value;
2348 	      if (coff->native)
2349 		{
2350 		  combined_entry_type *s = coff->native;
2351 		  s = s + 1 + s->u.syment.n_numaux;
2352 
2353 		  /* In XCOFF a debugging symbol can follow the
2354 		     function symbol.  */
2355 		  if (s->u.syment.n_scnum == N_DEBUG)
2356 		    s = s + 1 + s->u.syment.n_numaux;
2357 
2358 		  /* S should now point to the .bf of the function.  */
2359 		  if (s->u.syment.n_numaux)
2360 		    {
2361 		      /* The linenumber is stored in the auxent.  */
2362 		      union internal_auxent *a = &((s + 1)->u.auxent);
2363 		      line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
2364 		      *line_ptr = line_base;
2365 		    }
2366 		}
2367 	    }
2368 	  else
2369 	    {
2370 	      if (l->u.offset > offset)
2371 		break;
2372 	      *line_ptr = l->line_number + line_base - 1;
2373 	    }
2374 	  l++;
2375 	}
2376 
2377       /* If we fell off the end of the loop, then assume that this
2378 	 symbol has no line number info.  Otherwise, symbols with no
2379 	 line number info get reported with the line number of the
2380 	 last line of the last symbol which does have line number
2381 	 info.  We use 0x100 as a slop to account for cases where the
2382 	 last line has executable code.  */
2383       if (i >= section->lineno_count
2384 	  && last_value != 0
2385 	  && offset - last_value > 0x100)
2386 	{
2387 	  *functionname_ptr = NULL;
2388 	  *line_ptr = 0;
2389 	}
2390     }
2391 
2392   /* Cache the results for the next call.  */
2393   if (sec_data == NULL && section->owner == abfd)
2394     {
2395       amt = sizeof (struct coff_section_tdata);
2396       section->used_by_bfd = bfd_zalloc (abfd, amt);
2397       sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2398     }
2399   if (sec_data != NULL)
2400     {
2401       sec_data->offset = offset;
2402       sec_data->i = i - 1;
2403       sec_data->function = *functionname_ptr;
2404       sec_data->line_base = line_base;
2405     }
2406 
2407   return TRUE;
2408 }
2409 
2410 bfd_boolean
2411 coff_find_nearest_line (bfd *abfd,
2412 			asection *section,
2413 			asymbol **symbols,
2414 			bfd_vma offset,
2415 			const char **filename_ptr,
2416 			const char **functionname_ptr,
2417 			unsigned int *line_ptr)
2418 {
2419   return coff_find_nearest_line_with_names (abfd, dwarf_debug_sections,
2420                                             section, symbols, offset,
2421                                             filename_ptr, functionname_ptr,
2422                                             line_ptr);
2423 }
2424 
2425 bfd_boolean
2426 coff_find_nearest_line_discriminator (bfd *abfd,
2427 				      asection *section,
2428 				      asymbol **symbols,
2429 				      bfd_vma offset,
2430 				      const char **filename_ptr,
2431 				      const char **functionname_ptr,
2432 				      unsigned int *line_ptr,
2433 				      unsigned int *discriminator)
2434 {
2435   *discriminator = 0;
2436   return coff_find_nearest_line_with_names (abfd, dwarf_debug_sections,
2437                                             section, symbols, offset,
2438                                             filename_ptr, functionname_ptr,
2439                                             line_ptr);
2440 }
2441 
2442 
2443 bfd_boolean
2444 coff_find_inliner_info (bfd *abfd,
2445 			const char **filename_ptr,
2446 			const char **functionname_ptr,
2447 			unsigned int *line_ptr)
2448 {
2449   bfd_boolean found;
2450 
2451   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
2452 					 functionname_ptr, line_ptr,
2453 					 &coff_data(abfd)->dwarf2_find_line_info);
2454   return (found);
2455 }
2456 
2457 int
2458 coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
2459 {
2460   size_t size;
2461 
2462   if (!info->relocatable)
2463     size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
2464   else
2465     size = bfd_coff_filhsz (abfd);
2466 
2467   size += abfd->section_count * bfd_coff_scnhsz (abfd);
2468   return size;
2469 }
2470 
2471 /* Change the class of a coff symbol held by BFD.  */
2472 
2473 bfd_boolean
2474 bfd_coff_set_symbol_class (bfd *         abfd,
2475 			   asymbol *     symbol,
2476 			   unsigned int  symbol_class)
2477 {
2478   coff_symbol_type * csym;
2479 
2480   csym = coff_symbol_from (abfd, symbol);
2481   if (csym == NULL)
2482     {
2483       bfd_set_error (bfd_error_invalid_operation);
2484       return FALSE;
2485     }
2486   else if (csym->native == NULL)
2487     {
2488       /* This is an alien symbol which no native coff backend data.
2489 	 We cheat here by creating a fake native entry for it and
2490 	 then filling in the class.  This code is based on that in
2491 	 coff_write_alien_symbol().  */
2492 
2493       combined_entry_type * native;
2494       bfd_size_type amt = sizeof (* native);
2495 
2496       native = (combined_entry_type *) bfd_zalloc (abfd, amt);
2497       if (native == NULL)
2498 	return FALSE;
2499 
2500       native->u.syment.n_type   = T_NULL;
2501       native->u.syment.n_sclass = symbol_class;
2502 
2503       if (bfd_is_und_section (symbol->section))
2504 	{
2505 	  native->u.syment.n_scnum = N_UNDEF;
2506 	  native->u.syment.n_value = symbol->value;
2507 	}
2508       else if (bfd_is_com_section (symbol->section))
2509 	{
2510 	  native->u.syment.n_scnum = N_UNDEF;
2511 	  native->u.syment.n_value = symbol->value;
2512 	}
2513       else
2514 	{
2515 	  native->u.syment.n_scnum =
2516 	    symbol->section->output_section->target_index;
2517 	  native->u.syment.n_value = (symbol->value
2518 				      + symbol->section->output_offset);
2519 	  if (! obj_pe (abfd))
2520 	    native->u.syment.n_value += symbol->section->output_section->vma;
2521 
2522 	  /* Copy the any flags from the file header into the symbol.
2523 	     FIXME: Why?  */
2524 	  native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
2525 	}
2526 
2527       csym->native = native;
2528     }
2529   else
2530     csym->native->u.syment.n_sclass = symbol_class;
2531 
2532   return TRUE;
2533 }
2534 
2535 struct coff_comdat_info *
2536 bfd_coff_get_comdat_section (bfd *abfd, struct bfd_section *sec)
2537 {
2538   if (bfd_get_flavour (abfd) == bfd_target_coff_flavour
2539       && coff_section_data (abfd, sec) != NULL)
2540     return coff_section_data (abfd, sec)->comdat;
2541   else
2542     return NULL;
2543 }
2544 
2545 bfd_boolean
2546 _bfd_coff_section_already_linked (bfd *abfd,
2547 				  asection *sec,
2548 				  struct bfd_link_info *info)
2549 {
2550   flagword flags;
2551   const char *name, *key;
2552   struct bfd_section_already_linked *l;
2553   struct bfd_section_already_linked_hash_entry *already_linked_list;
2554   struct coff_comdat_info *s_comdat;
2555 
2556   flags = sec->flags;
2557   if ((flags & SEC_LINK_ONCE) == 0)
2558     return FALSE;
2559 
2560   /* The COFF backend linker doesn't support group sections.  */
2561   if ((flags & SEC_GROUP) != 0)
2562     return FALSE;
2563 
2564   name = bfd_get_section_name (abfd, sec);
2565   s_comdat = bfd_coff_get_comdat_section (abfd, sec);
2566 
2567   if (s_comdat != NULL)
2568     key = s_comdat->name;
2569   else
2570     {
2571       if (CONST_STRNEQ (name, ".gnu.linkonce.")
2572 	  && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL)
2573 	key++;
2574       else
2575 	/* FIXME: gcc as of 2011-09 emits sections like .text$<key>,
2576 	   .xdata$<key> and .pdata$<key> only the first of which has a
2577 	   comdat key.  Should these all match the LTO IR key?  */
2578 	key = name;
2579     }
2580 
2581   already_linked_list = bfd_section_already_linked_table_lookup (key);
2582 
2583   for (l = already_linked_list->entry; l != NULL; l = l->next)
2584     {
2585       struct coff_comdat_info *l_comdat;
2586 
2587       l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec);
2588 
2589       /* The section names must match, and both sections must be
2590 	 comdat and have the same comdat name, or both sections must
2591 	 be non-comdat.  LTO IR plugin sections are an exception.  They
2592 	 are always named .gnu.linkonce.t.<key> (<key> is some string)
2593 	 and match any comdat section with comdat name of <key>, and
2594 	 any linkonce section with the same suffix, ie.
2595 	 .gnu.linkonce.*.<key>.  */
2596       if (((s_comdat != NULL) == (l_comdat != NULL)
2597 	   && strcmp (name, l->sec->name) == 0)
2598 	  || (l->sec->owner->flags & BFD_PLUGIN) != 0)
2599 	{
2600 	  /* The section has already been linked.  See if we should
2601 	     issue a warning.  */
2602 	  return _bfd_handle_already_linked (sec, l, info);
2603 	}
2604     }
2605 
2606   /* This is the first section with this name.  Record it.  */
2607   if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
2608     info->callbacks->einfo (_("%F%P: already_linked_table: %E\n"));
2609   return FALSE;
2610 }
2611