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