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