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