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