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