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