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