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