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