Home | History | Annotate | Line # | Download | only in bfd
coffgen.c revision 1.1
      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 (at) cygnus.com.
     25    Split out of coffcode.h by Ian Taylor, ian (at) 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 section_index)
    311 {
    312   struct bfd_section *answer = abfd->sections;
    313 
    314   if (section_index == N_ABS)
    315     return bfd_abs_section_ptr;
    316   if (section_index == N_UNDEF)
    317     return bfd_und_section_ptr;
    318   if (section_index == N_DEBUG)
    319     return bfd_abs_section_ptr;
    320 
    321   while (answer)
    322     {
    323       if (answer->target_index == section_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 (at) 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   asection *output_section = symbol->section->output_section
    919 			       ? symbol->section->output_section
    920 			       : symbol->section;
    921   void * buf;
    922   bfd_size_type symesz;
    923 
    924   if (native->u.syment.n_sclass == C_FILE)
    925     symbol->flags |= BSF_DEBUGGING;
    926 
    927   if (symbol->flags & BSF_DEBUGGING
    928       && bfd_is_abs_section (symbol->section))
    929     native->u.syment.n_scnum = N_DEBUG;
    930 
    931   else if (bfd_is_abs_section (symbol->section))
    932     native->u.syment.n_scnum = N_ABS;
    933 
    934   else if (bfd_is_und_section (symbol->section))
    935     native->u.syment.n_scnum = N_UNDEF;
    936 
    937   else
    938     native->u.syment.n_scnum =
    939       output_section->target_index;
    940 
    941   coff_fix_symbol_name (abfd, symbol, native, string_size_p,
    942 			debug_string_section_p, debug_string_size_p);
    943 
    944   symesz = bfd_coff_symesz (abfd);
    945   buf = bfd_alloc (abfd, symesz);
    946   if (!buf)
    947     return FALSE;
    948   bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
    949   if (bfd_bwrite (buf, symesz, abfd) != symesz)
    950     return FALSE;
    951   bfd_release (abfd, buf);
    952 
    953   if (native->u.syment.n_numaux > 0)
    954     {
    955       bfd_size_type auxesz;
    956       unsigned int j;
    957 
    958       auxesz = bfd_coff_auxesz (abfd);
    959       buf = bfd_alloc (abfd, auxesz);
    960       if (!buf)
    961 	return FALSE;
    962       for (j = 0; j < native->u.syment.n_numaux; j++)
    963 	{
    964 	  bfd_coff_swap_aux_out (abfd,
    965 				 &((native + j + 1)->u.auxent),
    966 				 type, n_sclass, (int) j,
    967 				 native->u.syment.n_numaux,
    968 				 buf);
    969 	  if (bfd_bwrite (buf, auxesz, abfd) != auxesz)
    970 	    return FALSE;
    971 	}
    972       bfd_release (abfd, buf);
    973     }
    974 
    975   /* Store the index for use when we write out the relocs.  */
    976   set_index (symbol, *written);
    977 
    978   *written += numaux + 1;
    979   return TRUE;
    980 }
    981 
    982 /* Write out a symbol to a COFF file that does not come from a COFF
    983    file originally.  This symbol may have been created by the linker,
    984    or we may be linking a non COFF file to a COFF file.  */
    985 
    986 bfd_boolean
    987 coff_write_alien_symbol (bfd *abfd,
    988 			 asymbol *symbol,
    989 			 struct internal_syment *isym,
    990 			 bfd_vma *written,
    991 			 bfd_size_type *string_size_p,
    992 			 asection **debug_string_section_p,
    993 			 bfd_size_type *debug_string_size_p)
    994 {
    995   combined_entry_type *native;
    996   combined_entry_type dummy[2];
    997   asection *output_section = symbol->section->output_section
    998 			       ? symbol->section->output_section
    999 			       : symbol->section;
   1000   struct bfd_link_info *link_info = coff_data (abfd)->link_info;
   1001   bfd_boolean ret;
   1002 
   1003   if ((!link_info || link_info->strip_discarded)
   1004       && !bfd_is_abs_section (symbol->section)
   1005       && symbol->section->output_section == bfd_abs_section_ptr)
   1006     {
   1007       symbol->name = "";
   1008       if (isym != NULL)
   1009         memset (isym, 0, sizeof(*isym));
   1010       return TRUE;
   1011     }
   1012   native = dummy;
   1013   native->u.syment.n_type = T_NULL;
   1014   native->u.syment.n_flags = 0;
   1015   native->u.syment.n_numaux = 0;
   1016   if (bfd_is_und_section (symbol->section))
   1017     {
   1018       native->u.syment.n_scnum = N_UNDEF;
   1019       native->u.syment.n_value = symbol->value;
   1020     }
   1021   else if (bfd_is_com_section (symbol->section))
   1022     {
   1023       native->u.syment.n_scnum = N_UNDEF;
   1024       native->u.syment.n_value = symbol->value;
   1025     }
   1026   else if (symbol->flags & BSF_FILE)
   1027     {
   1028       native->u.syment.n_scnum = N_DEBUG;
   1029       native->u.syment.n_numaux = 1;
   1030     }
   1031   else if (symbol->flags & BSF_DEBUGGING)
   1032     {
   1033       /* There isn't much point to writing out a debugging symbol
   1034          unless we are prepared to convert it into COFF debugging
   1035          format.  So, we just ignore them.  We must clobber the symbol
   1036          name to keep it from being put in the string table.  */
   1037       symbol->name = "";
   1038       if (isym != NULL)
   1039         memset (isym, 0, sizeof(*isym));
   1040       return TRUE;
   1041     }
   1042   else
   1043     {
   1044       native->u.syment.n_scnum = output_section->target_index;
   1045       native->u.syment.n_value = (symbol->value
   1046 				  + symbol->section->output_offset);
   1047       if (! obj_pe (abfd))
   1048 	native->u.syment.n_value += output_section->vma;
   1049 
   1050       /* Copy the any flags from the file header into the symbol.
   1051          FIXME: Why?  */
   1052       {
   1053 	coff_symbol_type *c = coff_symbol_from (abfd, symbol);
   1054 	if (c != (coff_symbol_type *) NULL)
   1055 	  native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
   1056       }
   1057     }
   1058 
   1059   native->u.syment.n_type = 0;
   1060   if (symbol->flags & BSF_FILE)
   1061     native->u.syment.n_sclass = C_FILE;
   1062   else if (symbol->flags & BSF_LOCAL)
   1063     native->u.syment.n_sclass = C_STAT;
   1064   else if (symbol->flags & BSF_WEAK)
   1065     native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
   1066   else
   1067     native->u.syment.n_sclass = C_EXT;
   1068 
   1069   ret = coff_write_symbol (abfd, symbol, native, written, string_size_p,
   1070 			   debug_string_section_p, debug_string_size_p);
   1071   if (isym != NULL)
   1072     *isym = native->u.syment;
   1073   return ret;
   1074 }
   1075 
   1076 /* Write a native symbol to a COFF file.  */
   1077 
   1078 static bfd_boolean
   1079 coff_write_native_symbol (bfd *abfd,
   1080 			  coff_symbol_type *symbol,
   1081 			  bfd_vma *written,
   1082 			  bfd_size_type *string_size_p,
   1083 			  asection **debug_string_section_p,
   1084 			  bfd_size_type *debug_string_size_p)
   1085 {
   1086   combined_entry_type *native = symbol->native;
   1087   alent *lineno = symbol->lineno;
   1088   struct bfd_link_info *link_info = coff_data (abfd)->link_info;
   1089 
   1090   if ((!link_info || link_info->strip_discarded)
   1091       && !bfd_is_abs_section (symbol->symbol.section)
   1092       && symbol->symbol.section->output_section == bfd_abs_section_ptr)
   1093     {
   1094       symbol->symbol.name = "";
   1095       return TRUE;
   1096     }
   1097 
   1098   /* If this symbol has an associated line number, we must store the
   1099      symbol index in the line number field.  We also tag the auxent to
   1100      point to the right place in the lineno table.  */
   1101   if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
   1102     {
   1103       unsigned int count = 0;
   1104 
   1105       lineno[count].u.offset = *written;
   1106       if (native->u.syment.n_numaux)
   1107 	{
   1108 	  union internal_auxent *a = &((native + 1)->u.auxent);
   1109 
   1110 	  a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
   1111 	    symbol->symbol.section->output_section->moving_line_filepos;
   1112 	}
   1113 
   1114       /* Count and relocate all other linenumbers.  */
   1115       count++;
   1116       while (lineno[count].line_number != 0)
   1117 	{
   1118 	  lineno[count].u.offset +=
   1119 	    (symbol->symbol.section->output_section->vma
   1120 	     + symbol->symbol.section->output_offset);
   1121 	  count++;
   1122 	}
   1123       symbol->done_lineno = TRUE;
   1124 
   1125       if (! bfd_is_const_section (symbol->symbol.section->output_section))
   1126 	symbol->symbol.section->output_section->moving_line_filepos +=
   1127 	  count * bfd_coff_linesz (abfd);
   1128     }
   1129 
   1130   return coff_write_symbol (abfd, &(symbol->symbol), native, written,
   1131 			    string_size_p, debug_string_section_p,
   1132 			    debug_string_size_p);
   1133 }
   1134 
   1135 static void
   1136 null_error_handler (const char * fmt ATTRIBUTE_UNUSED, ...)
   1137 {
   1138 }
   1139 
   1140 /* Write out the COFF symbols.  */
   1141 
   1142 bfd_boolean
   1143 coff_write_symbols (bfd *abfd)
   1144 {
   1145   bfd_size_type string_size;
   1146   asection *debug_string_section;
   1147   bfd_size_type debug_string_size;
   1148   unsigned int i;
   1149   unsigned int limit = bfd_get_symcount (abfd);
   1150   bfd_vma written = 0;
   1151   asymbol **p;
   1152 
   1153   string_size = 0;
   1154   debug_string_section = NULL;
   1155   debug_string_size = 0;
   1156 
   1157   /* If this target supports long section names, they must be put into
   1158      the string table.  This is supported by PE.  This code must
   1159      handle section names just as they are handled in
   1160      coff_write_object_contents.  */
   1161   if (bfd_coff_long_section_names (abfd))
   1162     {
   1163       asection *o;
   1164 
   1165       for (o = abfd->sections; o != NULL; o = o->next)
   1166 	{
   1167 	  size_t len;
   1168 
   1169 	  len = strlen (o->name);
   1170 	  if (len > SCNNMLEN)
   1171 	    string_size += len + 1;
   1172 	}
   1173     }
   1174 
   1175   /* Seek to the right place.  */
   1176   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
   1177     return FALSE;
   1178 
   1179   /* Output all the symbols we have.  */
   1180   written = 0;
   1181   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
   1182     {
   1183       asymbol *symbol = *p;
   1184       coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
   1185 
   1186       if (c_symbol == (coff_symbol_type *) NULL
   1187 	  || c_symbol->native == (combined_entry_type *) NULL)
   1188 	{
   1189 	  if (!coff_write_alien_symbol (abfd, symbol, NULL, &written,
   1190 					&string_size, &debug_string_section,
   1191 					&debug_string_size))
   1192 	    return FALSE;
   1193 	}
   1194       else
   1195 	{
   1196 	  if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
   1197 	    {
   1198 	      bfd_error_handler_type current_error_handler;
   1199 	      enum coff_symbol_classification sym_class;
   1200 	      unsigned char *n_sclass;
   1201 
   1202 	      /* Suppress error reporting by bfd_coff_classify_symbol.
   1203 		 Error messages can be generated when we are processing a local
   1204 		 symbol which has no associated section and we do not have to
   1205 		 worry about this, all we need to know is that it is local.  */
   1206 	      current_error_handler = bfd_set_error_handler (null_error_handler);
   1207 	      sym_class = bfd_coff_classify_symbol (abfd,
   1208                                                    &c_symbol->native->u.syment);
   1209 	      (void) bfd_set_error_handler (current_error_handler);
   1210 
   1211 	      n_sclass = &c_symbol->native->u.syment.n_sclass;
   1212 
   1213 	      /* If the symbol class has been changed (eg objcopy/ld script/etc)
   1214 		 we cannot retain the existing sclass from the original symbol.
   1215 		 Weak symbols only have one valid sclass, so just set it always.
   1216 		 If it is not local class and should be, set it C_STAT.
   1217 		 If it is global and not classified as global, or if it is
   1218 		 weak (which is also classified as global), set it C_EXT.  */
   1219 
   1220 	      if (symbol->flags & BSF_WEAK)
   1221 		*n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
   1222 	      else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL)
   1223 		*n_sclass = C_STAT;
   1224 	      else if (symbol->flags & BSF_GLOBAL
   1225 		       && (sym_class != COFF_SYMBOL_GLOBAL
   1226 #ifdef COFF_WITH_PE
   1227 			   || *n_sclass == C_NT_WEAK
   1228 #endif
   1229 			   || *n_sclass == C_WEAKEXT))
   1230 		c_symbol->native->u.syment.n_sclass = C_EXT;
   1231 	    }
   1232 
   1233 	  if (!coff_write_native_symbol (abfd, c_symbol, &written,
   1234 					 &string_size, &debug_string_section,
   1235 					 &debug_string_size))
   1236 	    return FALSE;
   1237 	}
   1238     }
   1239 
   1240   obj_raw_syment_count (abfd) = written;
   1241 
   1242   /* Now write out strings.  */
   1243   if (string_size != 0)
   1244     {
   1245       unsigned int size = string_size + STRING_SIZE_SIZE;
   1246       bfd_byte buffer[STRING_SIZE_SIZE];
   1247 
   1248 #if STRING_SIZE_SIZE == 4
   1249       H_PUT_32 (abfd, size, buffer);
   1250 #else
   1251  #error Change H_PUT_32
   1252 #endif
   1253       if (bfd_bwrite ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd)
   1254 	  != sizeof (buffer))
   1255 	return FALSE;
   1256 
   1257       /* Handle long section names.  This code must handle section
   1258 	 names just as they are handled in coff_write_object_contents.  */
   1259       if (bfd_coff_long_section_names (abfd))
   1260 	{
   1261 	  asection *o;
   1262 
   1263 	  for (o = abfd->sections; o != NULL; o = o->next)
   1264 	    {
   1265 	      size_t len;
   1266 
   1267 	      len = strlen (o->name);
   1268 	      if (len > SCNNMLEN)
   1269 		{
   1270 		  if (bfd_bwrite (o->name, (bfd_size_type) (len + 1), abfd)
   1271 		      != len + 1)
   1272 		    return FALSE;
   1273 		}
   1274 	    }
   1275 	}
   1276 
   1277       for (p = abfd->outsymbols, i = 0;
   1278 	   i < limit;
   1279 	   i++, p++)
   1280 	{
   1281 	  asymbol *q = *p;
   1282 	  size_t name_length = strlen (q->name);
   1283 	  coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
   1284 	  size_t maxlen;
   1285 
   1286 	  /* Figure out whether the symbol name should go in the string
   1287 	     table.  Symbol names that are short enough are stored
   1288 	     directly in the syment structure.  File names permit a
   1289 	     different, longer, length in the syment structure.  On
   1290 	     XCOFF, some symbol names are stored in the .debug section
   1291 	     rather than in the string table.  */
   1292 
   1293 	  if (c_symbol == NULL
   1294 	      || c_symbol->native == NULL)
   1295 	    /* This is not a COFF symbol, so it certainly is not a
   1296 	       file name, nor does it go in the .debug section.  */
   1297 	    maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
   1298 
   1299 	  else if (bfd_coff_symname_in_debug (abfd,
   1300 					      &c_symbol->native->u.syment))
   1301 	    /* This symbol name is in the XCOFF .debug section.
   1302 	       Don't write it into the string table.  */
   1303 	    maxlen = name_length;
   1304 
   1305 	  else if (c_symbol->native->u.syment.n_sclass == C_FILE
   1306 		   && c_symbol->native->u.syment.n_numaux > 0)
   1307 	    {
   1308 	      if (bfd_coff_force_symnames_in_strings (abfd))
   1309 		{
   1310 		  if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
   1311 		    return FALSE;
   1312 		}
   1313 	      maxlen = bfd_coff_filnmlen (abfd);
   1314 	    }
   1315 	  else
   1316 	    maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
   1317 
   1318 	  if (name_length > maxlen)
   1319 	    {
   1320 	      if (bfd_bwrite ((void *) (q->name), (bfd_size_type) name_length + 1,
   1321 			     abfd) != name_length + 1)
   1322 		return FALSE;
   1323 	    }
   1324 	}
   1325     }
   1326   else
   1327     {
   1328       /* We would normally not write anything here, but we'll write
   1329          out 4 so that any stupid coff reader which tries to read the
   1330          string table even when there isn't one won't croak.  */
   1331       unsigned int size = STRING_SIZE_SIZE;
   1332       bfd_byte buffer[STRING_SIZE_SIZE];
   1333 
   1334 #if STRING_SIZE_SIZE == 4
   1335       H_PUT_32 (abfd, size, buffer);
   1336 #else
   1337  #error Change H_PUT_32
   1338 #endif
   1339       if (bfd_bwrite ((void *) buffer, (bfd_size_type) STRING_SIZE_SIZE, abfd)
   1340 	  != STRING_SIZE_SIZE)
   1341 	return FALSE;
   1342     }
   1343 
   1344   /* Make sure the .debug section was created to be the correct size.
   1345      We should create it ourselves on the fly, but we don't because
   1346      BFD won't let us write to any section until we know how large all
   1347      the sections are.  We could still do it by making another pass
   1348      over the symbols.  FIXME.  */
   1349   BFD_ASSERT (debug_string_size == 0
   1350 	      || (debug_string_section != (asection *) NULL
   1351 		  && (BFD_ALIGN (debug_string_size,
   1352 				 1 << debug_string_section->alignment_power)
   1353 		      == debug_string_section->size)));
   1354 
   1355   return TRUE;
   1356 }
   1357 
   1358 bfd_boolean
   1359 coff_write_linenumbers (bfd *abfd)
   1360 {
   1361   asection *s;
   1362   bfd_size_type linesz;
   1363   void * buff;
   1364 
   1365   linesz = bfd_coff_linesz (abfd);
   1366   buff = bfd_alloc (abfd, linesz);
   1367   if (!buff)
   1368     return FALSE;
   1369   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
   1370     {
   1371       if (s->lineno_count)
   1372 	{
   1373 	  asymbol **q = abfd->outsymbols;
   1374 	  if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
   1375 	    return FALSE;
   1376 	  /* Find all the linenumbers in this section.  */
   1377 	  while (*q)
   1378 	    {
   1379 	      asymbol *p = *q;
   1380 	      if (p->section->output_section == s)
   1381 		{
   1382 		  alent *l =
   1383 		  BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
   1384 			    (bfd_asymbol_bfd (p), p));
   1385 		  if (l)
   1386 		    {
   1387 		      /* Found a linenumber entry, output.  */
   1388 		      struct internal_lineno out;
   1389 		      memset ((void *) & out, 0, sizeof (out));
   1390 		      out.l_lnno = 0;
   1391 		      out.l_addr.l_symndx = l->u.offset;
   1392 		      bfd_coff_swap_lineno_out (abfd, &out, buff);
   1393 		      if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
   1394 			  != linesz)
   1395 			return FALSE;
   1396 		      l++;
   1397 		      while (l->line_number)
   1398 			{
   1399 			  out.l_lnno = l->line_number;
   1400 			  out.l_addr.l_symndx = l->u.offset;
   1401 			  bfd_coff_swap_lineno_out (abfd, &out, buff);
   1402 			  if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
   1403 			      != linesz)
   1404 			    return FALSE;
   1405 			  l++;
   1406 			}
   1407 		    }
   1408 		}
   1409 	      q++;
   1410 	    }
   1411 	}
   1412     }
   1413   bfd_release (abfd, buff);
   1414   return TRUE;
   1415 }
   1416 
   1417 alent *
   1418 coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
   1419 {
   1420   return coffsymbol (symbol)->lineno;
   1421 }
   1422 
   1423 /* This function transforms the offsets into the symbol table into
   1424    pointers to syments.  */
   1425 
   1426 static void
   1427 coff_pointerize_aux (bfd *abfd,
   1428 		     combined_entry_type *table_base,
   1429 		     combined_entry_type *symbol,
   1430 		     unsigned int indaux,
   1431 		     combined_entry_type *auxent)
   1432 {
   1433   unsigned int type = symbol->u.syment.n_type;
   1434   unsigned int n_sclass = symbol->u.syment.n_sclass;
   1435 
   1436   if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
   1437     {
   1438       if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
   1439 	  (abfd, table_base, symbol, indaux, auxent))
   1440 	return;
   1441     }
   1442 
   1443   /* Don't bother if this is a file or a section.  */
   1444   if (n_sclass == C_STAT && type == T_NULL)
   1445     return;
   1446   if (n_sclass == C_FILE)
   1447     return;
   1448 
   1449   /* Otherwise patch up.  */
   1450 #define N_TMASK coff_data  (abfd)->local_n_tmask
   1451 #define N_BTSHFT coff_data (abfd)->local_n_btshft
   1452 
   1453   if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK
   1454        || n_sclass == C_FCN)
   1455       && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
   1456     {
   1457       auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
   1458 	table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
   1459       auxent->fix_end = 1;
   1460     }
   1461   /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
   1462      generate one, so we must be careful to ignore it.  */
   1463   if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
   1464     {
   1465       auxent->u.auxent.x_sym.x_tagndx.p =
   1466 	table_base + auxent->u.auxent.x_sym.x_tagndx.l;
   1467       auxent->fix_tag = 1;
   1468     }
   1469 }
   1470 
   1471 /* Allocate space for the ".debug" section, and read it.
   1472    We did not read the debug section until now, because
   1473    we didn't want to go to the trouble until someone needed it.  */
   1474 
   1475 static char *
   1476 build_debug_section (bfd *abfd)
   1477 {
   1478   char *debug_section;
   1479   file_ptr position;
   1480   bfd_size_type sec_size;
   1481 
   1482   asection *sect = bfd_get_section_by_name (abfd, ".debug");
   1483 
   1484   if (!sect)
   1485     {
   1486       bfd_set_error (bfd_error_no_debug_section);
   1487       return NULL;
   1488     }
   1489 
   1490   sec_size = sect->size;
   1491   debug_section = (char *) bfd_alloc (abfd, sec_size);
   1492   if (debug_section == NULL)
   1493     return NULL;
   1494 
   1495   /* Seek to the beginning of the `.debug' section and read it.
   1496      Save the current position first; it is needed by our caller.
   1497      Then read debug section and reset the file pointer.  */
   1498 
   1499   position = bfd_tell (abfd);
   1500   if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
   1501       || bfd_bread (debug_section, sec_size, abfd) != sec_size
   1502       || bfd_seek (abfd, position, SEEK_SET) != 0)
   1503     return NULL;
   1504   return debug_section;
   1505 }
   1506 
   1507 /* Return a pointer to a malloc'd copy of 'name'.  'name' may not be
   1508    \0-terminated, but will not exceed 'maxlen' characters.  The copy *will*
   1509    be \0-terminated.  */
   1510 
   1511 static char *
   1512 copy_name (bfd *abfd, char *name, size_t maxlen)
   1513 {
   1514   size_t len;
   1515   char *newname;
   1516 
   1517   for (len = 0; len < maxlen; ++len)
   1518     if (name[len] == '\0')
   1519       break;
   1520 
   1521   if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
   1522     return NULL;
   1523 
   1524   strncpy (newname, name, len);
   1525   newname[len] = '\0';
   1526   return newname;
   1527 }
   1528 
   1529 /* Read in the external symbols.  */
   1530 
   1531 bfd_boolean
   1532 _bfd_coff_get_external_symbols (bfd *abfd)
   1533 {
   1534   bfd_size_type symesz;
   1535   bfd_size_type size;
   1536   void * syms;
   1537 
   1538   if (obj_coff_external_syms (abfd) != NULL)
   1539     return TRUE;
   1540 
   1541   symesz = bfd_coff_symesz (abfd);
   1542 
   1543   size = obj_raw_syment_count (abfd) * symesz;
   1544   if (size == 0)
   1545     return TRUE;
   1546 
   1547   syms = bfd_malloc (size);
   1548   if (syms == NULL)
   1549     return FALSE;
   1550 
   1551   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
   1552       || bfd_bread (syms, size, abfd) != size)
   1553     {
   1554       if (syms != NULL)
   1555 	free (syms);
   1556       return FALSE;
   1557     }
   1558 
   1559   obj_coff_external_syms (abfd) = syms;
   1560 
   1561   return TRUE;
   1562 }
   1563 
   1564 /* Read in the external strings.  The strings are not loaded until
   1565    they are needed.  This is because we have no simple way of
   1566    detecting a missing string table in an archive.  */
   1567 
   1568 const char *
   1569 _bfd_coff_read_string_table (bfd *abfd)
   1570 {
   1571   char extstrsize[STRING_SIZE_SIZE];
   1572   bfd_size_type strsize;
   1573   char *strings;
   1574   file_ptr pos;
   1575 
   1576   if (obj_coff_strings (abfd) != NULL)
   1577     return obj_coff_strings (abfd);
   1578 
   1579   if (obj_sym_filepos (abfd) == 0)
   1580     {
   1581       bfd_set_error (bfd_error_no_symbols);
   1582       return NULL;
   1583     }
   1584 
   1585   pos = obj_sym_filepos (abfd);
   1586   pos += obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
   1587   if (bfd_seek (abfd, pos, SEEK_SET) != 0)
   1588     return NULL;
   1589 
   1590   if (bfd_bread (extstrsize, (bfd_size_type) sizeof extstrsize, abfd)
   1591       != sizeof extstrsize)
   1592     {
   1593       if (bfd_get_error () != bfd_error_file_truncated)
   1594 	return NULL;
   1595 
   1596       /* There is no string table.  */
   1597       strsize = STRING_SIZE_SIZE;
   1598     }
   1599   else
   1600     {
   1601 #if STRING_SIZE_SIZE == 4
   1602       strsize = H_GET_32 (abfd, extstrsize);
   1603 #else
   1604  #error Change H_GET_32
   1605 #endif
   1606     }
   1607 
   1608   if (strsize < STRING_SIZE_SIZE)
   1609     {
   1610       (*_bfd_error_handler)
   1611 	(_("%B: bad string table size %lu"), abfd, (unsigned long) strsize);
   1612       bfd_set_error (bfd_error_bad_value);
   1613       return NULL;
   1614     }
   1615 
   1616   strings = (char *) bfd_malloc (strsize);
   1617   if (strings == NULL)
   1618     return NULL;
   1619 
   1620   if (bfd_bread (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
   1621       != strsize - STRING_SIZE_SIZE)
   1622     {
   1623       free (strings);
   1624       return NULL;
   1625     }
   1626 
   1627   obj_coff_strings (abfd) = strings;
   1628 
   1629   return strings;
   1630 }
   1631 
   1632 /* Free up the external symbols and strings read from a COFF file.  */
   1633 
   1634 bfd_boolean
   1635 _bfd_coff_free_symbols (bfd *abfd)
   1636 {
   1637   if (obj_coff_external_syms (abfd) != NULL
   1638       && ! obj_coff_keep_syms (abfd))
   1639     {
   1640       free (obj_coff_external_syms (abfd));
   1641       obj_coff_external_syms (abfd) = NULL;
   1642     }
   1643   if (obj_coff_strings (abfd) != NULL
   1644       && ! obj_coff_keep_strings (abfd))
   1645     {
   1646       free (obj_coff_strings (abfd));
   1647       obj_coff_strings (abfd) = NULL;
   1648     }
   1649   return TRUE;
   1650 }
   1651 
   1652 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
   1653    knit the symbol names into a normalized form.  By normalized here I
   1654    mean that all symbols have an n_offset pointer that points to a null-
   1655    terminated string.  */
   1656 
   1657 combined_entry_type *
   1658 coff_get_normalized_symtab (bfd *abfd)
   1659 {
   1660   combined_entry_type *internal;
   1661   combined_entry_type *internal_ptr;
   1662   combined_entry_type *symbol_ptr;
   1663   combined_entry_type *internal_end;
   1664   size_t symesz;
   1665   char *raw_src;
   1666   char *raw_end;
   1667   const char *string_table = NULL;
   1668   char *debug_section = NULL;
   1669   bfd_size_type size;
   1670 
   1671   if (obj_raw_syments (abfd) != NULL)
   1672     return obj_raw_syments (abfd);
   1673 
   1674   size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
   1675   internal = (combined_entry_type *) bfd_zalloc (abfd, size);
   1676   if (internal == NULL && size != 0)
   1677     return NULL;
   1678   internal_end = internal + obj_raw_syment_count (abfd);
   1679 
   1680   if (! _bfd_coff_get_external_symbols (abfd))
   1681     return NULL;
   1682 
   1683   raw_src = (char *) obj_coff_external_syms (abfd);
   1684 
   1685   /* Mark the end of the symbols.  */
   1686   symesz = bfd_coff_symesz (abfd);
   1687   raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
   1688 
   1689   /* FIXME SOMEDAY.  A string table size of zero is very weird, but
   1690      probably possible.  If one shows up, it will probably kill us.  */
   1691 
   1692   /* Swap all the raw entries.  */
   1693   for (internal_ptr = internal;
   1694        raw_src < raw_end;
   1695        raw_src += symesz, internal_ptr++)
   1696     {
   1697 
   1698       unsigned int i;
   1699       bfd_coff_swap_sym_in (abfd, (void *) raw_src,
   1700 			    (void *) & internal_ptr->u.syment);
   1701       symbol_ptr = internal_ptr;
   1702 
   1703       for (i = 0;
   1704 	   i < symbol_ptr->u.syment.n_numaux;
   1705 	   i++)
   1706 	{
   1707 	  internal_ptr++;
   1708 	  raw_src += symesz;
   1709 	  bfd_coff_swap_aux_in (abfd, (void *) raw_src,
   1710 				symbol_ptr->u.syment.n_type,
   1711 				symbol_ptr->u.syment.n_sclass,
   1712 				(int) i, symbol_ptr->u.syment.n_numaux,
   1713 				&(internal_ptr->u.auxent));
   1714 	  coff_pointerize_aux (abfd, internal, symbol_ptr, i,
   1715 			       internal_ptr);
   1716 	}
   1717     }
   1718 
   1719   /* Free the raw symbols, but not the strings (if we have them).  */
   1720   obj_coff_keep_strings (abfd) = TRUE;
   1721   if (! _bfd_coff_free_symbols (abfd))
   1722     return NULL;
   1723 
   1724   for (internal_ptr = internal; internal_ptr < internal_end;
   1725        internal_ptr++)
   1726     {
   1727       if (internal_ptr->u.syment.n_sclass == C_FILE
   1728 	  && internal_ptr->u.syment.n_numaux > 0)
   1729 	{
   1730 	  /* Make a file symbol point to the name in the auxent, since
   1731 	     the text ".file" is redundant.  */
   1732 	  if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0)
   1733 	    {
   1734 	      /* The filename is a long one, point into the string table.  */
   1735 	      if (string_table == NULL)
   1736 		{
   1737 		  string_table = _bfd_coff_read_string_table (abfd);
   1738 		  if (string_table == NULL)
   1739 		    return NULL;
   1740 		}
   1741 
   1742 	      internal_ptr->u.syment._n._n_n._n_offset =
   1743 		((bfd_hostptr_t)
   1744 		 (string_table
   1745 		  + (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset));
   1746 	    }
   1747 	  else
   1748 	    {
   1749 	      /* Ordinary short filename, put into memory anyway.  The
   1750                  Microsoft PE tools sometimes store a filename in
   1751                  multiple AUX entries.  */
   1752 	      if (internal_ptr->u.syment.n_numaux > 1
   1753 		  && coff_data (abfd)->pe)
   1754 		internal_ptr->u.syment._n._n_n._n_offset =
   1755 		  ((bfd_hostptr_t)
   1756 		   copy_name (abfd,
   1757 			      (internal_ptr + 1)->u.auxent.x_file.x_fname,
   1758 			      internal_ptr->u.syment.n_numaux * symesz));
   1759 	      else
   1760 		internal_ptr->u.syment._n._n_n._n_offset =
   1761 		  ((bfd_hostptr_t)
   1762 		   copy_name (abfd,
   1763 			      (internal_ptr + 1)->u.auxent.x_file.x_fname,
   1764 			      (size_t) bfd_coff_filnmlen (abfd)));
   1765 	    }
   1766 	}
   1767       else
   1768 	{
   1769 	  if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
   1770 	    {
   1771 	      /* This is a "short" name.  Make it long.  */
   1772 	      size_t i;
   1773 	      char *newstring;
   1774 
   1775 	      /* Find the length of this string without walking into memory
   1776 	         that isn't ours.  */
   1777 	      for (i = 0; i < 8; ++i)
   1778 		if (internal_ptr->u.syment._n._n_name[i] == '\0')
   1779 		  break;
   1780 
   1781 	      newstring = (char *) bfd_zalloc (abfd, (bfd_size_type) (i + 1));
   1782 	      if (newstring == NULL)
   1783 		return NULL;
   1784 	      strncpy (newstring, internal_ptr->u.syment._n._n_name, i);
   1785 	      internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) newstring;
   1786 	      internal_ptr->u.syment._n._n_n._n_zeroes = 0;
   1787 	    }
   1788 	  else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
   1789 	    internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
   1790 	  else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
   1791 	    {
   1792 	      /* Long name already.  Point symbol at the string in the
   1793                  table.  */
   1794 	      if (string_table == NULL)
   1795 		{
   1796 		  string_table = _bfd_coff_read_string_table (abfd);
   1797 		  if (string_table == NULL)
   1798 		    return NULL;
   1799 		}
   1800 	      internal_ptr->u.syment._n._n_n._n_offset =
   1801 		((bfd_hostptr_t)
   1802 		 (string_table
   1803 		  + internal_ptr->u.syment._n._n_n._n_offset));
   1804 	    }
   1805 	  else
   1806 	    {
   1807 	      /* Long name in debug section.  Very similar.  */
   1808 	      if (debug_section == NULL)
   1809 		debug_section = build_debug_section (abfd);
   1810 	      internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t)
   1811 		(debug_section + internal_ptr->u.syment._n._n_n._n_offset);
   1812 	    }
   1813 	}
   1814       internal_ptr += internal_ptr->u.syment.n_numaux;
   1815     }
   1816 
   1817   obj_raw_syments (abfd) = internal;
   1818   BFD_ASSERT (obj_raw_syment_count (abfd)
   1819 	      == (unsigned int) (internal_ptr - internal));
   1820 
   1821   return internal;
   1822 }
   1823 
   1824 long
   1825 coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
   1826 {
   1827   if (bfd_get_format (abfd) != bfd_object)
   1828     {
   1829       bfd_set_error (bfd_error_invalid_operation);
   1830       return -1;
   1831     }
   1832   return (asect->reloc_count + 1) * sizeof (arelent *);
   1833 }
   1834 
   1835 asymbol *
   1836 coff_make_empty_symbol (bfd *abfd)
   1837 {
   1838   bfd_size_type amt = sizeof (coff_symbol_type);
   1839   coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt);
   1840 
   1841   if (new_symbol == NULL)
   1842     return NULL;
   1843   new_symbol->symbol.section = 0;
   1844   new_symbol->native = 0;
   1845   new_symbol->lineno = NULL;
   1846   new_symbol->done_lineno = FALSE;
   1847   new_symbol->symbol.the_bfd = abfd;
   1848 
   1849   return & new_symbol->symbol;
   1850 }
   1851 
   1852 /* Make a debugging symbol.  */
   1853 
   1854 asymbol *
   1855 coff_bfd_make_debug_symbol (bfd *abfd,
   1856 			    void * ptr ATTRIBUTE_UNUSED,
   1857 			    unsigned long sz ATTRIBUTE_UNUSED)
   1858 {
   1859   bfd_size_type amt = sizeof (coff_symbol_type);
   1860   coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt);
   1861 
   1862   if (new_symbol == NULL)
   1863     return NULL;
   1864   /* @@ The 10 is a guess at a plausible maximum number of aux entries
   1865      (but shouldn't be a constant).  */
   1866   amt = sizeof (combined_entry_type) * 10;
   1867   new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
   1868   if (!new_symbol->native)
   1869     return NULL;
   1870   new_symbol->symbol.section = bfd_abs_section_ptr;
   1871   new_symbol->symbol.flags = BSF_DEBUGGING;
   1872   new_symbol->lineno = NULL;
   1873   new_symbol->done_lineno = FALSE;
   1874   new_symbol->symbol.the_bfd = abfd;
   1875 
   1876   return & new_symbol->symbol;
   1877 }
   1878 
   1879 void
   1880 coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
   1881 {
   1882   bfd_symbol_info (symbol, ret);
   1883 
   1884   if (coffsymbol (symbol)->native != NULL
   1885       && coffsymbol (symbol)->native->fix_value)
   1886     ret->value = coffsymbol (symbol)->native->u.syment.n_value -
   1887       (bfd_hostptr_t) obj_raw_syments (abfd);
   1888 }
   1889 
   1890 /* Return the COFF syment for a symbol.  */
   1891 
   1892 bfd_boolean
   1893 bfd_coff_get_syment (bfd *abfd,
   1894 		     asymbol *symbol,
   1895 		     struct internal_syment *psyment)
   1896 {
   1897   coff_symbol_type *csym;
   1898 
   1899   csym = coff_symbol_from (abfd, symbol);
   1900   if (csym == NULL || csym->native == NULL)
   1901     {
   1902       bfd_set_error (bfd_error_invalid_operation);
   1903       return FALSE;
   1904     }
   1905 
   1906   *psyment = csym->native->u.syment;
   1907 
   1908   if (csym->native->fix_value)
   1909     psyment->n_value = psyment->n_value -
   1910       (bfd_hostptr_t) obj_raw_syments (abfd);
   1911 
   1912   /* FIXME: We should handle fix_line here.  */
   1913 
   1914   return TRUE;
   1915 }
   1916 
   1917 /* Return the COFF auxent for a symbol.  */
   1918 
   1919 bfd_boolean
   1920 bfd_coff_get_auxent (bfd *abfd,
   1921 		     asymbol *symbol,
   1922 		     int indx,
   1923 		     union internal_auxent *pauxent)
   1924 {
   1925   coff_symbol_type *csym;
   1926   combined_entry_type *ent;
   1927 
   1928   csym = coff_symbol_from (abfd, symbol);
   1929 
   1930   if (csym == NULL
   1931       || csym->native == NULL
   1932       || indx >= csym->native->u.syment.n_numaux)
   1933     {
   1934       bfd_set_error (bfd_error_invalid_operation);
   1935       return FALSE;
   1936     }
   1937 
   1938   ent = csym->native + indx + 1;
   1939 
   1940   *pauxent = ent->u.auxent;
   1941 
   1942   if (ent->fix_tag)
   1943     pauxent->x_sym.x_tagndx.l =
   1944       ((combined_entry_type *) pauxent->x_sym.x_tagndx.p
   1945        - obj_raw_syments (abfd));
   1946 
   1947   if (ent->fix_end)
   1948     pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l =
   1949       ((combined_entry_type *) pauxent->x_sym.x_fcnary.x_fcn.x_endndx.p
   1950        - obj_raw_syments (abfd));
   1951 
   1952   if (ent->fix_scnlen)
   1953     pauxent->x_csect.x_scnlen.l =
   1954       ((combined_entry_type *) pauxent->x_csect.x_scnlen.p
   1955        - obj_raw_syments (abfd));
   1956 
   1957   return TRUE;
   1958 }
   1959 
   1960 /* Print out information about COFF symbol.  */
   1961 
   1962 void
   1963 coff_print_symbol (bfd *abfd,
   1964 		   void * filep,
   1965 		   asymbol *symbol,
   1966 		   bfd_print_symbol_type how)
   1967 {
   1968   FILE * file = (FILE *) filep;
   1969 
   1970   switch (how)
   1971     {
   1972     case bfd_print_symbol_name:
   1973       fprintf (file, "%s", symbol->name);
   1974       break;
   1975 
   1976     case bfd_print_symbol_more:
   1977       fprintf (file, "coff %s %s",
   1978 	       coffsymbol (symbol)->native ? "n" : "g",
   1979 	       coffsymbol (symbol)->lineno ? "l" : " ");
   1980       break;
   1981 
   1982     case bfd_print_symbol_all:
   1983       if (coffsymbol (symbol)->native)
   1984 	{
   1985 	  bfd_vma val;
   1986 	  unsigned int aux;
   1987 	  combined_entry_type *combined = coffsymbol (symbol)->native;
   1988 	  combined_entry_type *root = obj_raw_syments (abfd);
   1989 	  struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
   1990 
   1991 	  fprintf (file, "[%3ld]", (long) (combined - root));
   1992 
   1993 	  if (! combined->fix_value)
   1994 	    val = (bfd_vma) combined->u.syment.n_value;
   1995 	  else
   1996 	    val = combined->u.syment.n_value - (bfd_hostptr_t) root;
   1997 
   1998 	  fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
   1999 		   combined->u.syment.n_scnum,
   2000 		   combined->u.syment.n_flags,
   2001 		   combined->u.syment.n_type,
   2002 		   combined->u.syment.n_sclass,
   2003 		   combined->u.syment.n_numaux);
   2004 	  bfd_fprintf_vma (abfd, file, val);
   2005 	  fprintf (file, " %s", symbol->name);
   2006 
   2007 	  for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
   2008 	    {
   2009 	      combined_entry_type *auxp = combined + aux + 1;
   2010 	      long tagndx;
   2011 
   2012 	      if (auxp->fix_tag)
   2013 		tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
   2014 	      else
   2015 		tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
   2016 
   2017 	      fprintf (file, "\n");
   2018 
   2019 	      if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
   2020 		continue;
   2021 
   2022 	      switch (combined->u.syment.n_sclass)
   2023 		{
   2024 		case C_FILE:
   2025 		  fprintf (file, "File ");
   2026 		  break;
   2027 
   2028 		case C_STAT:
   2029 		  if (combined->u.syment.n_type == T_NULL)
   2030 		    /* Probably a section symbol ?  */
   2031 		    {
   2032 		      fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
   2033 			       (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
   2034 			       auxp->u.auxent.x_scn.x_nreloc,
   2035 			       auxp->u.auxent.x_scn.x_nlinno);
   2036 		      if (auxp->u.auxent.x_scn.x_checksum != 0
   2037 			  || auxp->u.auxent.x_scn.x_associated != 0
   2038 			  || auxp->u.auxent.x_scn.x_comdat != 0)
   2039 			fprintf (file, " checksum 0x%lx assoc %d comdat %d",
   2040 				 auxp->u.auxent.x_scn.x_checksum,
   2041 				 auxp->u.auxent.x_scn.x_associated,
   2042 				 auxp->u.auxent.x_scn.x_comdat);
   2043 		      break;
   2044 		    }
   2045 		    /* Otherwise fall through.  */
   2046 		case C_EXT:
   2047 		case C_AIX_WEAKEXT:
   2048 		  if (ISFCN (combined->u.syment.n_type))
   2049 		    {
   2050 		      long next, llnos;
   2051 
   2052 		      if (auxp->fix_end)
   2053 			next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
   2054 			       - root);
   2055 		      else
   2056 			next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
   2057 		      llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
   2058 		      fprintf (file,
   2059 			       "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
   2060 			       tagndx,
   2061 			       (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
   2062 			       llnos, next);
   2063 		      break;
   2064 		    }
   2065 		  /* Otherwise fall through.  */
   2066 		default:
   2067 		  fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
   2068 			   auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
   2069 			   auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
   2070 			   tagndx);
   2071 		  if (auxp->fix_end)
   2072 		    fprintf (file, " endndx %ld",
   2073 			     ((long)
   2074 			      (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
   2075 			       - root)));
   2076 		  break;
   2077 		}
   2078 	    }
   2079 
   2080 	  if (l)
   2081 	    {
   2082 	      fprintf (file, "\n%s :", l->u.sym->name);
   2083 	      l++;
   2084 	      while (l->line_number)
   2085 		{
   2086 		  fprintf (file, "\n%4d : ", l->line_number);
   2087 		  bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
   2088 		  l++;
   2089 		}
   2090 	    }
   2091 	}
   2092       else
   2093 	{
   2094 	  bfd_print_symbol_vandf (abfd, (void *) file, symbol);
   2095 	  fprintf (file, " %-5s %s %s %s",
   2096 		   symbol->section->name,
   2097 		   coffsymbol (symbol)->native ? "n" : "g",
   2098 		   coffsymbol (symbol)->lineno ? "l" : " ",
   2099 		   symbol->name);
   2100 	}
   2101     }
   2102 }
   2103 
   2104 /* Return whether a symbol name implies a local symbol.  In COFF,
   2105    local symbols generally start with ``.L''.  Most targets use this
   2106    function for the is_local_label_name entry point, but some may
   2107    override it.  */
   2108 
   2109 bfd_boolean
   2110 _bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
   2111 			       const char *name)
   2112 {
   2113   return name[0] == '.' && name[1] == 'L';
   2114 }
   2115 
   2116 /* Provided a BFD, a section and an offset (in bytes, not octets) into the
   2117    section, calculate and return the name of the source file and the line
   2118    nearest to the wanted location.  */
   2119 
   2120 bfd_boolean
   2121 coff_find_nearest_line_with_names (bfd *abfd,
   2122                                    const struct dwarf_debug_section *debug_sections,
   2123                                    asection *section,
   2124                                    asymbol **symbols,
   2125                                    bfd_vma offset,
   2126                                    const char **filename_ptr,
   2127                                    const char **functionname_ptr,
   2128                                    unsigned int *line_ptr)
   2129 {
   2130   bfd_boolean found;
   2131   unsigned int i;
   2132   unsigned int line_base;
   2133   coff_data_type *cof = coff_data (abfd);
   2134   /* Run through the raw syments if available.  */
   2135   combined_entry_type *p;
   2136   combined_entry_type *pend;
   2137   alent *l;
   2138   struct coff_section_tdata *sec_data;
   2139   bfd_size_type amt;
   2140 
   2141   /* Before looking through the symbol table, try to use a .stab
   2142      section to find the information.  */
   2143   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
   2144 					     &found, filename_ptr,
   2145 					     functionname_ptr, line_ptr,
   2146 					     &coff_data(abfd)->line_info))
   2147     return FALSE;
   2148 
   2149   if (found)
   2150     return TRUE;
   2151 
   2152   /* Also try examining DWARF2 debugging information.  */
   2153   if (_bfd_dwarf2_find_nearest_line (abfd, debug_sections,
   2154                                      section, symbols, offset,
   2155 				     filename_ptr, functionname_ptr,
   2156 				     line_ptr, NULL, 0,
   2157 				     &coff_data(abfd)->dwarf2_find_line_info))
   2158     return TRUE;
   2159 
   2160   *filename_ptr = 0;
   2161   *functionname_ptr = 0;
   2162   *line_ptr = 0;
   2163 
   2164   /* Don't try and find line numbers in a non coff file.  */
   2165   if (!bfd_family_coff (abfd))
   2166     return FALSE;
   2167 
   2168   if (cof == NULL)
   2169     return FALSE;
   2170 
   2171   /* Find the first C_FILE symbol.  */
   2172   p = cof->raw_syments;
   2173   if (!p)
   2174     return FALSE;
   2175 
   2176   pend = p + cof->raw_syment_count;
   2177   while (p < pend)
   2178     {
   2179       if (p->u.syment.n_sclass == C_FILE)
   2180 	break;
   2181       p += 1 + p->u.syment.n_numaux;
   2182     }
   2183 
   2184   if (p < pend)
   2185     {
   2186       bfd_vma sec_vma;
   2187       bfd_vma maxdiff;
   2188 
   2189       /* Look through the C_FILE symbols to find the best one.  */
   2190       sec_vma = bfd_get_section_vma (abfd, section);
   2191       *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
   2192       maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
   2193       while (1)
   2194 	{
   2195 	  bfd_vma file_addr;
   2196 	  combined_entry_type *p2;
   2197 
   2198 	  for (p2 = p + 1 + p->u.syment.n_numaux;
   2199 	       p2 < pend;
   2200 	       p2 += 1 + p2->u.syment.n_numaux)
   2201 	    {
   2202 	      if (p2->u.syment.n_scnum > 0
   2203 		  && (section
   2204 		      == coff_section_from_bfd_index (abfd,
   2205 						      p2->u.syment.n_scnum)))
   2206 		break;
   2207 	      if (p2->u.syment.n_sclass == C_FILE)
   2208 		{
   2209 		  p2 = pend;
   2210 		  break;
   2211 		}
   2212 	    }
   2213 
   2214 	  file_addr = (bfd_vma) p2->u.syment.n_value;
   2215 	  /* PR 11512: Include the section address of the function name symbol.  */
   2216 	  if (p2->u.syment.n_scnum > 0)
   2217 	    file_addr += coff_section_from_bfd_index (abfd,
   2218 						      p2->u.syment.n_scnum)->vma;
   2219 	  /* We use <= MAXDIFF here so that if we get a zero length
   2220              file, we actually use the next file entry.  */
   2221 	  if (p2 < pend
   2222 	      && offset + sec_vma >= file_addr
   2223 	      && offset + sec_vma - file_addr <= maxdiff)
   2224 	    {
   2225 	      *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
   2226 	      maxdiff = offset + sec_vma - p2->u.syment.n_value;
   2227 	    }
   2228 
   2229 	  /* Avoid endless loops on erroneous files by ensuring that
   2230 	     we always move forward in the file.  */
   2231 	  if (p >= cof->raw_syments + p->u.syment.n_value)
   2232 	    break;
   2233 
   2234 	  p = cof->raw_syments + p->u.syment.n_value;
   2235 	  if (p > pend || p->u.syment.n_sclass != C_FILE)
   2236 	    break;
   2237 	}
   2238     }
   2239 
   2240   /* Now wander though the raw linenumbers of the section.  */
   2241   /* If we have been called on this section before, and the offset we
   2242      want is further down then we can prime the lookup loop.  */
   2243   sec_data = coff_section_data (abfd, section);
   2244   if (sec_data != NULL
   2245       && sec_data->i > 0
   2246       && offset >= sec_data->offset)
   2247     {
   2248       i = sec_data->i;
   2249       *functionname_ptr = sec_data->function;
   2250       line_base = sec_data->line_base;
   2251     }
   2252   else
   2253     {
   2254       i = 0;
   2255       line_base = 0;
   2256     }
   2257 
   2258   if (section->lineno != NULL)
   2259     {
   2260       bfd_vma last_value = 0;
   2261 
   2262       l = &section->lineno[i];
   2263 
   2264       for (; i < section->lineno_count; i++)
   2265 	{
   2266 	  if (l->line_number == 0)
   2267 	    {
   2268 	      /* Get the symbol this line number points at.  */
   2269 	      coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
   2270 	      if (coff->symbol.value > offset)
   2271 		break;
   2272 	      *functionname_ptr = coff->symbol.name;
   2273 	      last_value = coff->symbol.value;
   2274 	      if (coff->native)
   2275 		{
   2276 		  combined_entry_type *s = coff->native;
   2277 		  s = s + 1 + s->u.syment.n_numaux;
   2278 
   2279 		  /* In XCOFF a debugging symbol can follow the
   2280 		     function symbol.  */
   2281 		  if (s->u.syment.n_scnum == N_DEBUG)
   2282 		    s = s + 1 + s->u.syment.n_numaux;
   2283 
   2284 		  /* S should now point to the .bf of the function.  */
   2285 		  if (s->u.syment.n_numaux)
   2286 		    {
   2287 		      /* The linenumber is stored in the auxent.  */
   2288 		      union internal_auxent *a = &((s + 1)->u.auxent);
   2289 		      line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
   2290 		      *line_ptr = line_base;
   2291 		    }
   2292 		}
   2293 	    }
   2294 	  else
   2295 	    {
   2296 	      if (l->u.offset > offset)
   2297 		break;
   2298 	      *line_ptr = l->line_number + line_base - 1;
   2299 	    }
   2300 	  l++;
   2301 	}
   2302 
   2303       /* If we fell off the end of the loop, then assume that this
   2304 	 symbol has no line number info.  Otherwise, symbols with no
   2305 	 line number info get reported with the line number of the
   2306 	 last line of the last symbol which does have line number
   2307 	 info.  We use 0x100 as a slop to account for cases where the
   2308 	 last line has executable code.  */
   2309       if (i >= section->lineno_count
   2310 	  && last_value != 0
   2311 	  && offset - last_value > 0x100)
   2312 	{
   2313 	  *functionname_ptr = NULL;
   2314 	  *line_ptr = 0;
   2315 	}
   2316     }
   2317 
   2318   /* Cache the results for the next call.  */
   2319   if (sec_data == NULL && section->owner == abfd)
   2320     {
   2321       amt = sizeof (struct coff_section_tdata);
   2322       section->used_by_bfd = bfd_zalloc (abfd, amt);
   2323       sec_data = (struct coff_section_tdata *) section->used_by_bfd;
   2324     }
   2325   if (sec_data != NULL)
   2326     {
   2327       sec_data->offset = offset;
   2328       sec_data->i = i - 1;
   2329       sec_data->function = *functionname_ptr;
   2330       sec_data->line_base = line_base;
   2331     }
   2332 
   2333   return TRUE;
   2334 }
   2335 
   2336 bfd_boolean
   2337 coff_find_nearest_line (bfd *abfd,
   2338 			asection *section,
   2339 			asymbol **symbols,
   2340 			bfd_vma offset,
   2341 			const char **filename_ptr,
   2342 			const char **functionname_ptr,
   2343 			unsigned int *line_ptr)
   2344 {
   2345   return coff_find_nearest_line_with_names (abfd, dwarf_debug_sections,
   2346                                             section, symbols, offset,
   2347                                             filename_ptr, functionname_ptr,
   2348                                             line_ptr);
   2349 }
   2350 
   2351 bfd_boolean
   2352 coff_find_inliner_info (bfd *abfd,
   2353 			const char **filename_ptr,
   2354 			const char **functionname_ptr,
   2355 			unsigned int *line_ptr)
   2356 {
   2357   bfd_boolean found;
   2358 
   2359   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
   2360 					 functionname_ptr, line_ptr,
   2361 					 &coff_data(abfd)->dwarf2_find_line_info);
   2362   return (found);
   2363 }
   2364 
   2365 int
   2366 coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
   2367 {
   2368   size_t size;
   2369 
   2370   if (!info->relocatable)
   2371     size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
   2372   else
   2373     size = bfd_coff_filhsz (abfd);
   2374 
   2375   size += abfd->section_count * bfd_coff_scnhsz (abfd);
   2376   return size;
   2377 }
   2378 
   2379 /* Change the class of a coff symbol held by BFD.  */
   2380 
   2381 bfd_boolean
   2382 bfd_coff_set_symbol_class (bfd *         abfd,
   2383 			   asymbol *     symbol,
   2384 			   unsigned int  symbol_class)
   2385 {
   2386   coff_symbol_type * csym;
   2387 
   2388   csym = coff_symbol_from (abfd, symbol);
   2389   if (csym == NULL)
   2390     {
   2391       bfd_set_error (bfd_error_invalid_operation);
   2392       return FALSE;
   2393     }
   2394   else if (csym->native == NULL)
   2395     {
   2396       /* This is an alien symbol which no native coff backend data.
   2397 	 We cheat here by creating a fake native entry for it and
   2398 	 then filling in the class.  This code is based on that in
   2399 	 coff_write_alien_symbol().  */
   2400 
   2401       combined_entry_type * native;
   2402       bfd_size_type amt = sizeof (* native);
   2403 
   2404       native = (combined_entry_type *) bfd_zalloc (abfd, amt);
   2405       if (native == NULL)
   2406 	return FALSE;
   2407 
   2408       native->u.syment.n_type   = T_NULL;
   2409       native->u.syment.n_sclass = symbol_class;
   2410 
   2411       if (bfd_is_und_section (symbol->section))
   2412 	{
   2413 	  native->u.syment.n_scnum = N_UNDEF;
   2414 	  native->u.syment.n_value = symbol->value;
   2415 	}
   2416       else if (bfd_is_com_section (symbol->section))
   2417 	{
   2418 	  native->u.syment.n_scnum = N_UNDEF;
   2419 	  native->u.syment.n_value = symbol->value;
   2420 	}
   2421       else
   2422 	{
   2423 	  native->u.syment.n_scnum =
   2424 	    symbol->section->output_section->target_index;
   2425 	  native->u.syment.n_value = (symbol->value
   2426 				      + symbol->section->output_offset);
   2427 	  if (! obj_pe (abfd))
   2428 	    native->u.syment.n_value += symbol->section->output_section->vma;
   2429 
   2430 	  /* Copy the any flags from the file header into the symbol.
   2431 	     FIXME: Why?  */
   2432 	  native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
   2433 	}
   2434 
   2435       csym->native = native;
   2436     }
   2437   else
   2438     csym->native->u.syment.n_sclass = symbol_class;
   2439 
   2440   return TRUE;
   2441 }
   2442 
   2443 struct coff_comdat_info *
   2444 bfd_coff_get_comdat_section (bfd *abfd, struct bfd_section *sec)
   2445 {
   2446   if (bfd_get_flavour (abfd) == bfd_target_coff_flavour
   2447       && coff_section_data (abfd, sec) != NULL)
   2448     return coff_section_data (abfd, sec)->comdat;
   2449   else
   2450     return NULL;
   2451 }
   2452 
   2453 bfd_boolean
   2454 _bfd_coff_section_already_linked (bfd *abfd,
   2455 				  asection *sec,
   2456 				  struct bfd_link_info *info)
   2457 {
   2458   flagword flags;
   2459   const char *name, *key;
   2460   struct bfd_section_already_linked *l;
   2461   struct bfd_section_already_linked_hash_entry *already_linked_list;
   2462   struct coff_comdat_info *s_comdat;
   2463 
   2464   flags = sec->flags;
   2465   if ((flags & SEC_LINK_ONCE) == 0)
   2466     return FALSE;
   2467 
   2468   /* The COFF backend linker doesn't support group sections.  */
   2469   if ((flags & SEC_GROUP) != 0)
   2470     return FALSE;
   2471 
   2472   name = bfd_get_section_name (abfd, sec);
   2473   s_comdat = bfd_coff_get_comdat_section (abfd, sec);
   2474 
   2475   if (s_comdat != NULL)
   2476     key = s_comdat->name;
   2477   else
   2478     {
   2479       if (CONST_STRNEQ (name, ".gnu.linkonce.")
   2480 	  && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL)
   2481 	key++;
   2482       else
   2483 	/* FIXME: gcc as of 2011-09 emits sections like .text$<key>,
   2484 	   .xdata$<key> and .pdata$<key> only the first of which has a
   2485 	   comdat key.  Should these all match the LTO IR key?  */
   2486 	key = name;
   2487     }
   2488 
   2489   already_linked_list = bfd_section_already_linked_table_lookup (key);
   2490 
   2491   for (l = already_linked_list->entry; l != NULL; l = l->next)
   2492     {
   2493       struct coff_comdat_info *l_comdat;
   2494 
   2495       l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec);
   2496 
   2497       /* The section names must match, and both sections must be
   2498 	 comdat and have the same comdat name, or both sections must
   2499 	 be non-comdat.  LTO IR plugin sections are an exception.  They
   2500 	 are always named .gnu.linkonce.t.<key> (<key> is some string)
   2501 	 and match any comdat section with comdat name of <key>, and
   2502 	 any linkonce section with the same suffix, ie.
   2503 	 .gnu.linkonce.*.<key>.  */
   2504       if (((s_comdat != NULL) == (l_comdat != NULL)
   2505 	   && strcmp (name, l->sec->name) == 0)
   2506 	  || (l->sec->owner->flags & BFD_PLUGIN) != 0)
   2507 	{
   2508 	  /* The section has already been linked.  See if we should
   2509 	     issue a warning.  */
   2510 	  return _bfd_handle_already_linked (sec, l, info);
   2511 	}
   2512     }
   2513 
   2514   /* This is the first section with this name.  Record it.  */
   2515   if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
   2516     info->callbacks->einfo (_("%F%P: already_linked_table: %E\n"));
   2517   return FALSE;
   2518 }
   2519