Home | History | Annotate | Line # | Download | only in bfd
coffgen.c revision 1.10
      1   1.1  christos /* Support for the generic parts of COFF, for BFD.
      2  1.10  christos    Copyright (C) 1990-2025 Free Software Foundation, Inc.
      3   1.1  christos    Written by Cygnus Support.
      4   1.1  christos 
      5   1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      6   1.1  christos 
      7   1.1  christos    This program is free software; you can redistribute it and/or modify
      8   1.1  christos    it under the terms of the GNU General Public License as published by
      9   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos    (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    This program is distributed in the hope that it will be useful,
     13   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos    GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this program; if not, write to the Free Software
     19   1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20   1.1  christos    MA 02110-1301, USA.  */
     21   1.1  christos 
     22   1.1  christos /* Most of this hacked by  Steve Chamberlain, sac (at) cygnus.com.
     23   1.1  christos    Split out of coffcode.h by Ian Taylor, ian (at) cygnus.com.  */
     24   1.1  christos 
     25   1.1  christos /* This file contains COFF code that is not dependent on any
     26   1.1  christos    particular COFF target.  There is only one version of this file in
     27   1.1  christos    libbfd.a, so no target specific code may be put in here.  Or, to
     28   1.1  christos    put it another way,
     29   1.1  christos 
     30   1.1  christos    ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
     31   1.1  christos 
     32   1.1  christos    If you need to add some target specific behaviour, add a new hook
     33   1.1  christos    function to bfd_coff_backend_data.
     34   1.1  christos 
     35   1.1  christos    Some of these functions are also called by the ECOFF routines.
     36   1.1  christos    Those functions may not use any COFF specific information, such as
     37   1.1  christos    coff_data (abfd).  */
     38   1.1  christos 
     39   1.1  christos #include "sysdep.h"
     40   1.7  christos #include <limits.h>
     41   1.1  christos #include "bfd.h"
     42   1.1  christos #include "libbfd.h"
     43   1.1  christos #include "coff/internal.h"
     44   1.1  christos #include "libcoff.h"
     45  1.10  christos #include "elf-bfd.h"
     46   1.9  christos #include "hashtab.h"
     47  1.10  christos #include "safe-ctype.h"
     48   1.9  christos 
     49   1.9  christos /* Extract a long section name at STRINDEX and copy it to the bfd objstack.
     50   1.9  christos    Return NULL in case of error.  */
     51   1.9  christos 
     52   1.9  christos static char *
     53   1.9  christos extract_long_section_name(bfd *abfd, unsigned long strindex)
     54   1.9  christos {
     55   1.9  christos   const char *strings;
     56   1.9  christos   char *name;
     57   1.9  christos 
     58   1.9  christos   strings = _bfd_coff_read_string_table (abfd);
     59   1.9  christos   if (strings == NULL)
     60   1.9  christos     return NULL;
     61   1.9  christos   if ((bfd_size_type)(strindex + 2) >= obj_coff_strings_len (abfd))
     62   1.9  christos     return NULL;
     63   1.9  christos   strings += strindex;
     64   1.9  christos   name = (char *) bfd_alloc (abfd, (bfd_size_type) strlen (strings) + 1);
     65   1.9  christos   if (name == NULL)
     66   1.9  christos     return NULL;
     67   1.9  christos   strcpy (name, strings);
     68   1.9  christos 
     69   1.9  christos   return name;
     70   1.9  christos }
     71   1.9  christos 
     72   1.9  christos /* Decode a base 64 coded string at STR of length LEN, and write the result
     73   1.9  christos    to RES.  Return true on success.
     74   1.9  christos    Return false in case of invalid character or overflow.  */
     75   1.9  christos 
     76   1.9  christos static bool
     77   1.9  christos decode_base64 (const char *str, unsigned len, uint32_t *res)
     78   1.9  christos {
     79   1.9  christos   unsigned i;
     80   1.9  christos   uint32_t val;
     81   1.9  christos 
     82   1.9  christos   val = 0;
     83   1.9  christos   for (i = 0; i < len; i++)
     84   1.9  christos     {
     85   1.9  christos       char c = str[i];
     86   1.9  christos       unsigned d;
     87   1.9  christos 
     88   1.9  christos       if (c >= 'A' && c <= 'Z')
     89   1.9  christos 	d = c - 'A';
     90   1.9  christos       else if (c >= 'a' && c <= 'z')
     91   1.9  christos 	d = c - 'a' + 26;
     92   1.9  christos       else if (c >= '0' && c <= '9')
     93   1.9  christos 	d = c - '0' + 52;
     94   1.9  christos       else if (c == '+')
     95   1.9  christos 	d = 62;
     96   1.9  christos       else if (c == '/')
     97   1.9  christos 	d = 63;
     98   1.9  christos       else
     99   1.9  christos 	return false;
    100   1.9  christos 
    101   1.9  christos       /* Check for overflow. */
    102   1.9  christos       if ((val >> 26) != 0)
    103   1.9  christos 	return false;
    104   1.9  christos 
    105   1.9  christos       val = (val << 6) + d;
    106   1.9  christos     }
    107   1.9  christos 
    108   1.9  christos   *res = val;
    109   1.9  christos   return true;
    110   1.9  christos }
    111   1.1  christos 
    112   1.1  christos /* Take a section header read from a coff file (in HOST byte order),
    113   1.1  christos    and make a BFD "section" out of it.  This is used by ECOFF.  */
    114   1.1  christos 
    115   1.8  christos static bool
    116   1.1  christos make_a_section_from_file (bfd *abfd,
    117   1.1  christos 			  struct internal_scnhdr *hdr,
    118   1.1  christos 			  unsigned int target_index)
    119   1.1  christos {
    120   1.9  christos   asection *newsect;
    121   1.1  christos   char *name;
    122   1.8  christos   bool result = true;
    123   1.1  christos   flagword flags;
    124   1.1  christos 
    125   1.1  christos   name = NULL;
    126   1.1  christos 
    127   1.1  christos   /* Handle long section names as in PE.  On reading, we want to
    128   1.1  christos     accept long names if the format permits them at all, regardless
    129   1.1  christos     of the current state of the flag that dictates if we would generate
    130   1.1  christos     them in outputs; this construct checks if that is the case by
    131   1.1  christos     attempting to set the flag, without changing its state; the call
    132   1.1  christos     will fail for formats that do not support long names at all.  */
    133   1.1  christos   if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd))
    134   1.1  christos       && hdr->s_name[0] == '/')
    135   1.1  christos     {
    136   1.1  christos       /* Flag that this BFD uses long names, even though the format might
    137   1.6  christos 	 expect them to be off by default.  This won't directly affect the
    138   1.6  christos 	 format of any output BFD created from this one, but the information
    139   1.6  christos 	 can be used to decide what to do.  */
    140   1.8  christos       bfd_coff_set_long_section_names (abfd, true);
    141   1.9  christos 
    142   1.9  christos       if (hdr->s_name[1] == '/')
    143   1.1  christos 	{
    144   1.9  christos 	  /* LLVM extension: the '/' is followed by another '/' and then by
    145   1.9  christos 	     the index in the strtab encoded in base64 without NUL at the
    146   1.9  christos 	     end.  */
    147   1.9  christos 	  uint32_t strindex;
    148   1.9  christos 
    149   1.9  christos 	  /* Decode the index.  No overflow is expected as the string table
    150   1.9  christos 	     length is at most 2^32 - 1 (the length is written on the first
    151   1.9  christos 	     four bytes).
    152   1.9  christos 	     Also, contrary to RFC 4648, all the characters must be decoded,
    153   1.9  christos 	     there is no padding.  */
    154   1.9  christos 	  if (!decode_base64 (hdr->s_name + 2, SCNNMLEN - 2, &strindex))
    155   1.8  christos 	    return false;
    156   1.9  christos 
    157   1.9  christos 	  name = extract_long_section_name (abfd, strindex);
    158   1.1  christos 	  if (name == NULL)
    159   1.8  christos 	    return false;
    160   1.9  christos 	}
    161   1.9  christos       else
    162   1.9  christos 	{
    163   1.9  christos 	  /* PE classic long section name.  The '/' is followed by the index
    164   1.9  christos 	     in the strtab.  The index is formatted as a decimal string.  */
    165   1.9  christos 	  char buf[SCNNMLEN];
    166   1.9  christos 	  long strindex;
    167   1.9  christos 	  char *p;
    168   1.9  christos 
    169   1.9  christos 	  memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
    170   1.9  christos 	  buf[SCNNMLEN - 1] = '\0';
    171   1.9  christos 	  strindex = strtol (buf, &p, 10);
    172   1.9  christos 	  if (*p == '\0' && strindex >= 0)
    173   1.9  christos 	    {
    174   1.9  christos 	      name = extract_long_section_name (abfd, strindex);
    175   1.9  christos 	      if (name == NULL)
    176   1.9  christos 		return false;
    177   1.9  christos 	    }
    178   1.1  christos 	}
    179   1.1  christos     }
    180   1.1  christos 
    181   1.1  christos   if (name == NULL)
    182   1.1  christos     {
    183   1.1  christos       /* Assorted wastage to null-terminate the name, thanks AT&T! */
    184   1.1  christos       name = (char *) bfd_alloc (abfd,
    185   1.6  christos 				 (bfd_size_type) sizeof (hdr->s_name) + 1 + 1);
    186   1.1  christos       if (name == NULL)
    187   1.8  christos 	return false;
    188   1.1  christos       strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
    189   1.1  christos       name[sizeof (hdr->s_name)] = 0;
    190   1.1  christos     }
    191   1.1  christos 
    192   1.9  christos   newsect = bfd_make_section_anyway (abfd, name);
    193   1.9  christos   if (newsect == NULL)
    194   1.8  christos     return false;
    195   1.1  christos 
    196   1.9  christos   newsect->vma = hdr->s_vaddr;
    197   1.9  christos   newsect->lma = hdr->s_paddr;
    198   1.9  christos   newsect->size = hdr->s_size;
    199   1.9  christos   newsect->filepos = hdr->s_scnptr;
    200   1.9  christos   newsect->rel_filepos = hdr->s_relptr;
    201   1.9  christos   newsect->reloc_count = hdr->s_nreloc;
    202   1.9  christos 
    203   1.9  christos   bfd_coff_set_alignment_hook (abfd, newsect, hdr);
    204   1.9  christos 
    205   1.9  christos   newsect->line_filepos = hdr->s_lnnoptr;
    206   1.9  christos 
    207   1.9  christos   newsect->lineno_count = hdr->s_nlnno;
    208   1.9  christos   newsect->userdata = NULL;
    209   1.9  christos   newsect->next = NULL;
    210   1.9  christos   newsect->target_index = target_index;
    211   1.1  christos 
    212   1.9  christos   if (!bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, newsect, &flags))
    213   1.8  christos     result = false;
    214   1.1  christos 
    215   1.1  christos   /* At least on i386-coff, the line number count for a shared library
    216   1.1  christos      section must be ignored.  */
    217   1.9  christos   if ((flags & SEC_COFF_SHARED_LIBRARY) != 0)
    218   1.9  christos     newsect->lineno_count = 0;
    219   1.1  christos 
    220   1.1  christos   if (hdr->s_nreloc != 0)
    221   1.9  christos     flags |= SEC_RELOC;
    222   1.1  christos   /* FIXME: should this check 'hdr->s_size > 0'.  */
    223   1.1  christos   if (hdr->s_scnptr != 0)
    224   1.9  christos     flags |= SEC_HAS_CONTENTS;
    225   1.1  christos 
    226   1.9  christos   newsect->flags = flags;
    227   1.9  christos 
    228   1.9  christos   /* Compress/decompress DWARF debug sections.  */
    229   1.9  christos   if ((flags & SEC_DEBUGGING) != 0
    230   1.9  christos       && (flags & SEC_HAS_CONTENTS) != 0
    231   1.9  christos       && (startswith (name, ".debug_")
    232   1.9  christos 	  || startswith (name, ".zdebug_")
    233   1.9  christos 	  || startswith (name, ".gnu.debuglto_.debug_")
    234   1.9  christos 	  || startswith (name, ".gnu.linkonce.wi.")))
    235   1.3  christos     {
    236   1.3  christos       enum { nothing, compress, decompress } action = nothing;
    237   1.3  christos 
    238   1.9  christos       if (bfd_is_section_compressed (abfd, newsect))
    239   1.3  christos 	{
    240   1.3  christos 	  /* Compressed section.  Check if we should decompress.  */
    241   1.3  christos 	  if ((abfd->flags & BFD_DECOMPRESS))
    242   1.3  christos 	    action = decompress;
    243   1.3  christos 	}
    244   1.9  christos       else
    245   1.3  christos 	{
    246   1.3  christos 	  /* Normal section.  Check if we should compress.  */
    247   1.9  christos 	  if ((abfd->flags & BFD_COMPRESS) && newsect->size != 0)
    248   1.3  christos 	    action = compress;
    249   1.3  christos 	}
    250   1.3  christos 
    251   1.9  christos       if (action == compress)
    252   1.3  christos 	{
    253   1.9  christos 	  if (!bfd_init_section_compress_status (abfd, newsect))
    254   1.3  christos 	    {
    255   1.6  christos 	      _bfd_error_handler
    256   1.9  christos 		/* xgettext:c-format */
    257   1.9  christos 		(_("%pB: unable to compress section %s"), abfd, name);
    258   1.8  christos 	      return false;
    259   1.3  christos 	    }
    260   1.9  christos 	}
    261   1.9  christos       else if (action == decompress)
    262   1.9  christos 	{
    263   1.9  christos 	  if (!bfd_init_section_decompress_status (abfd, newsect))
    264   1.3  christos 	    {
    265   1.6  christos 	      _bfd_error_handler
    266   1.9  christos 		/* xgettext:c-format */
    267   1.9  christos 		(_("%pB: unable to decompress section %s"), abfd, name);
    268   1.8  christos 	      return false;
    269   1.3  christos 	    }
    270   1.9  christos 	  if (abfd->is_linker_input
    271   1.9  christos 	      && name[1] == 'z')
    272   1.3  christos 	    {
    273   1.9  christos 	      /* Rename section from .zdebug_* to .debug_* so that ld
    274   1.9  christos 		 scripts will see this section as a debug section.  */
    275   1.9  christos 	      char *new_name = bfd_zdebug_name_to_debug (abfd, name);
    276   1.3  christos 	      if (new_name == NULL)
    277   1.8  christos 		return false;
    278   1.9  christos 	      bfd_rename_section (newsect, new_name);
    279   1.3  christos 	    }
    280   1.3  christos 	}
    281   1.3  christos     }
    282   1.3  christos 
    283   1.1  christos   return result;
    284   1.1  christos }
    285   1.1  christos 
    286   1.9  christos void
    287   1.9  christos coff_object_cleanup (bfd *abfd)
    288   1.9  christos {
    289   1.9  christos   struct coff_tdata *td = coff_data (abfd);
    290   1.9  christos   if (td != NULL)
    291   1.9  christos     {
    292   1.9  christos       if (td->section_by_index)
    293   1.9  christos 	htab_delete (td->section_by_index);
    294   1.9  christos       if (td->section_by_target_index)
    295   1.9  christos 	htab_delete (td->section_by_target_index);
    296   1.9  christos       if (obj_pe (abfd) && pe_data (abfd)->comdat_hash)
    297   1.9  christos 	htab_delete (pe_data (abfd)->comdat_hash);
    298   1.9  christos     }
    299   1.9  christos }
    300   1.9  christos 
    301   1.1  christos /* Read in a COFF object and make it into a BFD.  This is used by
    302   1.1  christos    ECOFF as well.  */
    303   1.8  christos bfd_cleanup
    304   1.1  christos coff_real_object_p (bfd *abfd,
    305   1.1  christos 		    unsigned nscns,
    306   1.1  christos 		    struct internal_filehdr *internal_f,
    307   1.1  christos 		    struct internal_aouthdr *internal_a)
    308   1.1  christos {
    309   1.1  christos   flagword oflags = abfd->flags;
    310   1.1  christos   bfd_vma ostart = bfd_get_start_address (abfd);
    311   1.1  christos   void * tdata;
    312   1.1  christos   bfd_size_type readsize;	/* Length of file_info.  */
    313   1.1  christos   unsigned int scnhsz;
    314   1.1  christos   char *external_sections;
    315   1.1  christos 
    316   1.1  christos   if (!(internal_f->f_flags & F_RELFLG))
    317   1.1  christos     abfd->flags |= HAS_RELOC;
    318   1.1  christos   if ((internal_f->f_flags & F_EXEC))
    319   1.1  christos     abfd->flags |= EXEC_P;
    320   1.1  christos   if (!(internal_f->f_flags & F_LNNO))
    321   1.1  christos     abfd->flags |= HAS_LINENO;
    322   1.1  christos   if (!(internal_f->f_flags & F_LSYMS))
    323   1.1  christos     abfd->flags |= HAS_LOCALS;
    324   1.1  christos 
    325   1.1  christos   /* FIXME: How can we set D_PAGED correctly?  */
    326   1.1  christos   if ((internal_f->f_flags & F_EXEC) != 0)
    327   1.1  christos     abfd->flags |= D_PAGED;
    328   1.1  christos 
    329   1.7  christos   abfd->symcount = internal_f->f_nsyms;
    330   1.1  christos   if (internal_f->f_nsyms)
    331   1.1  christos     abfd->flags |= HAS_SYMS;
    332   1.1  christos 
    333   1.1  christos   if (internal_a != (struct internal_aouthdr *) NULL)
    334   1.7  christos     abfd->start_address = internal_a->entry;
    335   1.1  christos   else
    336   1.7  christos     abfd->start_address = 0;
    337   1.1  christos 
    338   1.1  christos   /* Set up the tdata area.  ECOFF uses its own routine, and overrides
    339   1.1  christos      abfd->flags.  */
    340   1.1  christos   tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
    341   1.1  christos   if (tdata == NULL)
    342   1.1  christos     goto fail2;
    343   1.1  christos 
    344   1.1  christos   scnhsz = bfd_coff_scnhsz (abfd);
    345   1.1  christos   readsize = (bfd_size_type) nscns * scnhsz;
    346   1.8  christos   external_sections = (char *) _bfd_alloc_and_read (abfd, readsize, readsize);
    347   1.1  christos   if (!external_sections)
    348   1.1  christos     goto fail;
    349   1.1  christos 
    350   1.1  christos   /* Set the arch/mach *before* swapping in sections; section header swapping
    351   1.1  christos      may depend on arch/mach info.  */
    352   1.1  christos   if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f))
    353   1.1  christos     goto fail;
    354   1.1  christos 
    355   1.1  christos   /* Now copy data as required; construct all asections etc.  */
    356   1.1  christos   if (nscns != 0)
    357   1.1  christos     {
    358   1.1  christos       unsigned int i;
    359   1.1  christos       for (i = 0; i < nscns; i++)
    360   1.1  christos 	{
    361   1.1  christos 	  struct internal_scnhdr tmp;
    362   1.1  christos 	  bfd_coff_swap_scnhdr_in (abfd,
    363   1.1  christos 				   (void *) (external_sections + i * scnhsz),
    364   1.1  christos 				   (void *) & tmp);
    365   1.1  christos 	  if (! make_a_section_from_file (abfd, &tmp, i + 1))
    366   1.1  christos 	    goto fail;
    367   1.1  christos 	}
    368   1.1  christos     }
    369   1.1  christos 
    370   1.7  christos   _bfd_coff_free_symbols (abfd);
    371   1.9  christos   return coff_object_cleanup;
    372   1.1  christos 
    373   1.1  christos  fail:
    374   1.9  christos   coff_object_cleanup (abfd);
    375   1.7  christos   _bfd_coff_free_symbols (abfd);
    376   1.1  christos   bfd_release (abfd, tdata);
    377   1.1  christos  fail2:
    378   1.1  christos   abfd->flags = oflags;
    379   1.7  christos   abfd->start_address = ostart;
    380   1.8  christos   return NULL;
    381   1.1  christos }
    382   1.1  christos 
    383   1.1  christos /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
    384   1.1  christos    not a COFF file.  This is also used by ECOFF.  */
    385   1.1  christos 
    386   1.8  christos bfd_cleanup
    387   1.1  christos coff_object_p (bfd *abfd)
    388   1.1  christos {
    389   1.1  christos   bfd_size_type filhsz;
    390   1.1  christos   bfd_size_type aoutsz;
    391   1.1  christos   unsigned int nscns;
    392   1.1  christos   void * filehdr;
    393   1.1  christos   struct internal_filehdr internal_f;
    394   1.1  christos   struct internal_aouthdr internal_a;
    395   1.1  christos 
    396   1.1  christos   /* Figure out how much to read.  */
    397   1.1  christos   filhsz = bfd_coff_filhsz (abfd);
    398   1.1  christos   aoutsz = bfd_coff_aoutsz (abfd);
    399   1.1  christos 
    400   1.8  christos   filehdr = _bfd_alloc_and_read (abfd, filhsz, filhsz);
    401   1.1  christos   if (filehdr == NULL)
    402   1.1  christos     {
    403   1.1  christos       if (bfd_get_error () != bfd_error_system_call)
    404   1.1  christos 	bfd_set_error (bfd_error_wrong_format);
    405   1.1  christos       return NULL;
    406   1.1  christos     }
    407   1.1  christos   bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
    408   1.1  christos   bfd_release (abfd, filehdr);
    409   1.1  christos 
    410   1.1  christos   /* The XCOFF format has two sizes for the f_opthdr.  SMALL_AOUTSZ
    411   1.1  christos      (less than aoutsz) used in object files and AOUTSZ (equal to
    412   1.1  christos      aoutsz) in executables.  The bfd_coff_swap_aouthdr_in function
    413   1.1  christos      expects this header to be aoutsz bytes in length, so we use that
    414   1.1  christos      value in the call to bfd_alloc below.  But we must be careful to
    415   1.9  christos      only read in f_opthdr bytes in the call to bfd_read.  We should
    416   1.1  christos      also attempt to catch corrupt or non-COFF binaries with a strange
    417   1.1  christos      value for f_opthdr.  */
    418   1.1  christos   if (! bfd_coff_bad_format_hook (abfd, &internal_f)
    419   1.1  christos       || internal_f.f_opthdr > aoutsz)
    420   1.1  christos     {
    421   1.1  christos       bfd_set_error (bfd_error_wrong_format);
    422   1.1  christos       return NULL;
    423   1.1  christos     }
    424   1.1  christos   nscns = internal_f.f_nscns;
    425   1.1  christos 
    426   1.1  christos   if (internal_f.f_opthdr)
    427   1.1  christos     {
    428   1.1  christos       void * opthdr;
    429   1.1  christos 
    430   1.8  christos       opthdr = _bfd_alloc_and_read (abfd, aoutsz, internal_f.f_opthdr);
    431   1.1  christos       if (opthdr == NULL)
    432   1.1  christos 	return NULL;
    433   1.3  christos       /* PR 17512: file: 11056-1136-0.004.  */
    434   1.3  christos       if (internal_f.f_opthdr < aoutsz)
    435   1.8  christos 	memset (((char *) opthdr) + internal_f.f_opthdr, 0,
    436   1.8  christos 		aoutsz - internal_f.f_opthdr);
    437   1.3  christos 
    438   1.1  christos       bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a);
    439   1.1  christos       bfd_release (abfd, opthdr);
    440   1.1  christos     }
    441   1.1  christos 
    442   1.1  christos   return coff_real_object_p (abfd, nscns, &internal_f,
    443   1.1  christos 			     (internal_f.f_opthdr != 0
    444   1.1  christos 			      ? &internal_a
    445   1.1  christos 			      : (struct internal_aouthdr *) NULL));
    446   1.1  christos }
    447   1.1  christos 
    448   1.9  christos static hashval_t
    449   1.9  christos htab_hash_section_target_index (const void * entry)
    450   1.9  christos {
    451   1.9  christos   const struct bfd_section * sec = entry;
    452   1.9  christos   return sec->target_index;
    453   1.9  christos }
    454   1.9  christos 
    455   1.9  christos static int
    456   1.9  christos htab_eq_section_target_index (const void * e1, const void * e2)
    457   1.9  christos {
    458   1.9  christos   const struct bfd_section * sec1 = e1;
    459   1.9  christos   const struct bfd_section * sec2 = e2;
    460   1.9  christos   return sec1->target_index == sec2->target_index;
    461   1.9  christos }
    462   1.9  christos 
    463   1.1  christos /* Get the BFD section from a COFF symbol section number.  */
    464   1.1  christos 
    465   1.1  christos asection *
    466   1.1  christos coff_section_from_bfd_index (bfd *abfd, int section_index)
    467   1.1  christos {
    468   1.1  christos   if (section_index == N_ABS)
    469   1.1  christos     return bfd_abs_section_ptr;
    470   1.1  christos   if (section_index == N_UNDEF)
    471   1.1  christos     return bfd_und_section_ptr;
    472   1.1  christos   if (section_index == N_DEBUG)
    473   1.1  christos     return bfd_abs_section_ptr;
    474   1.1  christos 
    475   1.9  christos   struct bfd_section *answer;
    476   1.9  christos   htab_t table = coff_data (abfd)->section_by_target_index;
    477   1.9  christos 
    478   1.9  christos   if (!table)
    479   1.1  christos     {
    480   1.9  christos       table = htab_create (10, htab_hash_section_target_index,
    481   1.9  christos 			   htab_eq_section_target_index, NULL);
    482   1.9  christos       if (table == NULL)
    483   1.9  christos 	return bfd_und_section_ptr;
    484   1.9  christos       coff_data (abfd)->section_by_target_index = table;
    485   1.9  christos     }
    486   1.9  christos 
    487   1.9  christos   if (htab_elements (table) == 0)
    488   1.9  christos     {
    489   1.9  christos       for (answer = abfd->sections; answer; answer = answer->next)
    490   1.9  christos 	{
    491   1.9  christos 	  void **slot = htab_find_slot (table, answer, INSERT);
    492   1.9  christos 	  if (slot == NULL)
    493   1.9  christos 	    return bfd_und_section_ptr;
    494   1.9  christos 	  *slot = answer;
    495   1.9  christos 	}
    496   1.9  christos     }
    497   1.9  christos 
    498   1.9  christos   struct bfd_section needle;
    499   1.9  christos   needle.target_index = section_index;
    500   1.9  christos 
    501   1.9  christos   answer = htab_find (table, &needle);
    502   1.9  christos   if (answer != NULL)
    503   1.9  christos     return answer;
    504   1.9  christos 
    505   1.9  christos   /* Cover the unlikely case of sections added after the first call to
    506   1.9  christos      this function.  */
    507   1.9  christos   for (answer = abfd->sections; answer; answer = answer->next)
    508   1.9  christos     if (answer->target_index == section_index)
    509   1.9  christos       {
    510   1.9  christos 	void **slot = htab_find_slot (table, answer, INSERT);
    511   1.9  christos 	if (slot != NULL)
    512   1.9  christos 	  *slot = answer;
    513   1.1  christos 	return answer;
    514   1.9  christos       }
    515   1.1  christos 
    516   1.1  christos   /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
    517   1.1  christos      has a bad symbol table in biglitpow.o.  */
    518   1.1  christos   return bfd_und_section_ptr;
    519   1.1  christos }
    520   1.1  christos 
    521   1.1  christos /* Get the upper bound of a COFF symbol table.  */
    522   1.1  christos 
    523   1.1  christos long
    524   1.1  christos coff_get_symtab_upper_bound (bfd *abfd)
    525   1.1  christos {
    526   1.1  christos   if (!bfd_coff_slurp_symbol_table (abfd))
    527   1.1  christos     return -1;
    528   1.1  christos 
    529   1.1  christos   return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
    530   1.1  christos }
    531   1.1  christos 
    532   1.1  christos /* Canonicalize a COFF symbol table.  */
    533   1.1  christos 
    534   1.1  christos long
    535   1.1  christos coff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
    536   1.1  christos {
    537   1.1  christos   unsigned int counter;
    538   1.1  christos   coff_symbol_type *symbase;
    539   1.1  christos   coff_symbol_type **location = (coff_symbol_type **) alocation;
    540   1.1  christos 
    541   1.1  christos   if (!bfd_coff_slurp_symbol_table (abfd))
    542   1.1  christos     return -1;
    543   1.1  christos 
    544   1.1  christos   symbase = obj_symbols (abfd);
    545   1.1  christos   counter = bfd_get_symcount (abfd);
    546   1.1  christos   while (counter-- > 0)
    547   1.1  christos     *location++ = symbase++;
    548   1.1  christos 
    549   1.1  christos   *location = NULL;
    550   1.1  christos 
    551   1.1  christos   return bfd_get_symcount (abfd);
    552   1.1  christos }
    553   1.1  christos 
    554   1.1  christos /* Get the name of a symbol.  The caller must pass in a buffer of size
    555   1.1  christos    >= SYMNMLEN + 1.  */
    556   1.1  christos 
    557   1.1  christos const char *
    558   1.1  christos _bfd_coff_internal_syment_name (bfd *abfd,
    559   1.1  christos 				const struct internal_syment *sym,
    560   1.1  christos 				char *buf)
    561   1.1  christos {
    562   1.1  christos   /* FIXME: It's not clear this will work correctly if sizeof
    563   1.1  christos      (_n_zeroes) != 4.  */
    564   1.1  christos   if (sym->_n._n_n._n_zeroes != 0
    565   1.1  christos       || sym->_n._n_n._n_offset == 0)
    566   1.1  christos     {
    567   1.1  christos       memcpy (buf, sym->_n._n_name, SYMNMLEN);
    568   1.1  christos       buf[SYMNMLEN] = '\0';
    569   1.1  christos       return buf;
    570   1.1  christos     }
    571   1.1  christos   else
    572   1.1  christos     {
    573   1.1  christos       const char *strings;
    574   1.1  christos 
    575   1.1  christos       BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
    576   1.1  christos       strings = obj_coff_strings (abfd);
    577   1.1  christos       if (strings == NULL)
    578   1.1  christos 	{
    579   1.1  christos 	  strings = _bfd_coff_read_string_table (abfd);
    580   1.1  christos 	  if (strings == NULL)
    581   1.1  christos 	    return NULL;
    582   1.1  christos 	}
    583   1.9  christos       if (sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd))
    584   1.3  christos 	return NULL;
    585   1.1  christos       return strings + sym->_n._n_n._n_offset;
    586   1.1  christos     }
    587   1.1  christos }
    588   1.1  christos 
    589   1.1  christos /* Read in and swap the relocs.  This returns a buffer holding the
    590   1.1  christos    relocs for section SEC in file ABFD.  If CACHE is TRUE and
    591   1.1  christos    INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
    592   1.1  christos    the function is called again.  If EXTERNAL_RELOCS is not NULL, it
    593   1.1  christos    is a buffer large enough to hold the unswapped relocs.  If
    594   1.1  christos    INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
    595   1.1  christos    the swapped relocs.  If REQUIRE_INTERNAL is TRUE, then the return
    596   1.1  christos    value must be INTERNAL_RELOCS.  The function returns NULL on error.  */
    597   1.1  christos 
    598   1.1  christos struct internal_reloc *
    599   1.1  christos _bfd_coff_read_internal_relocs (bfd *abfd,
    600   1.1  christos 				asection *sec,
    601   1.8  christos 				bool cache,
    602   1.1  christos 				bfd_byte *external_relocs,
    603   1.8  christos 				bool require_internal,
    604   1.1  christos 				struct internal_reloc *internal_relocs)
    605   1.1  christos {
    606   1.1  christos   bfd_size_type relsz;
    607   1.1  christos   bfd_byte *free_external = NULL;
    608   1.1  christos   struct internal_reloc *free_internal = NULL;
    609   1.1  christos   bfd_byte *erel;
    610   1.1  christos   bfd_byte *erel_end;
    611   1.1  christos   struct internal_reloc *irel;
    612   1.1  christos   bfd_size_type amt;
    613   1.1  christos 
    614   1.1  christos   if (sec->reloc_count == 0)
    615   1.1  christos     return internal_relocs;	/* Nothing to do.  */
    616   1.1  christos 
    617   1.1  christos   if (coff_section_data (abfd, sec) != NULL
    618   1.1  christos       && coff_section_data (abfd, sec)->relocs != NULL)
    619   1.1  christos     {
    620   1.1  christos       if (! require_internal)
    621   1.1  christos 	return coff_section_data (abfd, sec)->relocs;
    622   1.1  christos       memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
    623   1.1  christos 	      sec->reloc_count * sizeof (struct internal_reloc));
    624   1.1  christos       return internal_relocs;
    625   1.1  christos     }
    626   1.1  christos 
    627   1.1  christos   relsz = bfd_coff_relsz (abfd);
    628   1.1  christos 
    629   1.1  christos   amt = sec->reloc_count * relsz;
    630   1.1  christos   if (external_relocs == NULL)
    631   1.1  christos     {
    632   1.1  christos       free_external = (bfd_byte *) bfd_malloc (amt);
    633   1.1  christos       if (free_external == NULL)
    634   1.1  christos 	goto error_return;
    635   1.1  christos       external_relocs = free_external;
    636   1.1  christos     }
    637   1.1  christos 
    638   1.1  christos   if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
    639   1.9  christos       || bfd_read (external_relocs, amt, abfd) != amt)
    640   1.1  christos     goto error_return;
    641   1.1  christos 
    642   1.1  christos   if (internal_relocs == NULL)
    643   1.1  christos     {
    644   1.1  christos       amt = sec->reloc_count;
    645   1.1  christos       amt *= sizeof (struct internal_reloc);
    646   1.1  christos       free_internal = (struct internal_reloc *) bfd_malloc (amt);
    647   1.1  christos       if (free_internal == NULL)
    648   1.1  christos 	goto error_return;
    649   1.1  christos       internal_relocs = free_internal;
    650   1.1  christos     }
    651   1.1  christos 
    652   1.1  christos   /* Swap in the relocs.  */
    653   1.1  christos   erel = external_relocs;
    654   1.1  christos   erel_end = erel + relsz * sec->reloc_count;
    655   1.1  christos   irel = internal_relocs;
    656   1.1  christos   for (; erel < erel_end; erel += relsz, irel++)
    657   1.1  christos     bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel);
    658   1.1  christos 
    659   1.8  christos   free (free_external);
    660   1.8  christos   free_external = NULL;
    661   1.1  christos 
    662   1.1  christos   if (cache && free_internal != NULL)
    663   1.1  christos     {
    664   1.1  christos       if (coff_section_data (abfd, sec) == NULL)
    665   1.1  christos 	{
    666   1.1  christos 	  amt = sizeof (struct coff_section_tdata);
    667   1.1  christos 	  sec->used_by_bfd = bfd_zalloc (abfd, amt);
    668   1.1  christos 	  if (sec->used_by_bfd == NULL)
    669   1.1  christos 	    goto error_return;
    670   1.1  christos 	  coff_section_data (abfd, sec)->contents = NULL;
    671   1.1  christos 	}
    672   1.1  christos       coff_section_data (abfd, sec)->relocs = free_internal;
    673   1.1  christos     }
    674   1.1  christos 
    675   1.1  christos   return internal_relocs;
    676   1.1  christos 
    677   1.1  christos  error_return:
    678   1.8  christos   free (free_external);
    679   1.8  christos   free (free_internal);
    680   1.1  christos   return NULL;
    681   1.1  christos }
    682   1.1  christos 
    683   1.1  christos /* Set lineno_count for the output sections of a COFF file.  */
    684   1.1  christos 
    685   1.1  christos int
    686   1.1  christos coff_count_linenumbers (bfd *abfd)
    687   1.1  christos {
    688   1.1  christos   unsigned int limit = bfd_get_symcount (abfd);
    689   1.1  christos   unsigned int i;
    690   1.1  christos   int total = 0;
    691   1.1  christos   asymbol **p;
    692   1.1  christos   asection *s;
    693   1.1  christos 
    694   1.1  christos   if (limit == 0)
    695   1.1  christos     {
    696   1.1  christos       /* This may be from the backend linker, in which case the
    697   1.6  christos 	 lineno_count in the sections is correct.  */
    698   1.1  christos       for (s = abfd->sections; s != NULL; s = s->next)
    699   1.1  christos 	total += s->lineno_count;
    700   1.1  christos       return total;
    701   1.1  christos     }
    702   1.1  christos 
    703   1.1  christos   for (s = abfd->sections; s != NULL; s = s->next)
    704   1.1  christos     BFD_ASSERT (s->lineno_count == 0);
    705   1.1  christos 
    706   1.1  christos   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
    707   1.1  christos     {
    708   1.1  christos       asymbol *q_maybe = *p;
    709   1.1  christos 
    710   1.8  christos       if (bfd_asymbol_bfd (q_maybe) != NULL
    711   1.8  christos 	  && bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
    712   1.1  christos 	{
    713   1.1  christos 	  coff_symbol_type *q = coffsymbol (q_maybe);
    714   1.1  christos 
    715   1.1  christos 	  /* The AIX 4.1 compiler can sometimes generate line numbers
    716   1.6  christos 	     attached to debugging symbols.  We try to simply ignore
    717   1.6  christos 	     those here.  */
    718   1.1  christos 	  if (q->lineno != NULL
    719   1.1  christos 	      && q->symbol.section->owner != NULL)
    720   1.1  christos 	    {
    721   1.1  christos 	      /* This symbol has line numbers.  Increment the owning
    722   1.6  christos 		 section's linenumber count.  */
    723   1.1  christos 	      alent *l = q->lineno;
    724   1.1  christos 
    725   1.1  christos 	      do
    726   1.1  christos 		{
    727   1.1  christos 		  asection * sec = q->symbol.section->output_section;
    728   1.1  christos 
    729   1.1  christos 		  /* Do not try to update fields in read-only sections.  */
    730   1.1  christos 		  if (! bfd_is_const_section (sec))
    731   1.1  christos 		    sec->lineno_count ++;
    732   1.1  christos 
    733   1.1  christos 		  ++total;
    734   1.1  christos 		  ++l;
    735   1.1  christos 		}
    736   1.1  christos 	      while (l->line_number != 0);
    737   1.1  christos 	    }
    738   1.1  christos 	}
    739   1.1  christos     }
    740   1.1  christos 
    741   1.1  christos   return total;
    742   1.1  christos }
    743   1.1  christos 
    744   1.1  christos static void
    745   1.1  christos fixup_symbol_value (bfd *abfd,
    746   1.1  christos 		    coff_symbol_type *coff_symbol_ptr,
    747   1.1  christos 		    struct internal_syment *syment)
    748   1.1  christos {
    749   1.1  christos   /* Normalize the symbol flags.  */
    750   1.3  christos   if (coff_symbol_ptr->symbol.section
    751   1.1  christos       && bfd_is_com_section (coff_symbol_ptr->symbol.section))
    752   1.1  christos     {
    753   1.1  christos       /* A common symbol is undefined with a value.  */
    754   1.1  christos       syment->n_scnum = N_UNDEF;
    755   1.1  christos       syment->n_value = coff_symbol_ptr->symbol.value;
    756   1.1  christos     }
    757   1.1  christos   else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
    758   1.1  christos 	   && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
    759   1.1  christos     {
    760   1.1  christos       syment->n_value = coff_symbol_ptr->symbol.value;
    761   1.1  christos     }
    762   1.1  christos   else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
    763   1.1  christos     {
    764   1.1  christos       syment->n_scnum = N_UNDEF;
    765   1.1  christos       syment->n_value = 0;
    766   1.1  christos     }
    767   1.1  christos   /* FIXME: Do we need to handle the absolute section here?  */
    768   1.1  christos   else
    769   1.1  christos     {
    770   1.1  christos       if (coff_symbol_ptr->symbol.section)
    771   1.1  christos 	{
    772   1.1  christos 	  syment->n_scnum =
    773   1.1  christos 	    coff_symbol_ptr->symbol.section->output_section->target_index;
    774   1.1  christos 
    775   1.1  christos 	  syment->n_value = (coff_symbol_ptr->symbol.value
    776   1.1  christos 			     + coff_symbol_ptr->symbol.section->output_offset);
    777   1.1  christos 	  if (! obj_pe (abfd))
    778   1.6  christos 	    {
    779   1.6  christos 	      syment->n_value += (syment->n_sclass == C_STATLAB)
    780   1.6  christos 		? coff_symbol_ptr->symbol.section->output_section->lma
    781   1.6  christos 		: coff_symbol_ptr->symbol.section->output_section->vma;
    782   1.6  christos 	    }
    783   1.1  christos 	}
    784   1.1  christos       else
    785   1.1  christos 	{
    786   1.1  christos 	  BFD_ASSERT (0);
    787   1.1  christos 	  /* This can happen, but I don't know why yet (steve (at) cygnus.com) */
    788   1.1  christos 	  syment->n_scnum = N_ABS;
    789   1.1  christos 	  syment->n_value = coff_symbol_ptr->symbol.value;
    790   1.1  christos 	}
    791   1.1  christos     }
    792   1.1  christos }
    793   1.1  christos 
    794   1.1  christos /* Run through all the symbols in the symbol table and work out what
    795   1.1  christos    their indexes into the symbol table will be when output.
    796   1.1  christos 
    797   1.1  christos    Coff requires that each C_FILE symbol points to the next one in the
    798   1.1  christos    chain, and that the last one points to the first external symbol. We
    799   1.1  christos    do that here too.  */
    800   1.1  christos 
    801   1.8  christos bool
    802   1.1  christos coff_renumber_symbols (bfd *bfd_ptr, int *first_undef)
    803   1.1  christos {
    804   1.1  christos   unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
    805   1.1  christos   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
    806   1.1  christos   unsigned int native_index = 0;
    807   1.1  christos   struct internal_syment *last_file = NULL;
    808   1.1  christos   unsigned int symbol_index;
    809   1.1  christos 
    810   1.1  christos   /* COFF demands that undefined symbols come after all other symbols.
    811   1.1  christos      Since we don't need to impose this extra knowledge on all our
    812   1.1  christos      client programs, deal with that here.  Sort the symbol table;
    813   1.1  christos      just move the undefined symbols to the end, leaving the rest
    814   1.1  christos      alone.  The O'Reilly book says that defined global symbols come
    815   1.1  christos      at the end before the undefined symbols, so we do that here as
    816   1.1  christos      well.  */
    817   1.1  christos   /* @@ Do we have some condition we could test for, so we don't always
    818   1.1  christos      have to do this?  I don't think relocatability is quite right, but
    819   1.1  christos      I'm not certain.  [raeburn:19920508.1711EST]  */
    820   1.1  christos   {
    821   1.1  christos     asymbol **newsyms;
    822   1.1  christos     unsigned int i;
    823   1.1  christos     bfd_size_type amt;
    824   1.1  christos 
    825   1.1  christos     amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1);
    826   1.1  christos     newsyms = (asymbol **) bfd_alloc (bfd_ptr, amt);
    827   1.1  christos     if (!newsyms)
    828   1.8  christos       return false;
    829   1.1  christos     bfd_ptr->outsymbols = newsyms;
    830   1.1  christos     for (i = 0; i < symbol_count; i++)
    831   1.1  christos       if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
    832   1.1  christos 	  || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
    833   1.1  christos 	      && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
    834   1.1  christos 	      && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
    835   1.1  christos 		  || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
    836   1.1  christos 		      == 0))))
    837   1.1  christos 	*newsyms++ = symbol_ptr_ptr[i];
    838   1.1  christos 
    839   1.1  christos     for (i = 0; i < symbol_count; i++)
    840   1.1  christos       if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
    841   1.1  christos 	  && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
    842   1.1  christos 	  && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
    843   1.1  christos 	      || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
    844   1.1  christos 		  && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
    845   1.1  christos 		      != 0))))
    846   1.1  christos 	*newsyms++ = symbol_ptr_ptr[i];
    847   1.1  christos 
    848   1.1  christos     *first_undef = newsyms - bfd_ptr->outsymbols;
    849   1.1  christos 
    850   1.1  christos     for (i = 0; i < symbol_count; i++)
    851   1.1  christos       if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
    852   1.1  christos 	  && bfd_is_und_section (symbol_ptr_ptr[i]->section))
    853   1.1  christos 	*newsyms++ = symbol_ptr_ptr[i];
    854   1.1  christos     *newsyms = (asymbol *) NULL;
    855   1.1  christos     symbol_ptr_ptr = bfd_ptr->outsymbols;
    856   1.1  christos   }
    857   1.1  christos 
    858   1.1  christos   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
    859   1.1  christos     {
    860   1.3  christos       coff_symbol_type *coff_symbol_ptr;
    861   1.3  christos 
    862   1.3  christos       coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]);
    863   1.1  christos       symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
    864   1.1  christos       if (coff_symbol_ptr && coff_symbol_ptr->native)
    865   1.1  christos 	{
    866   1.1  christos 	  combined_entry_type *s = coff_symbol_ptr->native;
    867   1.1  christos 	  int i;
    868   1.1  christos 
    869   1.3  christos 	  BFD_ASSERT (s->is_sym);
    870   1.1  christos 	  if (s->u.syment.n_sclass == C_FILE)
    871   1.1  christos 	    {
    872   1.1  christos 	      if (last_file != NULL)
    873   1.1  christos 		last_file->n_value = native_index;
    874   1.1  christos 	      last_file = &(s->u.syment);
    875   1.1  christos 	    }
    876   1.1  christos 	  else
    877   1.1  christos 	    /* Modify the symbol values according to their section and
    878   1.1  christos 	       type.  */
    879   1.1  christos 	    fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment));
    880   1.1  christos 
    881   1.1  christos 	  for (i = 0; i < s->u.syment.n_numaux + 1; i++)
    882   1.1  christos 	    s[i].offset = native_index++;
    883   1.1  christos 	}
    884   1.1  christos       else
    885   1.1  christos 	native_index++;
    886   1.1  christos     }
    887   1.1  christos 
    888   1.1  christos   obj_conv_table_size (bfd_ptr) = native_index;
    889   1.1  christos 
    890   1.8  christos   return true;
    891   1.1  christos }
    892   1.1  christos 
    893   1.1  christos /* Run thorough the symbol table again, and fix it so that all
    894   1.1  christos    pointers to entries are changed to the entries' index in the output
    895   1.1  christos    symbol table.  */
    896   1.1  christos 
    897   1.1  christos void
    898   1.1  christos coff_mangle_symbols (bfd *bfd_ptr)
    899   1.1  christos {
    900   1.1  christos   unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
    901   1.1  christos   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
    902   1.1  christos   unsigned int symbol_index;
    903   1.1  christos 
    904   1.1  christos   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
    905   1.1  christos     {
    906   1.3  christos       coff_symbol_type *coff_symbol_ptr;
    907   1.1  christos 
    908   1.3  christos       coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]);
    909   1.1  christos       if (coff_symbol_ptr && coff_symbol_ptr->native)
    910   1.1  christos 	{
    911   1.1  christos 	  int i;
    912   1.1  christos 	  combined_entry_type *s = coff_symbol_ptr->native;
    913   1.1  christos 
    914   1.3  christos 	  BFD_ASSERT (s->is_sym);
    915   1.1  christos 	  if (s->fix_value)
    916   1.1  christos 	    {
    917   1.1  christos 	      /* FIXME: We should use a union here.  */
    918   1.1  christos 	      s->u.syment.n_value =
    919   1.8  christos 		(uintptr_t) ((combined_entry_type *)
    920   1.8  christos 			     (uintptr_t) s->u.syment.n_value)->offset;
    921   1.1  christos 	      s->fix_value = 0;
    922   1.1  christos 	    }
    923   1.1  christos 	  if (s->fix_line)
    924   1.1  christos 	    {
    925   1.1  christos 	      /* The value is the offset into the line number entries
    926   1.6  christos 		 for the symbol's section.  On output, the symbol's
    927   1.6  christos 		 section should be N_DEBUG.  */
    928   1.1  christos 	      s->u.syment.n_value =
    929   1.1  christos 		(coff_symbol_ptr->symbol.section->output_section->line_filepos
    930   1.1  christos 		 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
    931   1.1  christos 	      coff_symbol_ptr->symbol.section =
    932   1.1  christos 		coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
    933   1.1  christos 	      BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
    934   1.1  christos 	    }
    935   1.1  christos 	  for (i = 0; i < s->u.syment.n_numaux; i++)
    936   1.1  christos 	    {
    937   1.1  christos 	      combined_entry_type *a = s + i + 1;
    938   1.7  christos 
    939   1.3  christos 	      BFD_ASSERT (! a->is_sym);
    940   1.1  christos 	      if (a->fix_tag)
    941   1.1  christos 		{
    942   1.9  christos 		  a->u.auxent.x_sym.x_tagndx.u32 =
    943   1.1  christos 		    a->u.auxent.x_sym.x_tagndx.p->offset;
    944   1.1  christos 		  a->fix_tag = 0;
    945   1.1  christos 		}
    946   1.1  christos 	      if (a->fix_end)
    947   1.1  christos 		{
    948   1.9  christos 		  a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32 =
    949   1.1  christos 		    a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
    950   1.1  christos 		  a->fix_end = 0;
    951   1.1  christos 		}
    952   1.1  christos 	      if (a->fix_scnlen)
    953   1.1  christos 		{
    954   1.9  christos 		  a->u.auxent.x_csect.x_scnlen.u64 =
    955   1.1  christos 		    a->u.auxent.x_csect.x_scnlen.p->offset;
    956   1.1  christos 		  a->fix_scnlen = 0;
    957   1.1  christos 		}
    958   1.1  christos 	    }
    959   1.1  christos 	}
    960   1.1  christos     }
    961   1.1  christos }
    962   1.1  christos 
    963   1.8  christos static bool
    964   1.8  christos coff_write_auxent_fname (bfd *abfd,
    965   1.8  christos 			 char *str,
    966   1.8  christos 			 union internal_auxent *auxent,
    967   1.8  christos 			 struct bfd_strtab_hash *strtab,
    968   1.8  christos 			 bool hash)
    969   1.8  christos {
    970   1.8  christos   unsigned int str_length = strlen (str);
    971   1.8  christos   unsigned int filnmlen = bfd_coff_filnmlen (abfd);
    972   1.8  christos 
    973   1.8  christos   if (bfd_coff_long_filenames (abfd))
    974   1.8  christos     {
    975   1.8  christos       if (str_length <= filnmlen)
    976   1.8  christos 	strncpy (auxent->x_file.x_n.x_fname, str, filnmlen);
    977   1.8  christos       else
    978   1.8  christos 	{
    979   1.8  christos 	  bfd_size_type indx = _bfd_stringtab_add (strtab, str, hash, false);
    980   1.8  christos 
    981   1.8  christos 	  if (indx == (bfd_size_type) -1)
    982   1.8  christos 	    return false;
    983   1.8  christos 
    984   1.8  christos 	  auxent->x_file.x_n.x_n.x_offset = STRING_SIZE_SIZE + indx;
    985   1.8  christos 	  auxent->x_file.x_n.x_n.x_zeroes = 0;
    986   1.8  christos 	}
    987   1.8  christos     }
    988   1.8  christos   else
    989   1.8  christos     {
    990   1.8  christos       strncpy (auxent->x_file.x_n.x_fname, str, filnmlen);
    991   1.8  christos       if (str_length > filnmlen)
    992   1.8  christos 	str[filnmlen] = '\0';
    993   1.8  christos     }
    994   1.8  christos 
    995   1.8  christos   return true;
    996   1.8  christos }
    997   1.8  christos 
    998   1.8  christos static bool
    999   1.1  christos coff_fix_symbol_name (bfd *abfd,
   1000   1.1  christos 		      asymbol *symbol,
   1001   1.1  christos 		      combined_entry_type *native,
   1002   1.8  christos 		      struct bfd_strtab_hash *strtab,
   1003   1.8  christos 		      bool hash,
   1004   1.1  christos 		      asection **debug_string_section_p,
   1005   1.1  christos 		      bfd_size_type *debug_string_size_p)
   1006   1.1  christos {
   1007   1.1  christos   unsigned int name_length;
   1008   1.1  christos   char *name = (char *) (symbol->name);
   1009   1.8  christos   bfd_size_type indx;
   1010   1.1  christos 
   1011   1.1  christos   if (name == NULL)
   1012   1.1  christos     {
   1013   1.1  christos       /* COFF symbols always have names, so we'll make one up.  */
   1014   1.1  christos       symbol->name = "strange";
   1015   1.1  christos       name = (char *) symbol->name;
   1016   1.1  christos     }
   1017   1.1  christos   name_length = strlen (name);
   1018   1.1  christos 
   1019   1.3  christos   BFD_ASSERT (native->is_sym);
   1020   1.1  christos   if (native->u.syment.n_sclass == C_FILE
   1021   1.1  christos       && native->u.syment.n_numaux > 0)
   1022   1.1  christos     {
   1023   1.1  christos       if (bfd_coff_force_symnames_in_strings (abfd))
   1024   1.1  christos 	{
   1025   1.8  christos 	  indx = _bfd_stringtab_add (strtab, ".file", hash, false);
   1026   1.8  christos 	  if (indx == (bfd_size_type) -1)
   1027   1.8  christos 	    return false;
   1028   1.8  christos 
   1029   1.8  christos 	  native->u.syment._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
   1030   1.1  christos 	  native->u.syment._n._n_n._n_zeroes = 0;
   1031   1.1  christos 	}
   1032   1.1  christos       else
   1033   1.6  christos 	strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
   1034   1.1  christos 
   1035   1.3  christos       BFD_ASSERT (! (native + 1)->is_sym);
   1036   1.8  christos       if (!coff_write_auxent_fname (abfd, name, &(native + 1)->u.auxent,
   1037   1.8  christos 			       strtab, hash))
   1038   1.8  christos 	return false;
   1039   1.1  christos     }
   1040   1.1  christos   else
   1041   1.1  christos     {
   1042   1.1  christos       if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
   1043   1.1  christos 	/* This name will fit into the symbol neatly.  */
   1044   1.1  christos 	strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
   1045   1.1  christos 
   1046   1.1  christos       else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
   1047   1.1  christos 	{
   1048   1.8  christos 	  indx = _bfd_stringtab_add (strtab, name, hash, false);
   1049   1.8  christos 	  if (indx == (bfd_size_type) -1)
   1050   1.8  christos 	    return false;
   1051   1.8  christos 
   1052   1.8  christos 	  native->u.syment._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
   1053   1.1  christos 	  native->u.syment._n._n_n._n_zeroes = 0;
   1054   1.1  christos 	}
   1055   1.1  christos       else
   1056   1.1  christos 	{
   1057   1.1  christos 	  file_ptr filepos;
   1058   1.1  christos 	  bfd_byte buf[4];
   1059   1.1  christos 	  int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
   1060   1.1  christos 
   1061   1.1  christos 	  /* This name should be written into the .debug section.  For
   1062   1.1  christos 	     some reason each name is preceded by a two byte length
   1063   1.1  christos 	     and also followed by a null byte.  FIXME: We assume that
   1064   1.1  christos 	     the .debug section has already been created, and that it
   1065   1.1  christos 	     is large enough.  */
   1066   1.1  christos 	  if (*debug_string_section_p == (asection *) NULL)
   1067   1.1  christos 	    *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
   1068   1.1  christos 	  filepos = bfd_tell (abfd);
   1069   1.1  christos 	  if (prefix_len == 4)
   1070   1.1  christos 	    bfd_put_32 (abfd, (bfd_vma) (name_length + 1), buf);
   1071   1.1  christos 	  else
   1072   1.1  christos 	    bfd_put_16 (abfd, (bfd_vma) (name_length + 1), buf);
   1073   1.1  christos 
   1074   1.1  christos 	  if (!bfd_set_section_contents (abfd,
   1075   1.1  christos 					 *debug_string_section_p,
   1076   1.1  christos 					 (void *) buf,
   1077   1.1  christos 					 (file_ptr) *debug_string_size_p,
   1078   1.1  christos 					 (bfd_size_type) prefix_len)
   1079   1.1  christos 	      || !bfd_set_section_contents (abfd,
   1080   1.1  christos 					    *debug_string_section_p,
   1081   1.1  christos 					    (void *) symbol->name,
   1082   1.1  christos 					    (file_ptr) (*debug_string_size_p
   1083   1.1  christos 							+ prefix_len),
   1084   1.1  christos 					    (bfd_size_type) name_length + 1))
   1085   1.1  christos 	    abort ();
   1086   1.1  christos 	  if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
   1087   1.1  christos 	    abort ();
   1088   1.1  christos 	  native->u.syment._n._n_n._n_offset =
   1089   1.1  christos 	      *debug_string_size_p + prefix_len;
   1090   1.1  christos 	  native->u.syment._n._n_n._n_zeroes = 0;
   1091   1.1  christos 	  *debug_string_size_p += name_length + 1 + prefix_len;
   1092   1.1  christos 	}
   1093   1.1  christos     }
   1094   1.8  christos 
   1095   1.8  christos   return true;
   1096   1.1  christos }
   1097   1.1  christos 
   1098   1.1  christos /* We need to keep track of the symbol index so that when we write out
   1099   1.1  christos    the relocs we can get the index for a symbol.  This method is a
   1100   1.1  christos    hack.  FIXME.  */
   1101   1.1  christos 
   1102   1.1  christos #define set_index(symbol, idx)	((symbol)->udata.i = (idx))
   1103   1.1  christos 
   1104   1.1  christos /* Write a symbol out to a COFF file.  */
   1105   1.1  christos 
   1106   1.8  christos static bool
   1107   1.1  christos coff_write_symbol (bfd *abfd,
   1108   1.1  christos 		   asymbol *symbol,
   1109   1.1  christos 		   combined_entry_type *native,
   1110   1.1  christos 		   bfd_vma *written,
   1111   1.8  christos 		   struct bfd_strtab_hash *strtab,
   1112   1.8  christos 		   bool hash,
   1113   1.1  christos 		   asection **debug_string_section_p,
   1114   1.1  christos 		   bfd_size_type *debug_string_size_p)
   1115   1.1  christos {
   1116   1.1  christos   unsigned int numaux = native->u.syment.n_numaux;
   1117   1.1  christos   int type = native->u.syment.n_type;
   1118   1.1  christos   int n_sclass = (int) native->u.syment.n_sclass;
   1119   1.1  christos   asection *output_section = symbol->section->output_section
   1120   1.1  christos 			       ? symbol->section->output_section
   1121   1.1  christos 			       : symbol->section;
   1122   1.1  christos   void * buf;
   1123   1.1  christos   bfd_size_type symesz;
   1124   1.1  christos 
   1125   1.3  christos   BFD_ASSERT (native->is_sym);
   1126   1.3  christos 
   1127   1.1  christos   if (native->u.syment.n_sclass == C_FILE)
   1128   1.1  christos     symbol->flags |= BSF_DEBUGGING;
   1129   1.1  christos 
   1130   1.1  christos   if (symbol->flags & BSF_DEBUGGING
   1131   1.1  christos       && bfd_is_abs_section (symbol->section))
   1132   1.1  christos     native->u.syment.n_scnum = N_DEBUG;
   1133   1.1  christos 
   1134   1.1  christos   else if (bfd_is_abs_section (symbol->section))
   1135   1.1  christos     native->u.syment.n_scnum = N_ABS;
   1136   1.1  christos 
   1137   1.1  christos   else if (bfd_is_und_section (symbol->section))
   1138   1.1  christos     native->u.syment.n_scnum = N_UNDEF;
   1139   1.1  christos 
   1140   1.1  christos   else
   1141   1.1  christos     native->u.syment.n_scnum =
   1142   1.1  christos       output_section->target_index;
   1143   1.1  christos 
   1144   1.8  christos   if (!coff_fix_symbol_name (abfd, symbol, native, strtab, hash,
   1145   1.8  christos 			     debug_string_section_p, debug_string_size_p))
   1146   1.8  christos     return false;
   1147   1.1  christos 
   1148   1.1  christos   symesz = bfd_coff_symesz (abfd);
   1149   1.1  christos   buf = bfd_alloc (abfd, symesz);
   1150   1.1  christos   if (!buf)
   1151   1.8  christos     return false;
   1152   1.1  christos   bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
   1153   1.9  christos   if (bfd_write (buf, symesz, abfd) != symesz)
   1154   1.8  christos     return false;
   1155   1.1  christos   bfd_release (abfd, buf);
   1156   1.1  christos 
   1157   1.1  christos   if (native->u.syment.n_numaux > 0)
   1158   1.1  christos     {
   1159   1.1  christos       bfd_size_type auxesz;
   1160   1.1  christos       unsigned int j;
   1161   1.1  christos 
   1162   1.1  christos       auxesz = bfd_coff_auxesz (abfd);
   1163   1.1  christos       buf = bfd_alloc (abfd, auxesz);
   1164   1.1  christos       if (!buf)
   1165   1.8  christos 	return false;
   1166   1.1  christos       for (j = 0; j < native->u.syment.n_numaux; j++)
   1167   1.1  christos 	{
   1168   1.3  christos 	  BFD_ASSERT (! (native + j + 1)->is_sym);
   1169   1.8  christos 
   1170   1.8  christos 	  /* Adjust auxent only if this isn't the filename
   1171   1.8  christos 	     auxiliary entry.  */
   1172   1.8  christos 	  if (native->u.syment.n_sclass == C_FILE
   1173   1.9  christos 	      && (native + j + 1)->u.auxent.x_file.x_ftype
   1174   1.9  christos 	      && (native + j + 1)->extrap)
   1175   1.8  christos 	    coff_write_auxent_fname (abfd, (char *) (native + j + 1)->extrap,
   1176   1.8  christos 				     &(native + j + 1)->u.auxent, strtab, hash);
   1177   1.8  christos 
   1178   1.1  christos 	  bfd_coff_swap_aux_out (abfd,
   1179   1.1  christos 				 &((native + j + 1)->u.auxent),
   1180   1.1  christos 				 type, n_sclass, (int) j,
   1181   1.1  christos 				 native->u.syment.n_numaux,
   1182   1.1  christos 				 buf);
   1183   1.9  christos 	  if (bfd_write (buf, auxesz, abfd) != auxesz)
   1184   1.8  christos 	    return false;
   1185   1.1  christos 	}
   1186   1.1  christos       bfd_release (abfd, buf);
   1187   1.1  christos     }
   1188   1.1  christos 
   1189   1.1  christos   /* Store the index for use when we write out the relocs.  */
   1190   1.1  christos   set_index (symbol, *written);
   1191   1.1  christos 
   1192   1.1  christos   *written += numaux + 1;
   1193   1.8  christos   return true;
   1194   1.1  christos }
   1195   1.1  christos 
   1196   1.1  christos /* Write out a symbol to a COFF file that does not come from a COFF
   1197   1.1  christos    file originally.  This symbol may have been created by the linker,
   1198   1.1  christos    or we may be linking a non COFF file to a COFF file.  */
   1199   1.1  christos 
   1200   1.8  christos bool
   1201   1.1  christos coff_write_alien_symbol (bfd *abfd,
   1202   1.1  christos 			 asymbol *symbol,
   1203   1.1  christos 			 struct internal_syment *isym,
   1204   1.1  christos 			 bfd_vma *written,
   1205   1.8  christos 			 struct bfd_strtab_hash *strtab,
   1206   1.8  christos 			 bool hash,
   1207   1.1  christos 			 asection **debug_string_section_p,
   1208   1.1  christos 			 bfd_size_type *debug_string_size_p)
   1209   1.1  christos {
   1210   1.1  christos   combined_entry_type *native;
   1211   1.1  christos   combined_entry_type dummy[2];
   1212   1.1  christos   asection *output_section = symbol->section->output_section
   1213   1.1  christos 			       ? symbol->section->output_section
   1214   1.1  christos 			       : symbol->section;
   1215   1.1  christos   struct bfd_link_info *link_info = coff_data (abfd)->link_info;
   1216   1.8  christos   bool ret;
   1217   1.1  christos 
   1218   1.1  christos   if ((!link_info || link_info->strip_discarded)
   1219   1.1  christos       && !bfd_is_abs_section (symbol->section)
   1220   1.1  christos       && symbol->section->output_section == bfd_abs_section_ptr)
   1221   1.1  christos     {
   1222   1.1  christos       symbol->name = "";
   1223   1.1  christos       if (isym != NULL)
   1224   1.6  christos 	memset (isym, 0, sizeof (*isym));
   1225   1.8  christos       return true;
   1226   1.1  christos     }
   1227   1.8  christos   memset (dummy, 0, sizeof dummy);
   1228   1.1  christos   native = dummy;
   1229   1.8  christos   native->is_sym = true;
   1230   1.8  christos   native[1].is_sym = false;
   1231   1.1  christos   native->u.syment.n_type = T_NULL;
   1232   1.1  christos   native->u.syment.n_flags = 0;
   1233   1.1  christos   native->u.syment.n_numaux = 0;
   1234   1.1  christos   if (bfd_is_und_section (symbol->section))
   1235   1.1  christos     {
   1236   1.1  christos       native->u.syment.n_scnum = N_UNDEF;
   1237   1.1  christos       native->u.syment.n_value = symbol->value;
   1238   1.1  christos     }
   1239   1.1  christos   else if (bfd_is_com_section (symbol->section))
   1240   1.1  christos     {
   1241   1.1  christos       native->u.syment.n_scnum = N_UNDEF;
   1242   1.1  christos       native->u.syment.n_value = symbol->value;
   1243   1.1  christos     }
   1244   1.1  christos   else if (symbol->flags & BSF_FILE)
   1245   1.1  christos     {
   1246   1.1  christos       native->u.syment.n_scnum = N_DEBUG;
   1247   1.1  christos       native->u.syment.n_numaux = 1;
   1248   1.1  christos     }
   1249   1.1  christos   else if (symbol->flags & BSF_DEBUGGING)
   1250   1.1  christos     {
   1251   1.1  christos       /* There isn't much point to writing out a debugging symbol
   1252   1.6  christos 	 unless we are prepared to convert it into COFF debugging
   1253   1.6  christos 	 format.  So, we just ignore them.  We must clobber the symbol
   1254   1.6  christos 	 name to keep it from being put in the string table.  */
   1255   1.1  christos       symbol->name = "";
   1256   1.1  christos       if (isym != NULL)
   1257   1.6  christos 	memset (isym, 0, sizeof (*isym));
   1258   1.8  christos       return true;
   1259   1.1  christos     }
   1260   1.1  christos   else
   1261   1.1  christos     {
   1262   1.1  christos       native->u.syment.n_scnum = output_section->target_index;
   1263   1.1  christos       native->u.syment.n_value = (symbol->value
   1264   1.1  christos 				  + symbol->section->output_offset);
   1265   1.1  christos       if (! obj_pe (abfd))
   1266   1.1  christos 	native->u.syment.n_value += output_section->vma;
   1267   1.1  christos 
   1268   1.1  christos       /* Copy the any flags from the file header into the symbol.
   1269   1.6  christos 	 FIXME: Why?  */
   1270   1.1  christos       {
   1271   1.3  christos 	coff_symbol_type *c = coff_symbol_from (symbol);
   1272   1.1  christos 	if (c != (coff_symbol_type *) NULL)
   1273   1.1  christos 	  native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
   1274   1.1  christos       }
   1275  1.10  christos 
   1276  1.10  christos       const elf_symbol_type *elfsym = elf_symbol_from (symbol);
   1277  1.10  christos       if (elfsym
   1278  1.10  christos 	  && (symbol->flags & BSF_FUNCTION)
   1279  1.10  christos 	  && elfsym->internal_elf_sym.st_size)
   1280  1.10  christos 	{
   1281  1.10  christos 	  /* coff_data (abfd)->local_n_btshft is what ought to be used here,
   1282  1.10  christos 	     just that it's set only when reading in COFF objects.  */
   1283  1.10  christos 	  native->u.syment.n_type = DT_FCN << 4;
   1284  1.10  christos 	  native->u.syment.n_numaux = 1;
   1285  1.10  christos 	  native[1].u.auxent.x_sym.x_misc.x_fsize
   1286  1.10  christos 	    = elfsym->internal_elf_sym.st_size;
   1287  1.10  christos 	  /* FIXME .u.auxent.x_sym.x_fcnary.x_fcn.x_endndx would better also
   1288  1.10  christos 	     be set, which would require updating the field once the next
   1289  1.10  christos 	     function is seen.  */
   1290  1.10  christos 	}
   1291   1.1  christos     }
   1292   1.1  christos 
   1293   1.1  christos   if (symbol->flags & BSF_FILE)
   1294   1.1  christos     native->u.syment.n_sclass = C_FILE;
   1295   1.1  christos   else if (symbol->flags & BSF_LOCAL)
   1296   1.1  christos     native->u.syment.n_sclass = C_STAT;
   1297   1.1  christos   else if (symbol->flags & BSF_WEAK)
   1298   1.1  christos     native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
   1299   1.1  christos   else
   1300   1.1  christos     native->u.syment.n_sclass = C_EXT;
   1301   1.1  christos 
   1302   1.8  christos   ret = coff_write_symbol (abfd, symbol, native, written, strtab, hash,
   1303   1.1  christos 			   debug_string_section_p, debug_string_size_p);
   1304   1.1  christos   if (isym != NULL)
   1305   1.1  christos     *isym = native->u.syment;
   1306   1.1  christos   return ret;
   1307   1.1  christos }
   1308   1.1  christos 
   1309   1.1  christos /* Write a native symbol to a COFF file.  */
   1310   1.1  christos 
   1311   1.8  christos static bool
   1312   1.1  christos coff_write_native_symbol (bfd *abfd,
   1313   1.1  christos 			  coff_symbol_type *symbol,
   1314   1.1  christos 			  bfd_vma *written,
   1315   1.8  christos 			  struct bfd_strtab_hash *strtab,
   1316   1.1  christos 			  asection **debug_string_section_p,
   1317   1.1  christos 			  bfd_size_type *debug_string_size_p)
   1318   1.1  christos {
   1319   1.1  christos   combined_entry_type *native = symbol->native;
   1320   1.1  christos   alent *lineno = symbol->lineno;
   1321   1.1  christos   struct bfd_link_info *link_info = coff_data (abfd)->link_info;
   1322   1.1  christos 
   1323   1.1  christos   if ((!link_info || link_info->strip_discarded)
   1324   1.1  christos       && !bfd_is_abs_section (symbol->symbol.section)
   1325   1.1  christos       && symbol->symbol.section->output_section == bfd_abs_section_ptr)
   1326   1.1  christos     {
   1327   1.1  christos       symbol->symbol.name = "";
   1328   1.8  christos       return true;
   1329   1.1  christos     }
   1330   1.1  christos 
   1331   1.3  christos   BFD_ASSERT (native->is_sym);
   1332   1.1  christos   /* If this symbol has an associated line number, we must store the
   1333   1.1  christos      symbol index in the line number field.  We also tag the auxent to
   1334   1.1  christos      point to the right place in the lineno table.  */
   1335   1.1  christos   if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
   1336   1.1  christos     {
   1337   1.1  christos       unsigned int count = 0;
   1338   1.1  christos 
   1339   1.1  christos       lineno[count].u.offset = *written;
   1340   1.1  christos       if (native->u.syment.n_numaux)
   1341   1.1  christos 	{
   1342   1.1  christos 	  union internal_auxent *a = &((native + 1)->u.auxent);
   1343   1.1  christos 
   1344   1.1  christos 	  a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
   1345   1.1  christos 	    symbol->symbol.section->output_section->moving_line_filepos;
   1346   1.1  christos 	}
   1347   1.1  christos 
   1348   1.1  christos       /* Count and relocate all other linenumbers.  */
   1349   1.1  christos       count++;
   1350   1.1  christos       while (lineno[count].line_number != 0)
   1351   1.1  christos 	{
   1352   1.1  christos 	  lineno[count].u.offset +=
   1353   1.1  christos 	    (symbol->symbol.section->output_section->vma
   1354   1.1  christos 	     + symbol->symbol.section->output_offset);
   1355   1.1  christos 	  count++;
   1356   1.1  christos 	}
   1357   1.8  christos       symbol->done_lineno = true;
   1358   1.1  christos 
   1359   1.1  christos       if (! bfd_is_const_section (symbol->symbol.section->output_section))
   1360   1.1  christos 	symbol->symbol.section->output_section->moving_line_filepos +=
   1361   1.1  christos 	  count * bfd_coff_linesz (abfd);
   1362   1.1  christos     }
   1363   1.1  christos 
   1364   1.1  christos   return coff_write_symbol (abfd, &(symbol->symbol), native, written,
   1365   1.8  christos 			    strtab, true, debug_string_section_p,
   1366   1.1  christos 			    debug_string_size_p);
   1367   1.1  christos }
   1368   1.1  christos 
   1369   1.1  christos static void
   1370   1.6  christos null_error_handler (const char *fmt ATTRIBUTE_UNUSED,
   1371   1.6  christos 		    va_list ap ATTRIBUTE_UNUSED)
   1372   1.1  christos {
   1373   1.1  christos }
   1374   1.1  christos 
   1375   1.1  christos /* Write out the COFF symbols.  */
   1376   1.1  christos 
   1377   1.8  christos bool
   1378   1.1  christos coff_write_symbols (bfd *abfd)
   1379   1.1  christos {
   1380   1.8  christos   struct bfd_strtab_hash *strtab;
   1381   1.1  christos   asection *debug_string_section;
   1382   1.1  christos   bfd_size_type debug_string_size;
   1383   1.1  christos   unsigned int i;
   1384   1.1  christos   unsigned int limit = bfd_get_symcount (abfd);
   1385   1.1  christos   bfd_vma written = 0;
   1386   1.1  christos   asymbol **p;
   1387   1.1  christos 
   1388   1.1  christos   debug_string_section = NULL;
   1389   1.1  christos   debug_string_size = 0;
   1390   1.1  christos 
   1391   1.8  christos   strtab = _bfd_stringtab_init ();
   1392   1.8  christos   if (strtab == NULL)
   1393   1.8  christos     return false;
   1394   1.8  christos 
   1395   1.1  christos   /* If this target supports long section names, they must be put into
   1396   1.1  christos      the string table.  This is supported by PE.  This code must
   1397   1.1  christos      handle section names just as they are handled in
   1398   1.8  christos      coff_write_object_contents.  This is why we pass hash as FALSE below.  */
   1399   1.1  christos   if (bfd_coff_long_section_names (abfd))
   1400   1.1  christos     {
   1401   1.1  christos       asection *o;
   1402   1.1  christos 
   1403   1.1  christos       for (o = abfd->sections; o != NULL; o = o->next)
   1404   1.8  christos 	if (strlen (o->name) > SCNNMLEN
   1405   1.8  christos 	    && _bfd_stringtab_add (strtab, o->name, false, false)
   1406   1.8  christos 	       == (bfd_size_type) -1)
   1407   1.8  christos 	  return false;
   1408   1.1  christos     }
   1409   1.1  christos 
   1410   1.1  christos   /* Seek to the right place.  */
   1411   1.1  christos   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
   1412   1.8  christos     return false;
   1413   1.1  christos 
   1414   1.1  christos   /* Output all the symbols we have.  */
   1415   1.1  christos   written = 0;
   1416   1.1  christos   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
   1417   1.1  christos     {
   1418   1.1  christos       asymbol *symbol = *p;
   1419   1.3  christos       coff_symbol_type *c_symbol = coff_symbol_from (symbol);
   1420   1.1  christos 
   1421   1.1  christos       if (c_symbol == (coff_symbol_type *) NULL
   1422   1.1  christos 	  || c_symbol->native == (combined_entry_type *) NULL)
   1423   1.1  christos 	{
   1424   1.8  christos 	  if (!coff_write_alien_symbol (abfd, symbol, NULL, &written,
   1425   1.8  christos 					strtab, true, &debug_string_section,
   1426   1.1  christos 					&debug_string_size))
   1427   1.8  christos 	    return false;
   1428   1.1  christos 	}
   1429   1.1  christos       else
   1430   1.1  christos 	{
   1431   1.1  christos 	  if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
   1432   1.1  christos 	    {
   1433   1.1  christos 	      bfd_error_handler_type current_error_handler;
   1434   1.1  christos 	      enum coff_symbol_classification sym_class;
   1435   1.1  christos 	      unsigned char *n_sclass;
   1436   1.1  christos 
   1437   1.1  christos 	      /* Suppress error reporting by bfd_coff_classify_symbol.
   1438   1.1  christos 		 Error messages can be generated when we are processing a local
   1439   1.1  christos 		 symbol which has no associated section and we do not have to
   1440   1.1  christos 		 worry about this, all we need to know is that it is local.  */
   1441   1.1  christos 	      current_error_handler = bfd_set_error_handler (null_error_handler);
   1442   1.3  christos 	      BFD_ASSERT (c_symbol->native->is_sym);
   1443   1.1  christos 	      sym_class = bfd_coff_classify_symbol (abfd,
   1444   1.3  christos 						    &c_symbol->native->u.syment);
   1445   1.1  christos 	      (void) bfd_set_error_handler (current_error_handler);
   1446   1.1  christos 
   1447   1.1  christos 	      n_sclass = &c_symbol->native->u.syment.n_sclass;
   1448   1.1  christos 
   1449   1.1  christos 	      /* If the symbol class has been changed (eg objcopy/ld script/etc)
   1450   1.1  christos 		 we cannot retain the existing sclass from the original symbol.
   1451   1.1  christos 		 Weak symbols only have one valid sclass, so just set it always.
   1452   1.1  christos 		 If it is not local class and should be, set it C_STAT.
   1453   1.1  christos 		 If it is global and not classified as global, or if it is
   1454   1.1  christos 		 weak (which is also classified as global), set it C_EXT.  */
   1455   1.1  christos 
   1456   1.1  christos 	      if (symbol->flags & BSF_WEAK)
   1457   1.1  christos 		*n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
   1458   1.1  christos 	      else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL)
   1459   1.1  christos 		*n_sclass = C_STAT;
   1460   1.1  christos 	      else if (symbol->flags & BSF_GLOBAL
   1461   1.1  christos 		       && (sym_class != COFF_SYMBOL_GLOBAL
   1462   1.1  christos #ifdef COFF_WITH_PE
   1463   1.1  christos 			   || *n_sclass == C_NT_WEAK
   1464   1.1  christos #endif
   1465   1.1  christos 			   || *n_sclass == C_WEAKEXT))
   1466   1.1  christos 		c_symbol->native->u.syment.n_sclass = C_EXT;
   1467   1.1  christos 	    }
   1468   1.1  christos 
   1469   1.1  christos 	  if (!coff_write_native_symbol (abfd, c_symbol, &written,
   1470   1.8  christos 					 strtab, &debug_string_section,
   1471   1.1  christos 					 &debug_string_size))
   1472   1.8  christos 	    return false;
   1473   1.1  christos 	}
   1474   1.1  christos     }
   1475   1.1  christos 
   1476   1.1  christos   obj_raw_syment_count (abfd) = written;
   1477   1.1  christos 
   1478   1.8  christos   /* Now write out strings.
   1479   1.8  christos 
   1480   1.8  christos      We would normally not write anything here if there are no strings, but
   1481   1.8  christos      we'll write out 4 so that any stupid coff reader which tries to read the
   1482   1.8  christos      string table even when there isn't one won't croak.  */
   1483   1.8  christos   {
   1484   1.8  christos     bfd_byte buffer[STRING_SIZE_SIZE];
   1485   1.1  christos 
   1486   1.1  christos #if STRING_SIZE_SIZE == 4
   1487   1.8  christos     H_PUT_32 (abfd, _bfd_stringtab_size (strtab) + STRING_SIZE_SIZE, buffer);
   1488   1.1  christos #else
   1489   1.1  christos  #error Change H_PUT_32
   1490   1.1  christos #endif
   1491   1.9  christos     if (bfd_write (buffer, sizeof (buffer), abfd) != sizeof (buffer))
   1492   1.8  christos       return false;
   1493   1.1  christos 
   1494   1.8  christos     if (! _bfd_stringtab_emit (abfd, strtab))
   1495   1.8  christos       return false;
   1496   1.8  christos   }
   1497   1.1  christos 
   1498   1.8  christos   _bfd_stringtab_free (strtab);
   1499   1.1  christos 
   1500   1.1  christos   /* Make sure the .debug section was created to be the correct size.
   1501   1.1  christos      We should create it ourselves on the fly, but we don't because
   1502   1.1  christos      BFD won't let us write to any section until we know how large all
   1503   1.1  christos      the sections are.  We could still do it by making another pass
   1504   1.1  christos      over the symbols.  FIXME.  */
   1505   1.1  christos   BFD_ASSERT (debug_string_size == 0
   1506   1.1  christos 	      || (debug_string_section != (asection *) NULL
   1507   1.1  christos 		  && (BFD_ALIGN (debug_string_size,
   1508   1.1  christos 				 1 << debug_string_section->alignment_power)
   1509   1.1  christos 		      == debug_string_section->size)));
   1510   1.1  christos 
   1511   1.8  christos   return true;
   1512   1.1  christos }
   1513   1.1  christos 
   1514   1.8  christos bool
   1515   1.1  christos coff_write_linenumbers (bfd *abfd)
   1516   1.1  christos {
   1517   1.1  christos   asection *s;
   1518   1.1  christos   bfd_size_type linesz;
   1519   1.1  christos   void * buff;
   1520   1.1  christos 
   1521   1.1  christos   linesz = bfd_coff_linesz (abfd);
   1522   1.1  christos   buff = bfd_alloc (abfd, linesz);
   1523   1.1  christos   if (!buff)
   1524   1.8  christos     return false;
   1525   1.1  christos   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
   1526   1.1  christos     {
   1527   1.1  christos       if (s->lineno_count)
   1528   1.1  christos 	{
   1529   1.1  christos 	  asymbol **q = abfd->outsymbols;
   1530   1.1  christos 	  if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
   1531   1.8  christos 	    return false;
   1532   1.1  christos 	  /* Find all the linenumbers in this section.  */
   1533   1.1  christos 	  while (*q)
   1534   1.1  christos 	    {
   1535   1.1  christos 	      asymbol *p = *q;
   1536   1.1  christos 	      if (p->section->output_section == s)
   1537   1.1  christos 		{
   1538   1.1  christos 		  alent *l =
   1539   1.1  christos 		  BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
   1540   1.1  christos 			    (bfd_asymbol_bfd (p), p));
   1541   1.1  christos 		  if (l)
   1542   1.1  christos 		    {
   1543   1.1  christos 		      /* Found a linenumber entry, output.  */
   1544   1.1  christos 		      struct internal_lineno out;
   1545   1.3  christos 
   1546   1.1  christos 		      memset ((void *) & out, 0, sizeof (out));
   1547   1.1  christos 		      out.l_lnno = 0;
   1548   1.1  christos 		      out.l_addr.l_symndx = l->u.offset;
   1549   1.1  christos 		      bfd_coff_swap_lineno_out (abfd, &out, buff);
   1550   1.9  christos 		      if (bfd_write (buff, linesz, abfd) != linesz)
   1551   1.8  christos 			return false;
   1552   1.1  christos 		      l++;
   1553   1.1  christos 		      while (l->line_number)
   1554   1.1  christos 			{
   1555   1.1  christos 			  out.l_lnno = l->line_number;
   1556   1.1  christos 			  out.l_addr.l_symndx = l->u.offset;
   1557   1.1  christos 			  bfd_coff_swap_lineno_out (abfd, &out, buff);
   1558   1.9  christos 			  if (bfd_write (buff, linesz, abfd) != linesz)
   1559   1.8  christos 			    return false;
   1560   1.1  christos 			  l++;
   1561   1.1  christos 			}
   1562   1.1  christos 		    }
   1563   1.1  christos 		}
   1564   1.1  christos 	      q++;
   1565   1.1  christos 	    }
   1566   1.1  christos 	}
   1567   1.1  christos     }
   1568   1.1  christos   bfd_release (abfd, buff);
   1569   1.8  christos   return true;
   1570   1.1  christos }
   1571   1.1  christos 
   1572   1.1  christos alent *
   1573   1.1  christos coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
   1574   1.1  christos {
   1575   1.1  christos   return coffsymbol (symbol)->lineno;
   1576   1.1  christos }
   1577   1.1  christos 
   1578   1.1  christos /* This function transforms the offsets into the symbol table into
   1579   1.1  christos    pointers to syments.  */
   1580   1.1  christos 
   1581   1.1  christos static void
   1582   1.1  christos coff_pointerize_aux (bfd *abfd,
   1583   1.1  christos 		     combined_entry_type *table_base,
   1584   1.1  christos 		     combined_entry_type *symbol,
   1585   1.1  christos 		     unsigned int indaux,
   1586   1.9  christos 		     combined_entry_type *auxent)
   1587   1.1  christos {
   1588   1.1  christos   unsigned int type = symbol->u.syment.n_type;
   1589   1.1  christos   unsigned int n_sclass = symbol->u.syment.n_sclass;
   1590   1.1  christos 
   1591   1.3  christos   BFD_ASSERT (symbol->is_sym);
   1592   1.1  christos   if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
   1593   1.1  christos     {
   1594   1.1  christos       if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
   1595   1.1  christos 	  (abfd, table_base, symbol, indaux, auxent))
   1596   1.1  christos 	return;
   1597   1.1  christos     }
   1598   1.1  christos 
   1599   1.1  christos   /* Don't bother if this is a file or a section.  */
   1600   1.1  christos   if (n_sclass == C_STAT && type == T_NULL)
   1601   1.1  christos     return;
   1602   1.1  christos   if (n_sclass == C_FILE)
   1603   1.1  christos     return;
   1604   1.8  christos   if (n_sclass == C_DWARF)
   1605   1.8  christos     return;
   1606   1.1  christos 
   1607   1.3  christos   BFD_ASSERT (! auxent->is_sym);
   1608   1.1  christos   /* Otherwise patch up.  */
   1609   1.1  christos #define N_TMASK coff_data  (abfd)->local_n_tmask
   1610   1.1  christos #define N_BTSHFT coff_data (abfd)->local_n_btshft
   1611   1.3  christos 
   1612   1.1  christos   if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK
   1613   1.1  christos        || n_sclass == C_FCN)
   1614   1.9  christos       && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32 > 0
   1615   1.9  christos       && (auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32
   1616   1.9  christos 	  < obj_raw_syment_count (abfd)))
   1617   1.1  christos     {
   1618   1.1  christos       auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
   1619   1.9  christos 	table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32;
   1620   1.1  christos       auxent->fix_end = 1;
   1621   1.1  christos     }
   1622   1.7  christos 
   1623   1.1  christos   /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
   1624   1.1  christos      generate one, so we must be careful to ignore it.  */
   1625   1.9  christos   if (auxent->u.auxent.x_sym.x_tagndx.u32 < obj_raw_syment_count (abfd))
   1626   1.1  christos     {
   1627   1.1  christos       auxent->u.auxent.x_sym.x_tagndx.p =
   1628   1.9  christos 	table_base + auxent->u.auxent.x_sym.x_tagndx.u32;
   1629   1.1  christos       auxent->fix_tag = 1;
   1630   1.1  christos     }
   1631   1.1  christos }
   1632   1.1  christos 
   1633   1.1  christos /* Allocate space for the ".debug" section, and read it.
   1634   1.1  christos    We did not read the debug section until now, because
   1635   1.1  christos    we didn't want to go to the trouble until someone needed it.  */
   1636   1.1  christos 
   1637   1.1  christos static char *
   1638   1.3  christos build_debug_section (bfd *abfd, asection ** sect_return)
   1639   1.1  christos {
   1640   1.1  christos   char *debug_section;
   1641   1.1  christos   file_ptr position;
   1642   1.1  christos   bfd_size_type sec_size;
   1643   1.1  christos 
   1644   1.1  christos   asection *sect = bfd_get_section_by_name (abfd, ".debug");
   1645   1.1  christos 
   1646   1.1  christos   if (!sect)
   1647   1.1  christos     {
   1648   1.1  christos       bfd_set_error (bfd_error_no_debug_section);
   1649   1.1  christos       return NULL;
   1650   1.1  christos     }
   1651   1.1  christos 
   1652   1.1  christos   /* Seek to the beginning of the `.debug' section and read it.
   1653   1.1  christos      Save the current position first; it is needed by our caller.
   1654   1.1  christos      Then read debug section and reset the file pointer.  */
   1655   1.1  christos 
   1656   1.1  christos   position = bfd_tell (abfd);
   1657   1.8  christos   if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0)
   1658   1.8  christos     return NULL;
   1659   1.8  christos 
   1660   1.8  christos   sec_size = sect->size;
   1661   1.9  christos   debug_section = (char *) _bfd_alloc_and_read (abfd, sec_size + 1, sec_size);
   1662   1.8  christos   if (debug_section == NULL)
   1663   1.8  christos     return NULL;
   1664   1.9  christos   debug_section[sec_size] = 0;
   1665   1.8  christos 
   1666   1.8  christos   if (bfd_seek (abfd, position, SEEK_SET) != 0)
   1667   1.1  christos     return NULL;
   1668   1.3  christos 
   1669   1.3  christos   * sect_return = sect;
   1670   1.1  christos   return debug_section;
   1671   1.1  christos }
   1672   1.1  christos 
   1673   1.1  christos /* Return a pointer to a malloc'd copy of 'name'.  'name' may not be
   1674   1.1  christos    \0-terminated, but will not exceed 'maxlen' characters.  The copy *will*
   1675   1.1  christos    be \0-terminated.  */
   1676   1.1  christos 
   1677   1.1  christos static char *
   1678   1.1  christos copy_name (bfd *abfd, char *name, size_t maxlen)
   1679   1.1  christos {
   1680   1.1  christos   size_t len;
   1681   1.1  christos   char *newname;
   1682   1.1  christos 
   1683   1.1  christos   for (len = 0; len < maxlen; ++len)
   1684   1.1  christos     if (name[len] == '\0')
   1685   1.1  christos       break;
   1686   1.1  christos 
   1687   1.1  christos   if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
   1688   1.1  christos     return NULL;
   1689   1.1  christos 
   1690   1.1  christos   strncpy (newname, name, len);
   1691   1.1  christos   newname[len] = '\0';
   1692   1.1  christos   return newname;
   1693   1.1  christos }
   1694   1.1  christos 
   1695   1.1  christos /* Read in the external symbols.  */
   1696   1.1  christos 
   1697   1.8  christos bool
   1698   1.1  christos _bfd_coff_get_external_symbols (bfd *abfd)
   1699   1.1  christos {
   1700   1.8  christos   size_t symesz;
   1701   1.8  christos   size_t size;
   1702   1.1  christos   void * syms;
   1703   1.9  christos   ufile_ptr filesize;
   1704   1.1  christos 
   1705   1.1  christos   if (obj_coff_external_syms (abfd) != NULL)
   1706   1.8  christos     return true;
   1707   1.1  christos 
   1708   1.1  christos   symesz = bfd_coff_symesz (abfd);
   1709   1.8  christos   if (_bfd_mul_overflow (obj_raw_syment_count (abfd), symesz, &size))
   1710   1.6  christos     {
   1711   1.8  christos       bfd_set_error (bfd_error_file_truncated);
   1712   1.8  christos       return false;
   1713   1.6  christos     }
   1714   1.1  christos 
   1715   1.8  christos   if (size == 0)
   1716   1.8  christos     return true;
   1717   1.1  christos 
   1718   1.9  christos   filesize = bfd_get_file_size (abfd);
   1719   1.9  christos   if (filesize != 0
   1720   1.9  christos       && ((ufile_ptr) obj_sym_filepos (abfd) > filesize
   1721   1.9  christos 	  || size > filesize - obj_sym_filepos (abfd)))
   1722   1.9  christos     {
   1723   1.9  christos       bfd_set_error (bfd_error_file_truncated);
   1724   1.9  christos       return false;
   1725   1.9  christos     }
   1726   1.9  christos 
   1727   1.8  christos   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
   1728   1.8  christos     return false;
   1729   1.8  christos   syms = _bfd_malloc_and_read (abfd, size, size);
   1730   1.1  christos   obj_coff_external_syms (abfd) = syms;
   1731   1.8  christos   return syms != NULL;
   1732   1.1  christos }
   1733   1.1  christos 
   1734   1.1  christos /* Read in the external strings.  The strings are not loaded until
   1735   1.1  christos    they are needed.  This is because we have no simple way of
   1736   1.3  christos    detecting a missing string table in an archive.  If the strings
   1737   1.3  christos    are loaded then the STRINGS and STRINGS_LEN fields in the
   1738   1.3  christos    coff_tdata structure will be set.  */
   1739   1.1  christos 
   1740   1.1  christos const char *
   1741   1.1  christos _bfd_coff_read_string_table (bfd *abfd)
   1742   1.1  christos {
   1743   1.1  christos   char extstrsize[STRING_SIZE_SIZE];
   1744   1.1  christos   bfd_size_type strsize;
   1745   1.1  christos   char *strings;
   1746   1.8  christos   ufile_ptr pos;
   1747   1.8  christos   ufile_ptr filesize;
   1748   1.8  christos   size_t symesz;
   1749   1.8  christos   size_t size;
   1750   1.1  christos 
   1751   1.1  christos   if (obj_coff_strings (abfd) != NULL)
   1752   1.1  christos     return obj_coff_strings (abfd);
   1753   1.1  christos 
   1754   1.1  christos   if (obj_sym_filepos (abfd) == 0)
   1755   1.1  christos     {
   1756   1.1  christos       bfd_set_error (bfd_error_no_symbols);
   1757   1.1  christos       return NULL;
   1758   1.1  christos     }
   1759   1.1  christos 
   1760   1.8  christos   symesz = bfd_coff_symesz (abfd);
   1761   1.1  christos   pos = obj_sym_filepos (abfd);
   1762   1.8  christos   if (_bfd_mul_overflow (obj_raw_syment_count (abfd), symesz, &size)
   1763   1.8  christos       || pos + size < pos)
   1764   1.8  christos     {
   1765   1.8  christos       bfd_set_error (bfd_error_file_truncated);
   1766   1.8  christos       return NULL;
   1767   1.8  christos     }
   1768   1.8  christos 
   1769   1.8  christos   if (bfd_seek (abfd, pos + size, SEEK_SET) != 0)
   1770   1.1  christos     return NULL;
   1771   1.1  christos 
   1772   1.9  christos   if (bfd_read (extstrsize, sizeof extstrsize, abfd) != sizeof extstrsize)
   1773   1.1  christos     {
   1774   1.1  christos       if (bfd_get_error () != bfd_error_file_truncated)
   1775   1.1  christos 	return NULL;
   1776   1.1  christos 
   1777   1.1  christos       /* There is no string table.  */
   1778   1.1  christos       strsize = STRING_SIZE_SIZE;
   1779   1.1  christos     }
   1780   1.1  christos   else
   1781   1.1  christos     {
   1782   1.1  christos #if STRING_SIZE_SIZE == 4
   1783   1.1  christos       strsize = H_GET_32 (abfd, extstrsize);
   1784   1.1  christos #else
   1785   1.1  christos  #error Change H_GET_32
   1786   1.1  christos #endif
   1787   1.1  christos     }
   1788   1.1  christos 
   1789   1.8  christos   filesize = bfd_get_file_size (abfd);
   1790   1.8  christos   if (strsize < STRING_SIZE_SIZE
   1791   1.8  christos       || (filesize != 0 && strsize > filesize))
   1792   1.1  christos     {
   1793   1.6  christos       _bfd_error_handler
   1794   1.6  christos 	/* xgettext: c-format */
   1795   1.6  christos 	(_("%pB: bad string table size %" PRIu64), abfd, (uint64_t) strsize);
   1796   1.1  christos       bfd_set_error (bfd_error_bad_value);
   1797   1.1  christos       return NULL;
   1798   1.1  christos     }
   1799   1.1  christos 
   1800   1.3  christos   strings = (char *) bfd_malloc (strsize + 1);
   1801   1.1  christos   if (strings == NULL)
   1802   1.1  christos     return NULL;
   1803   1.1  christos 
   1804   1.3  christos   /* PR 17521 file: 079-54929-0.004.
   1805   1.3  christos      A corrupt file could contain an index that points into the first
   1806   1.3  christos      STRING_SIZE_SIZE bytes of the string table, so make sure that
   1807   1.3  christos      they are zero.  */
   1808   1.3  christos   memset (strings, 0, STRING_SIZE_SIZE);
   1809   1.3  christos 
   1810   1.9  christos   if (bfd_read (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
   1811   1.1  christos       != strsize - STRING_SIZE_SIZE)
   1812   1.1  christos     {
   1813   1.1  christos       free (strings);
   1814   1.1  christos       return NULL;
   1815   1.1  christos     }
   1816   1.1  christos 
   1817   1.1  christos   obj_coff_strings (abfd) = strings;
   1818   1.3  christos   obj_coff_strings_len (abfd) = strsize;
   1819   1.3  christos   /* Terminate the string table, just in case.  */
   1820   1.3  christos   strings[strsize] = 0;
   1821   1.1  christos   return strings;
   1822   1.1  christos }
   1823   1.1  christos 
   1824   1.1  christos /* Free up the external symbols and strings read from a COFF file.  */
   1825   1.1  christos 
   1826   1.8  christos bool
   1827   1.1  christos _bfd_coff_free_symbols (bfd *abfd)
   1828   1.1  christos {
   1829   1.6  christos   if (! bfd_family_coff (abfd))
   1830   1.8  christos     return false;
   1831   1.6  christos 
   1832   1.1  christos   if (obj_coff_external_syms (abfd) != NULL
   1833   1.1  christos       && ! obj_coff_keep_syms (abfd))
   1834   1.1  christos     {
   1835   1.1  christos       free (obj_coff_external_syms (abfd));
   1836   1.1  christos       obj_coff_external_syms (abfd) = NULL;
   1837   1.1  christos     }
   1838   1.6  christos 
   1839   1.1  christos   if (obj_coff_strings (abfd) != NULL
   1840   1.1  christos       && ! obj_coff_keep_strings (abfd))
   1841   1.1  christos     {
   1842   1.1  christos       free (obj_coff_strings (abfd));
   1843   1.1  christos       obj_coff_strings (abfd) = NULL;
   1844   1.3  christos       obj_coff_strings_len (abfd) = 0;
   1845   1.1  christos     }
   1846   1.6  christos 
   1847   1.8  christos   return true;
   1848   1.1  christos }
   1849   1.1  christos 
   1850   1.1  christos /* Read a symbol table into freshly bfd_allocated memory, swap it, and
   1851   1.1  christos    knit the symbol names into a normalized form.  By normalized here I
   1852   1.1  christos    mean that all symbols have an n_offset pointer that points to a null-
   1853   1.1  christos    terminated string.  */
   1854   1.1  christos 
   1855   1.1  christos combined_entry_type *
   1856   1.1  christos coff_get_normalized_symtab (bfd *abfd)
   1857   1.1  christos {
   1858   1.1  christos   combined_entry_type *internal;
   1859   1.1  christos   combined_entry_type *internal_ptr;
   1860   1.1  christos   size_t symesz;
   1861   1.1  christos   char *raw_src;
   1862   1.1  christos   char *raw_end;
   1863   1.1  christos   const char *string_table = NULL;
   1864   1.3  christos   asection * debug_sec = NULL;
   1865   1.3  christos   char *debug_sec_data = NULL;
   1866   1.1  christos   bfd_size_type size;
   1867   1.1  christos 
   1868   1.1  christos   if (obj_raw_syments (abfd) != NULL)
   1869   1.1  christos     return obj_raw_syments (abfd);
   1870   1.1  christos 
   1871   1.3  christos   if (! _bfd_coff_get_external_symbols (abfd))
   1872   1.3  christos     return NULL;
   1873   1.3  christos 
   1874   1.7  christos   size = obj_raw_syment_count (abfd);
   1875   1.6  christos   /* Check for integer overflow.  */
   1876   1.7  christos   if (size > (bfd_size_type) -1 / sizeof (combined_entry_type))
   1877   1.6  christos     return NULL;
   1878   1.7  christos   size *= sizeof (combined_entry_type);
   1879   1.1  christos   internal = (combined_entry_type *) bfd_zalloc (abfd, size);
   1880   1.1  christos   if (internal == NULL && size != 0)
   1881   1.1  christos     return NULL;
   1882   1.1  christos 
   1883   1.1  christos   raw_src = (char *) obj_coff_external_syms (abfd);
   1884   1.1  christos 
   1885   1.1  christos   /* Mark the end of the symbols.  */
   1886   1.1  christos   symesz = bfd_coff_symesz (abfd);
   1887   1.8  christos   raw_end = PTR_ADD (raw_src, obj_raw_syment_count (abfd) * symesz);
   1888   1.1  christos 
   1889   1.1  christos   /* FIXME SOMEDAY.  A string table size of zero is very weird, but
   1890   1.1  christos      probably possible.  If one shows up, it will probably kill us.  */
   1891   1.1  christos 
   1892   1.1  christos   /* Swap all the raw entries.  */
   1893   1.1  christos   for (internal_ptr = internal;
   1894   1.1  christos        raw_src < raw_end;
   1895   1.1  christos        raw_src += symesz, internal_ptr++)
   1896   1.1  christos     {
   1897   1.3  christos       unsigned int i;
   1898   1.1  christos 
   1899   1.1  christos       bfd_coff_swap_sym_in (abfd, (void *) raw_src,
   1900   1.1  christos 			    (void *) & internal_ptr->u.syment);
   1901   1.8  christos       internal_ptr->is_sym = true;
   1902   1.9  christos       combined_entry_type *sym = internal_ptr;
   1903   1.8  christos 
   1904   1.8  christos       /* PR 17512: Prevent buffer overrun.  */
   1905   1.9  christos       if (sym->u.syment.n_numaux > ((raw_end - 1) - raw_src) / symesz)
   1906   1.9  christos 	return NULL;
   1907   1.3  christos 
   1908   1.9  christos       for (i = 0; i < sym->u.syment.n_numaux; i++)
   1909   1.1  christos 	{
   1910   1.1  christos 	  internal_ptr++;
   1911   1.7  christos 	  raw_src += symesz;
   1912   1.7  christos 
   1913   1.1  christos 	  bfd_coff_swap_aux_in (abfd, (void *) raw_src,
   1914   1.9  christos 				sym->u.syment.n_type,
   1915   1.9  christos 				sym->u.syment.n_sclass,
   1916   1.9  christos 				(int) i, sym->u.syment.n_numaux,
   1917   1.1  christos 				&(internal_ptr->u.auxent));
   1918   1.3  christos 
   1919   1.8  christos 	  internal_ptr->is_sym = false;
   1920   1.9  christos 	  coff_pointerize_aux (abfd, internal, sym, i, internal_ptr);
   1921   1.1  christos 	}
   1922   1.1  christos 
   1923   1.9  christos       if (sym->u.syment.n_sclass == C_FILE
   1924   1.9  christos 	  && sym->u.syment.n_numaux > 0)
   1925   1.1  christos 	{
   1926   1.9  christos 	  combined_entry_type * aux = sym + 1;
   1927   1.3  christos 
   1928   1.1  christos 	  /* Make a file symbol point to the name in the auxent, since
   1929   1.1  christos 	     the text ".file" is redundant.  */
   1930   1.3  christos 	  BFD_ASSERT (! aux->is_sym);
   1931   1.3  christos 
   1932   1.8  christos 	  if (aux->u.auxent.x_file.x_n.x_n.x_zeroes == 0)
   1933   1.1  christos 	    {
   1934   1.1  christos 	      /* The filename is a long one, point into the string table.  */
   1935   1.1  christos 	      if (string_table == NULL)
   1936   1.1  christos 		{
   1937   1.1  christos 		  string_table = _bfd_coff_read_string_table (abfd);
   1938   1.1  christos 		  if (string_table == NULL)
   1939   1.1  christos 		    return NULL;
   1940   1.1  christos 		}
   1941   1.1  christos 
   1942   1.9  christos 	      if ((bfd_size_type) aux->u.auxent.x_file.x_n.x_n.x_offset
   1943   1.3  christos 		  >= obj_coff_strings_len (abfd))
   1944   1.9  christos 		sym->u.syment._n._n_n._n_offset =
   1945  1.10  christos 		  (uintptr_t) bfd_symbol_error_name;
   1946   1.3  christos 	      else
   1947   1.9  christos 		sym->u.syment._n._n_n._n_offset =
   1948   1.8  christos 		  (uintptr_t) (string_table
   1949   1.8  christos 			       + aux->u.auxent.x_file.x_n.x_n.x_offset);
   1950   1.1  christos 	    }
   1951   1.1  christos 	  else
   1952   1.1  christos 	    {
   1953   1.1  christos 	      /* Ordinary short filename, put into memory anyway.  The
   1954   1.6  christos 		 Microsoft PE tools sometimes store a filename in
   1955   1.6  christos 		 multiple AUX entries.  */
   1956   1.9  christos 	      size_t len;
   1957   1.9  christos 	      char *src;
   1958   1.9  christos 	      if (sym->u.syment.n_numaux > 1 && obj_pe (abfd))
   1959   1.9  christos 		{
   1960   1.9  christos 		  len = sym->u.syment.n_numaux * symesz;
   1961   1.9  christos 		  src = raw_src - (len - symesz);
   1962   1.9  christos 		}
   1963   1.1  christos 	      else
   1964   1.9  christos 		{
   1965   1.9  christos 		  len = bfd_coff_filnmlen (abfd);
   1966   1.9  christos 		  src = aux->u.auxent.x_file.x_n.x_fname;
   1967   1.9  christos 		}
   1968   1.9  christos 	      sym->u.syment._n._n_n._n_offset =
   1969   1.9  christos 		(uintptr_t) copy_name (abfd, src, len);
   1970   1.1  christos 	    }
   1971   1.8  christos 
   1972   1.8  christos 	  /* Normalize other strings available in C_FILE aux entries.  */
   1973   1.9  christos 	  if (!obj_pe (abfd))
   1974   1.9  christos 	    for (int numaux = 1;
   1975   1.9  christos 		 numaux < sym->u.syment.n_numaux;
   1976   1.9  christos 		 numaux++)
   1977   1.8  christos 	      {
   1978   1.9  christos 		aux = sym + numaux + 1;
   1979   1.8  christos 		BFD_ASSERT (! aux->is_sym);
   1980   1.8  christos 
   1981   1.8  christos 		if (aux->u.auxent.x_file.x_n.x_n.x_zeroes == 0)
   1982   1.8  christos 		  {
   1983   1.9  christos 		    /* The string information is a long one, point
   1984   1.9  christos 		       into the string table.  */
   1985   1.8  christos 		    if (string_table == NULL)
   1986   1.8  christos 		      {
   1987   1.8  christos 			string_table = _bfd_coff_read_string_table (abfd);
   1988   1.8  christos 			if (string_table == NULL)
   1989   1.8  christos 			  return NULL;
   1990   1.8  christos 		      }
   1991   1.8  christos 
   1992   1.9  christos 		    if ((bfd_size_type) aux->u.auxent.x_file.x_n.x_n.x_offset
   1993   1.8  christos 			>= obj_coff_strings_len (abfd))
   1994   1.8  christos 		      aux->u.auxent.x_file.x_n.x_n.x_offset =
   1995  1.10  christos 			(uintptr_t) bfd_symbol_error_name;
   1996   1.8  christos 		    else
   1997   1.8  christos 		      aux->u.auxent.x_file.x_n.x_n.x_offset =
   1998   1.8  christos 			(uintptr_t) (string_table
   1999   1.9  christos 				     + aux->u.auxent.x_file.x_n.x_n.x_offset);
   2000   1.8  christos 		  }
   2001   1.8  christos 		else
   2002   1.8  christos 		  aux->u.auxent.x_file.x_n.x_n.x_offset =
   2003   1.8  christos 		    ((uintptr_t)
   2004   1.8  christos 		     copy_name (abfd,
   2005   1.8  christos 				aux->u.auxent.x_file.x_n.x_fname,
   2006   1.9  christos 				bfd_coff_filnmlen (abfd)));
   2007   1.8  christos 	      }
   2008   1.8  christos 
   2009   1.1  christos 	}
   2010   1.1  christos       else
   2011   1.1  christos 	{
   2012   1.9  christos 	  if (sym->u.syment._n._n_n._n_zeroes != 0)
   2013   1.1  christos 	    {
   2014   1.1  christos 	      /* This is a "short" name.  Make it long.  */
   2015   1.1  christos 	      char *newstring;
   2016   1.1  christos 
   2017   1.1  christos 	      /* Find the length of this string without walking into memory
   2018   1.6  christos 		 that isn't ours.  */
   2019   1.9  christos 	      for (i = 0; i < SYMNMLEN; ++i)
   2020   1.9  christos 		if (sym->u.syment._n._n_name[i] == '\0')
   2021   1.1  christos 		  break;
   2022   1.1  christos 
   2023   1.9  christos 	      newstring = bfd_alloc (abfd, i + 1);
   2024   1.1  christos 	      if (newstring == NULL)
   2025   1.1  christos 		return NULL;
   2026   1.9  christos 	      memcpy (newstring, sym->u.syment._n._n_name, i);
   2027   1.9  christos 	      newstring[i] = 0;
   2028   1.9  christos 	      sym->u.syment._n._n_n._n_offset = (uintptr_t) newstring;
   2029   1.9  christos 	      sym->u.syment._n._n_n._n_zeroes = 0;
   2030   1.9  christos 	    }
   2031   1.9  christos 	  else if (sym->u.syment._n._n_n._n_offset == 0)
   2032   1.9  christos 	    sym->u.syment._n._n_n._n_offset = (uintptr_t) "";
   2033   1.9  christos 	  else if (!bfd_coff_symname_in_debug (abfd, &sym->u.syment))
   2034   1.1  christos 	    {
   2035   1.1  christos 	      /* Long name already.  Point symbol at the string in the
   2036   1.6  christos 		 table.  */
   2037   1.1  christos 	      if (string_table == NULL)
   2038   1.1  christos 		{
   2039   1.1  christos 		  string_table = _bfd_coff_read_string_table (abfd);
   2040   1.1  christos 		  if (string_table == NULL)
   2041   1.1  christos 		    return NULL;
   2042   1.1  christos 		}
   2043   1.9  christos 	      if (sym->u.syment._n._n_n._n_offset >= obj_coff_strings_len (abfd))
   2044   1.9  christos 		sym->u.syment._n._n_n._n_offset =
   2045  1.10  christos 		  (uintptr_t) bfd_symbol_error_name;
   2046   1.3  christos 	      else
   2047   1.9  christos 		sym->u.syment._n._n_n._n_offset =
   2048   1.9  christos 		  (uintptr_t) (string_table
   2049   1.9  christos 			       + sym->u.syment._n._n_n._n_offset);
   2050   1.1  christos 	    }
   2051   1.1  christos 	  else
   2052   1.1  christos 	    {
   2053   1.1  christos 	      /* Long name in debug section.  Very similar.  */
   2054   1.3  christos 	      if (debug_sec_data == NULL)
   2055   1.3  christos 		{
   2056   1.9  christos 		  debug_sec_data = build_debug_section (abfd, &debug_sec);
   2057   1.9  christos 		  if (debug_sec_data == NULL)
   2058   1.9  christos 		    return NULL;
   2059   1.3  christos 		}
   2060   1.9  christos 	      /* PR binutils/17512: Catch out of range offsets into
   2061   1.9  christos 		 the debug data.  */
   2062   1.9  christos 	      if (sym->u.syment._n._n_n._n_offset >= debug_sec->size)
   2063   1.9  christos 		sym->u.syment._n._n_n._n_offset =
   2064  1.10  christos 		  (uintptr_t) bfd_symbol_error_name;
   2065   1.3  christos 	      else
   2066   1.9  christos 		sym->u.syment._n._n_n._n_offset =
   2067   1.9  christos 		  (uintptr_t) (debug_sec_data
   2068   1.9  christos 			       + sym->u.syment._n._n_n._n_offset);
   2069   1.1  christos 	    }
   2070   1.1  christos 	}
   2071   1.9  christos     }
   2072   1.9  christos 
   2073   1.9  christos   /* Free the raw symbols.  */
   2074   1.9  christos   if (obj_coff_external_syms (abfd) != NULL
   2075   1.9  christos       && ! obj_coff_keep_syms (abfd))
   2076   1.9  christos     {
   2077   1.9  christos       free (obj_coff_external_syms (abfd));
   2078   1.9  christos       obj_coff_external_syms (abfd) = NULL;
   2079   1.1  christos     }
   2080   1.1  christos 
   2081   1.1  christos   obj_raw_syments (abfd) = internal;
   2082   1.1  christos   BFD_ASSERT (obj_raw_syment_count (abfd)
   2083   1.9  christos 	      == (size_t) (internal_ptr - internal));
   2084   1.1  christos 
   2085   1.1  christos   return internal;
   2086   1.1  christos }
   2087   1.1  christos 
   2088   1.1  christos long
   2089   1.1  christos coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
   2090   1.1  christos {
   2091   1.9  christos   size_t count, raw;
   2092   1.9  christos 
   2093   1.9  christos   count = asect->reloc_count;
   2094   1.9  christos   if (count >= LONG_MAX / sizeof (arelent *)
   2095   1.9  christos       || _bfd_mul_overflow (count, bfd_coff_relsz (abfd), &raw))
   2096   1.1  christos     {
   2097   1.9  christos       bfd_set_error (bfd_error_file_too_big);
   2098   1.1  christos       return -1;
   2099   1.1  christos     }
   2100   1.9  christos   if (!bfd_write_p (abfd))
   2101   1.7  christos     {
   2102   1.9  christos       ufile_ptr filesize = bfd_get_file_size (abfd);
   2103   1.9  christos       if (filesize != 0 && raw > filesize)
   2104   1.9  christos 	{
   2105   1.9  christos 	  bfd_set_error (bfd_error_file_truncated);
   2106   1.9  christos 	  return -1;
   2107   1.9  christos 	}
   2108   1.7  christos     }
   2109   1.9  christos   return (count + 1) * sizeof (arelent *);
   2110   1.1  christos }
   2111   1.1  christos 
   2112   1.1  christos asymbol *
   2113   1.1  christos coff_make_empty_symbol (bfd *abfd)
   2114   1.1  christos {
   2115   1.8  christos   size_t amt = sizeof (coff_symbol_type);
   2116   1.1  christos   coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt);
   2117   1.1  christos 
   2118   1.1  christos   if (new_symbol == NULL)
   2119   1.1  christos     return NULL;
   2120   1.1  christos   new_symbol->symbol.section = 0;
   2121   1.3  christos   new_symbol->native = NULL;
   2122   1.1  christos   new_symbol->lineno = NULL;
   2123   1.8  christos   new_symbol->done_lineno = false;
   2124   1.1  christos   new_symbol->symbol.the_bfd = abfd;
   2125   1.1  christos 
   2126   1.1  christos   return & new_symbol->symbol;
   2127   1.1  christos }
   2128   1.1  christos 
   2129   1.1  christos /* Make a debugging symbol.  */
   2130   1.1  christos 
   2131   1.1  christos asymbol *
   2132   1.9  christos coff_bfd_make_debug_symbol (bfd *abfd)
   2133   1.1  christos {
   2134   1.8  christos   size_t amt = sizeof (coff_symbol_type);
   2135   1.1  christos   coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt);
   2136   1.1  christos 
   2137   1.1  christos   if (new_symbol == NULL)
   2138   1.1  christos     return NULL;
   2139   1.1  christos   /* @@ The 10 is a guess at a plausible maximum number of aux entries
   2140   1.1  christos      (but shouldn't be a constant).  */
   2141   1.1  christos   amt = sizeof (combined_entry_type) * 10;
   2142   1.1  christos   new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
   2143   1.1  christos   if (!new_symbol->native)
   2144   1.1  christos     return NULL;
   2145   1.8  christos   new_symbol->native->is_sym = true;
   2146   1.1  christos   new_symbol->symbol.section = bfd_abs_section_ptr;
   2147   1.1  christos   new_symbol->symbol.flags = BSF_DEBUGGING;
   2148   1.1  christos   new_symbol->lineno = NULL;
   2149   1.8  christos   new_symbol->done_lineno = false;
   2150   1.1  christos   new_symbol->symbol.the_bfd = abfd;
   2151   1.3  christos 
   2152   1.1  christos   return & new_symbol->symbol;
   2153   1.1  christos }
   2154   1.1  christos 
   2155   1.1  christos void
   2156   1.1  christos coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
   2157   1.1  christos {
   2158   1.1  christos   bfd_symbol_info (symbol, ret);
   2159   1.1  christos 
   2160   1.1  christos   if (coffsymbol (symbol)->native != NULL
   2161   1.3  christos       && coffsymbol (symbol)->native->fix_value
   2162   1.3  christos       && coffsymbol (symbol)->native->is_sym)
   2163   1.8  christos     ret->value
   2164   1.8  christos       = (((uintptr_t) coffsymbol (symbol)->native->u.syment.n_value
   2165   1.8  christos 	  - (uintptr_t) obj_raw_syments (abfd))
   2166   1.8  christos 	 / sizeof (combined_entry_type));
   2167   1.1  christos }
   2168   1.1  christos 
   2169   1.1  christos /* Print out information about COFF symbol.  */
   2170   1.1  christos 
   2171   1.1  christos void
   2172   1.1  christos coff_print_symbol (bfd *abfd,
   2173   1.1  christos 		   void * filep,
   2174   1.1  christos 		   asymbol *symbol,
   2175   1.1  christos 		   bfd_print_symbol_type how)
   2176   1.1  christos {
   2177   1.1  christos   FILE * file = (FILE *) filep;
   2178  1.10  christos   const char *symname = (symbol->name != bfd_symbol_error_name
   2179  1.10  christos 			 ? symbol->name : _("<corrupt>"));
   2180   1.1  christos 
   2181   1.1  christos   switch (how)
   2182   1.1  christos     {
   2183   1.1  christos     case bfd_print_symbol_name:
   2184  1.10  christos       fprintf (file, "%s", symname);
   2185   1.1  christos       break;
   2186   1.1  christos 
   2187   1.1  christos     case bfd_print_symbol_more:
   2188   1.1  christos       fprintf (file, "coff %s %s",
   2189   1.1  christos 	       coffsymbol (symbol)->native ? "n" : "g",
   2190   1.1  christos 	       coffsymbol (symbol)->lineno ? "l" : " ");
   2191   1.1  christos       break;
   2192   1.1  christos 
   2193   1.1  christos     case bfd_print_symbol_all:
   2194   1.1  christos       if (coffsymbol (symbol)->native)
   2195   1.1  christos 	{
   2196   1.1  christos 	  bfd_vma val;
   2197   1.1  christos 	  unsigned int aux;
   2198   1.1  christos 	  combined_entry_type *combined = coffsymbol (symbol)->native;
   2199   1.1  christos 	  combined_entry_type *root = obj_raw_syments (abfd);
   2200   1.1  christos 	  struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
   2201   1.1  christos 
   2202   1.1  christos 	  fprintf (file, "[%3ld]", (long) (combined - root));
   2203   1.1  christos 
   2204   1.3  christos 	  /* PR 17512: file: 079-33786-0.001:0.1.  */
   2205   1.3  christos 	  if (combined < obj_raw_syments (abfd)
   2206   1.3  christos 	      || combined >= obj_raw_syments (abfd) + obj_raw_syment_count (abfd))
   2207   1.3  christos 	    {
   2208  1.10  christos 	      fprintf (file, _("<corrupt info> %s"), symname);
   2209   1.3  christos 	      break;
   2210   1.3  christos 	    }
   2211   1.3  christos 
   2212   1.3  christos 	  BFD_ASSERT (combined->is_sym);
   2213   1.1  christos 	  if (! combined->fix_value)
   2214   1.1  christos 	    val = (bfd_vma) combined->u.syment.n_value;
   2215   1.1  christos 	  else
   2216   1.8  christos 	    val = (((uintptr_t) combined->u.syment.n_value - (uintptr_t) root)
   2217   1.8  christos 		   / sizeof (combined_entry_type));
   2218   1.1  christos 
   2219   1.8  christos 	  fprintf (file, "(sec %2d)(fl 0x%02x)(ty %4x)(scl %3d) (nx %d) 0x",
   2220   1.1  christos 		   combined->u.syment.n_scnum,
   2221   1.1  christos 		   combined->u.syment.n_flags,
   2222   1.1  christos 		   combined->u.syment.n_type,
   2223   1.1  christos 		   combined->u.syment.n_sclass,
   2224   1.1  christos 		   combined->u.syment.n_numaux);
   2225   1.1  christos 	  bfd_fprintf_vma (abfd, file, val);
   2226  1.10  christos 	  fprintf (file, " %s", symname);
   2227   1.1  christos 
   2228   1.1  christos 	  for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
   2229   1.1  christos 	    {
   2230   1.1  christos 	      combined_entry_type *auxp = combined + aux + 1;
   2231   1.1  christos 	      long tagndx;
   2232   1.1  christos 
   2233   1.3  christos 	      BFD_ASSERT (! auxp->is_sym);
   2234   1.1  christos 	      if (auxp->fix_tag)
   2235   1.1  christos 		tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
   2236   1.1  christos 	      else
   2237   1.9  christos 		tagndx = auxp->u.auxent.x_sym.x_tagndx.u32;
   2238   1.1  christos 
   2239   1.1  christos 	      fprintf (file, "\n");
   2240   1.1  christos 
   2241   1.1  christos 	      if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
   2242   1.1  christos 		continue;
   2243   1.1  christos 
   2244   1.1  christos 	      switch (combined->u.syment.n_sclass)
   2245   1.1  christos 		{
   2246   1.1  christos 		case C_FILE:
   2247   1.1  christos 		  fprintf (file, "File ");
   2248   1.8  christos 		  /* Add additional information if this isn't the filename
   2249   1.8  christos 		     auxiliary entry.  */
   2250   1.8  christos 		  if (auxp->u.auxent.x_file.x_ftype)
   2251   1.8  christos 		    fprintf (file, "ftype %d fname \"%s\"",
   2252   1.8  christos 			     auxp->u.auxent.x_file.x_ftype,
   2253   1.8  christos 			     (char *) auxp->u.auxent.x_file.x_n.x_n.x_offset);
   2254   1.8  christos 		  break;
   2255   1.8  christos 
   2256   1.8  christos 		case C_DWARF:
   2257   1.9  christos 		  fprintf (file, "AUX scnlen %#" PRIx64 " nreloc %" PRId64,
   2258   1.9  christos 			   auxp->u.auxent.x_sect.x_scnlen,
   2259   1.8  christos 			   auxp->u.auxent.x_sect.x_nreloc);
   2260   1.1  christos 		  break;
   2261   1.1  christos 
   2262   1.1  christos 		case C_STAT:
   2263   1.1  christos 		  if (combined->u.syment.n_type == T_NULL)
   2264   1.1  christos 		    /* Probably a section symbol ?  */
   2265   1.1  christos 		    {
   2266   1.1  christos 		      fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
   2267   1.1  christos 			       (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
   2268   1.1  christos 			       auxp->u.auxent.x_scn.x_nreloc,
   2269   1.1  christos 			       auxp->u.auxent.x_scn.x_nlinno);
   2270   1.1  christos 		      if (auxp->u.auxent.x_scn.x_checksum != 0
   2271   1.1  christos 			  || auxp->u.auxent.x_scn.x_associated != 0
   2272   1.1  christos 			  || auxp->u.auxent.x_scn.x_comdat != 0)
   2273   1.9  christos 			fprintf (file, " checksum 0x%x assoc %d comdat %d",
   2274   1.1  christos 				 auxp->u.auxent.x_scn.x_checksum,
   2275   1.1  christos 				 auxp->u.auxent.x_scn.x_associated,
   2276   1.1  christos 				 auxp->u.auxent.x_scn.x_comdat);
   2277   1.1  christos 		      break;
   2278   1.1  christos 		    }
   2279   1.6  christos 		  /* Fall through.  */
   2280   1.1  christos 		case C_EXT:
   2281   1.1  christos 		case C_AIX_WEAKEXT:
   2282   1.1  christos 		  if (ISFCN (combined->u.syment.n_type))
   2283   1.1  christos 		    {
   2284   1.1  christos 		      long next, llnos;
   2285   1.1  christos 
   2286   1.1  christos 		      if (auxp->fix_end)
   2287   1.1  christos 			next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
   2288   1.1  christos 			       - root);
   2289   1.1  christos 		      else
   2290   1.9  christos 			next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32;
   2291   1.1  christos 		      llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
   2292   1.1  christos 		      fprintf (file,
   2293   1.1  christos 			       "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
   2294   1.1  christos 			       tagndx,
   2295   1.1  christos 			       (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
   2296   1.1  christos 			       llnos, next);
   2297   1.1  christos 		      break;
   2298   1.1  christos 		    }
   2299   1.6  christos 		  /* Fall through.  */
   2300   1.1  christos 		default:
   2301   1.1  christos 		  fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
   2302   1.1  christos 			   auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
   2303   1.1  christos 			   auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
   2304   1.1  christos 			   tagndx);
   2305   1.1  christos 		  if (auxp->fix_end)
   2306   1.1  christos 		    fprintf (file, " endndx %ld",
   2307   1.1  christos 			     ((long)
   2308   1.1  christos 			      (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
   2309   1.1  christos 			       - root)));
   2310   1.1  christos 		  break;
   2311   1.1  christos 		}
   2312   1.1  christos 	    }
   2313   1.1  christos 
   2314   1.1  christos 	  if (l)
   2315   1.1  christos 	    {
   2316  1.10  christos 	      fprintf (file, "\n%s :",
   2317  1.10  christos 		       l->u.sym->name != bfd_symbol_error_name
   2318  1.10  christos 		       ? l->u.sym->name : _("<corrupt>"));
   2319   1.1  christos 	      l++;
   2320   1.1  christos 	      while (l->line_number)
   2321   1.1  christos 		{
   2322   1.3  christos 		  if (l->line_number > 0)
   2323   1.3  christos 		    {
   2324   1.3  christos 		      fprintf (file, "\n%4d : ", l->line_number);
   2325   1.3  christos 		      bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
   2326   1.3  christos 		    }
   2327   1.1  christos 		  l++;
   2328   1.1  christos 		}
   2329   1.1  christos 	    }
   2330   1.1  christos 	}
   2331   1.1  christos       else
   2332   1.1  christos 	{
   2333   1.1  christos 	  bfd_print_symbol_vandf (abfd, (void *) file, symbol);
   2334   1.1  christos 	  fprintf (file, " %-5s %s %s %s",
   2335   1.1  christos 		   symbol->section->name,
   2336   1.1  christos 		   coffsymbol (symbol)->native ? "n" : "g",
   2337   1.1  christos 		   coffsymbol (symbol)->lineno ? "l" : " ",
   2338  1.10  christos 		   symname);
   2339   1.1  christos 	}
   2340   1.1  christos     }
   2341   1.1  christos }
   2342   1.1  christos 
   2343   1.1  christos /* Return whether a symbol name implies a local symbol.  In COFF,
   2344   1.1  christos    local symbols generally start with ``.L''.  Most targets use this
   2345   1.1  christos    function for the is_local_label_name entry point, but some may
   2346   1.1  christos    override it.  */
   2347   1.1  christos 
   2348   1.8  christos bool
   2349   1.1  christos _bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
   2350   1.1  christos 			       const char *name)
   2351   1.1  christos {
   2352   1.1  christos   return name[0] == '.' && name[1] == 'L';
   2353   1.1  christos }
   2354   1.1  christos 
   2355   1.1  christos /* Provided a BFD, a section and an offset (in bytes, not octets) into the
   2356   1.1  christos    section, calculate and return the name of the source file and the line
   2357   1.1  christos    nearest to the wanted location.  */
   2358   1.1  christos 
   2359   1.8  christos bool
   2360   1.1  christos coff_find_nearest_line_with_names (bfd *abfd,
   2361   1.6  christos 				   asymbol **symbols,
   2362   1.6  christos 				   asection *section,
   2363   1.6  christos 				   bfd_vma offset,
   2364   1.6  christos 				   const char **filename_ptr,
   2365   1.6  christos 				   const char **functionname_ptr,
   2366   1.6  christos 				   unsigned int *line_ptr,
   2367   1.6  christos 				   const struct dwarf_debug_section *debug_sections)
   2368   1.1  christos {
   2369   1.8  christos   bool found;
   2370   1.1  christos   unsigned int i;
   2371   1.1  christos   unsigned int line_base;
   2372   1.1  christos   coff_data_type *cof = coff_data (abfd);
   2373   1.1  christos   /* Run through the raw syments if available.  */
   2374   1.1  christos   combined_entry_type *p;
   2375   1.1  christos   combined_entry_type *pend;
   2376   1.1  christos   alent *l;
   2377   1.1  christos   struct coff_section_tdata *sec_data;
   2378   1.8  christos   size_t amt;
   2379   1.1  christos 
   2380   1.1  christos   /* Before looking through the symbol table, try to use a .stab
   2381   1.1  christos      section to find the information.  */
   2382   1.1  christos   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
   2383   1.1  christos 					     &found, filename_ptr,
   2384   1.1  christos 					     functionname_ptr, line_ptr,
   2385   1.1  christos 					     &coff_data(abfd)->line_info))
   2386   1.8  christos     return false;
   2387   1.1  christos 
   2388   1.1  christos   if (found)
   2389   1.8  christos     return true;
   2390   1.1  christos 
   2391   1.1  christos   /* Also try examining DWARF2 debugging information.  */
   2392   1.3  christos   if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
   2393   1.1  christos 				     filename_ptr, functionname_ptr,
   2394   1.7  christos 				     line_ptr, NULL, debug_sections,
   2395   1.1  christos 				     &coff_data(abfd)->dwarf2_find_line_info))
   2396   1.8  christos     return true;
   2397   1.1  christos 
   2398   1.6  christos   sec_data = coff_section_data (abfd, section);
   2399   1.6  christos 
   2400   1.3  christos   /* If the DWARF lookup failed, but there is DWARF information available
   2401   1.3  christos      then the problem might be that the file has been rebased.  This tool
   2402   1.3  christos      changes the VMAs of all the sections, but it does not update the DWARF
   2403   1.3  christos      information.  So try again, using a bias against the address sought.  */
   2404   1.3  christos   if (coff_data (abfd)->dwarf2_find_line_info != NULL)
   2405   1.3  christos     {
   2406   1.7  christos       bfd_signed_vma bias = 0;
   2407   1.3  christos 
   2408   1.6  christos       /* Create a cache of the result for the next call.  */
   2409   1.6  christos       if (sec_data == NULL && section->owner == abfd)
   2410   1.6  christos 	{
   2411   1.6  christos 	  amt = sizeof (struct coff_section_tdata);
   2412   1.6  christos 	  section->used_by_bfd = bfd_zalloc (abfd, amt);
   2413   1.6  christos 	  sec_data = (struct coff_section_tdata *) section->used_by_bfd;
   2414   1.6  christos 	}
   2415   1.6  christos 
   2416   1.6  christos       if (sec_data != NULL && sec_data->saved_bias)
   2417   1.8  christos 	bias = sec_data->bias;
   2418   1.7  christos       else if (symbols)
   2419   1.6  christos 	{
   2420   1.6  christos 	  bias = _bfd_dwarf2_find_symbol_bias (symbols,
   2421   1.6  christos 					       & coff_data (abfd)->dwarf2_find_line_info);
   2422   1.7  christos 
   2423   1.6  christos 	  if (sec_data)
   2424   1.6  christos 	    {
   2425   1.8  christos 	      sec_data->saved_bias = true;
   2426   1.6  christos 	      sec_data->bias = bias;
   2427   1.6  christos 	    }
   2428   1.6  christos 	}
   2429   1.3  christos 
   2430   1.3  christos       if (bias
   2431   1.3  christos 	  && _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section,
   2432   1.3  christos 					    offset + bias,
   2433   1.3  christos 					    filename_ptr, functionname_ptr,
   2434   1.7  christos 					    line_ptr, NULL, debug_sections,
   2435   1.3  christos 					    &coff_data(abfd)->dwarf2_find_line_info))
   2436   1.8  christos 	return true;
   2437   1.3  christos     }
   2438   1.3  christos 
   2439   1.1  christos   *filename_ptr = 0;
   2440   1.1  christos   *functionname_ptr = 0;
   2441   1.1  christos   *line_ptr = 0;
   2442   1.1  christos 
   2443   1.1  christos   /* Don't try and find line numbers in a non coff file.  */
   2444   1.1  christos   if (!bfd_family_coff (abfd))
   2445   1.8  christos     return false;
   2446   1.1  christos 
   2447   1.1  christos   if (cof == NULL)
   2448   1.8  christos     return false;
   2449   1.1  christos 
   2450   1.1  christos   /* Find the first C_FILE symbol.  */
   2451   1.1  christos   p = cof->raw_syments;
   2452   1.1  christos   if (!p)
   2453   1.8  christos     return false;
   2454   1.1  christos 
   2455   1.1  christos   pend = p + cof->raw_syment_count;
   2456   1.1  christos   while (p < pend)
   2457   1.1  christos     {
   2458   1.3  christos       BFD_ASSERT (p->is_sym);
   2459   1.1  christos       if (p->u.syment.n_sclass == C_FILE)
   2460   1.1  christos 	break;
   2461   1.1  christos       p += 1 + p->u.syment.n_numaux;
   2462   1.1  christos     }
   2463   1.1  christos 
   2464   1.1  christos   if (p < pend)
   2465   1.1  christos     {
   2466   1.1  christos       bfd_vma sec_vma;
   2467   1.1  christos       bfd_vma maxdiff;
   2468   1.1  christos 
   2469   1.1  christos       /* Look through the C_FILE symbols to find the best one.  */
   2470   1.7  christos       sec_vma = bfd_section_vma (section);
   2471   1.1  christos       *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
   2472   1.1  christos       maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
   2473   1.1  christos       while (1)
   2474   1.1  christos 	{
   2475   1.1  christos 	  bfd_vma file_addr;
   2476   1.1  christos 	  combined_entry_type *p2;
   2477   1.1  christos 
   2478   1.1  christos 	  for (p2 = p + 1 + p->u.syment.n_numaux;
   2479   1.1  christos 	       p2 < pend;
   2480   1.1  christos 	       p2 += 1 + p2->u.syment.n_numaux)
   2481   1.1  christos 	    {
   2482   1.3  christos 	      BFD_ASSERT (p2->is_sym);
   2483   1.1  christos 	      if (p2->u.syment.n_scnum > 0
   2484   1.1  christos 		  && (section
   2485   1.1  christos 		      == coff_section_from_bfd_index (abfd,
   2486   1.1  christos 						      p2->u.syment.n_scnum)))
   2487   1.1  christos 		break;
   2488   1.1  christos 	      if (p2->u.syment.n_sclass == C_FILE)
   2489   1.1  christos 		{
   2490   1.1  christos 		  p2 = pend;
   2491   1.1  christos 		  break;
   2492   1.1  christos 		}
   2493   1.1  christos 	    }
   2494   1.3  christos 	  if (p2 >= pend)
   2495   1.3  christos 	    break;
   2496   1.1  christos 
   2497   1.1  christos 	  file_addr = (bfd_vma) p2->u.syment.n_value;
   2498   1.1  christos 	  /* PR 11512: Include the section address of the function name symbol.  */
   2499   1.1  christos 	  if (p2->u.syment.n_scnum > 0)
   2500   1.1  christos 	    file_addr += coff_section_from_bfd_index (abfd,
   2501   1.1  christos 						      p2->u.syment.n_scnum)->vma;
   2502   1.1  christos 	  /* We use <= MAXDIFF here so that if we get a zero length
   2503   1.6  christos 	     file, we actually use the next file entry.  */
   2504   1.1  christos 	  if (p2 < pend
   2505   1.1  christos 	      && offset + sec_vma >= file_addr
   2506   1.1  christos 	      && offset + sec_vma - file_addr <= maxdiff)
   2507   1.1  christos 	    {
   2508   1.1  christos 	      *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
   2509   1.1  christos 	      maxdiff = offset + sec_vma - p2->u.syment.n_value;
   2510   1.1  christos 	    }
   2511   1.1  christos 
   2512   1.7  christos 	  if (p->u.syment.n_value >= cof->raw_syment_count)
   2513   1.7  christos 	    break;
   2514   1.7  christos 
   2515   1.1  christos 	  /* Avoid endless loops on erroneous files by ensuring that
   2516   1.1  christos 	     we always move forward in the file.  */
   2517   1.1  christos 	  if (p >= cof->raw_syments + p->u.syment.n_value)
   2518   1.1  christos 	    break;
   2519   1.1  christos 
   2520   1.1  christos 	  p = cof->raw_syments + p->u.syment.n_value;
   2521   1.7  christos 	  if (!p->is_sym || p->u.syment.n_sclass != C_FILE)
   2522   1.1  christos 	    break;
   2523   1.1  christos 	}
   2524   1.1  christos     }
   2525   1.1  christos 
   2526   1.6  christos   if (section->lineno_count == 0)
   2527   1.6  christos     {
   2528   1.6  christos       *functionname_ptr = NULL;
   2529   1.6  christos       *line_ptr = 0;
   2530   1.8  christos       return true;
   2531   1.6  christos     }
   2532   1.6  christos 
   2533   1.6  christos   /* Now wander though the raw linenumbers of the section.
   2534   1.6  christos      If we have been called on this section before, and the offset
   2535   1.6  christos      we want is further down then we can prime the lookup loop.  */
   2536   1.1  christos   if (sec_data != NULL
   2537   1.1  christos       && sec_data->i > 0
   2538   1.1  christos       && offset >= sec_data->offset)
   2539   1.1  christos     {
   2540   1.1  christos       i = sec_data->i;
   2541   1.1  christos       *functionname_ptr = sec_data->function;
   2542   1.1  christos       line_base = sec_data->line_base;
   2543   1.1  christos     }
   2544   1.1  christos   else
   2545   1.1  christos     {
   2546   1.1  christos       i = 0;
   2547   1.1  christos       line_base = 0;
   2548   1.1  christos     }
   2549   1.1  christos 
   2550   1.1  christos   if (section->lineno != NULL)
   2551   1.1  christos     {
   2552   1.1  christos       bfd_vma last_value = 0;
   2553   1.1  christos 
   2554   1.1  christos       l = &section->lineno[i];
   2555   1.1  christos 
   2556   1.1  christos       for (; i < section->lineno_count; i++)
   2557   1.1  christos 	{
   2558   1.1  christos 	  if (l->line_number == 0)
   2559   1.1  christos 	    {
   2560   1.1  christos 	      /* Get the symbol this line number points at.  */
   2561   1.1  christos 	      coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
   2562   1.1  christos 	      if (coff->symbol.value > offset)
   2563   1.1  christos 		break;
   2564   1.6  christos 
   2565   1.1  christos 	      *functionname_ptr = coff->symbol.name;
   2566   1.1  christos 	      last_value = coff->symbol.value;
   2567   1.1  christos 	      if (coff->native)
   2568   1.1  christos 		{
   2569   1.1  christos 		  combined_entry_type *s = coff->native;
   2570   1.3  christos 
   2571   1.3  christos 		  BFD_ASSERT (s->is_sym);
   2572   1.1  christos 		  s = s + 1 + s->u.syment.n_numaux;
   2573   1.1  christos 
   2574   1.1  christos 		  /* In XCOFF a debugging symbol can follow the
   2575   1.1  christos 		     function symbol.  */
   2576   1.8  christos 		  if (((size_t) ((char *) s - (char *) obj_raw_syments (abfd))
   2577   1.8  christos 		       < obj_raw_syment_count (abfd) * sizeof (*s))
   2578   1.8  christos 		      && s->u.syment.n_scnum == N_DEBUG)
   2579   1.1  christos 		    s = s + 1 + s->u.syment.n_numaux;
   2580   1.1  christos 
   2581   1.1  christos 		  /* S should now point to the .bf of the function.  */
   2582   1.8  christos 		  if (((size_t) ((char *) s - (char *) obj_raw_syments (abfd))
   2583   1.8  christos 		       < obj_raw_syment_count (abfd) * sizeof (*s))
   2584   1.8  christos 		      && s->u.syment.n_numaux)
   2585   1.1  christos 		    {
   2586   1.1  christos 		      /* The linenumber is stored in the auxent.  */
   2587   1.1  christos 		      union internal_auxent *a = &((s + 1)->u.auxent);
   2588   1.3  christos 
   2589   1.1  christos 		      line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
   2590   1.1  christos 		      *line_ptr = line_base;
   2591   1.1  christos 		    }
   2592   1.1  christos 		}
   2593   1.1  christos 	    }
   2594   1.1  christos 	  else
   2595   1.1  christos 	    {
   2596   1.1  christos 	      if (l->u.offset > offset)
   2597   1.1  christos 		break;
   2598   1.1  christos 	      *line_ptr = l->line_number + line_base - 1;
   2599   1.1  christos 	    }
   2600   1.1  christos 	  l++;
   2601   1.1  christos 	}
   2602   1.1  christos 
   2603   1.1  christos       /* If we fell off the end of the loop, then assume that this
   2604   1.1  christos 	 symbol has no line number info.  Otherwise, symbols with no
   2605   1.1  christos 	 line number info get reported with the line number of the
   2606   1.1  christos 	 last line of the last symbol which does have line number
   2607   1.1  christos 	 info.  We use 0x100 as a slop to account for cases where the
   2608   1.1  christos 	 last line has executable code.  */
   2609   1.1  christos       if (i >= section->lineno_count
   2610   1.1  christos 	  && last_value != 0
   2611   1.1  christos 	  && offset - last_value > 0x100)
   2612   1.1  christos 	{
   2613   1.1  christos 	  *functionname_ptr = NULL;
   2614   1.1  christos 	  *line_ptr = 0;
   2615   1.1  christos 	}
   2616   1.1  christos     }
   2617   1.1  christos 
   2618   1.1  christos   /* Cache the results for the next call.  */
   2619   1.1  christos   if (sec_data == NULL && section->owner == abfd)
   2620   1.1  christos     {
   2621   1.1  christos       amt = sizeof (struct coff_section_tdata);
   2622   1.1  christos       section->used_by_bfd = bfd_zalloc (abfd, amt);
   2623   1.1  christos       sec_data = (struct coff_section_tdata *) section->used_by_bfd;
   2624   1.1  christos     }
   2625   1.6  christos 
   2626   1.1  christos   if (sec_data != NULL)
   2627   1.1  christos     {
   2628   1.1  christos       sec_data->offset = offset;
   2629   1.1  christos       sec_data->i = i - 1;
   2630   1.1  christos       sec_data->function = *functionname_ptr;
   2631   1.1  christos       sec_data->line_base = line_base;
   2632   1.1  christos     }
   2633   1.1  christos 
   2634   1.8  christos   return true;
   2635   1.1  christos }
   2636   1.1  christos 
   2637   1.8  christos bool
   2638   1.1  christos coff_find_nearest_line (bfd *abfd,
   2639   1.3  christos 			asymbol **symbols,
   2640   1.1  christos 			asection *section,
   2641   1.1  christos 			bfd_vma offset,
   2642   1.1  christos 			const char **filename_ptr,
   2643   1.1  christos 			const char **functionname_ptr,
   2644   1.3  christos 			unsigned int *line_ptr,
   2645   1.3  christos 			unsigned int *discriminator_ptr)
   2646   1.1  christos {
   2647   1.3  christos   if (discriminator_ptr)
   2648   1.3  christos     *discriminator_ptr = 0;
   2649   1.3  christos   return coff_find_nearest_line_with_names (abfd, symbols, section, offset,
   2650   1.6  christos 					    filename_ptr, functionname_ptr,
   2651   1.6  christos 					    line_ptr, dwarf_debug_sections);
   2652   1.1  christos }
   2653   1.1  christos 
   2654   1.8  christos bool
   2655   1.1  christos coff_find_inliner_info (bfd *abfd,
   2656   1.1  christos 			const char **filename_ptr,
   2657   1.1  christos 			const char **functionname_ptr,
   2658   1.1  christos 			unsigned int *line_ptr)
   2659   1.1  christos {
   2660   1.8  christos   bool found;
   2661   1.1  christos 
   2662   1.1  christos   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
   2663   1.1  christos 					 functionname_ptr, line_ptr,
   2664   1.1  christos 					 &coff_data(abfd)->dwarf2_find_line_info);
   2665   1.1  christos   return (found);
   2666   1.1  christos }
   2667   1.1  christos 
   2668   1.1  christos int
   2669   1.1  christos coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
   2670   1.1  christos {
   2671   1.1  christos   size_t size;
   2672   1.1  christos 
   2673   1.3  christos   if (!bfd_link_relocatable (info))
   2674   1.1  christos     size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
   2675   1.1  christos   else
   2676   1.1  christos     size = bfd_coff_filhsz (abfd);
   2677   1.1  christos 
   2678   1.1  christos   size += abfd->section_count * bfd_coff_scnhsz (abfd);
   2679   1.1  christos   return size;
   2680   1.1  christos }
   2681   1.1  christos 
   2682   1.1  christos /* Change the class of a coff symbol held by BFD.  */
   2683   1.1  christos 
   2684   1.8  christos bool
   2685   1.6  christos bfd_coff_set_symbol_class (bfd *	 abfd,
   2686   1.6  christos 			   asymbol *	 symbol,
   2687   1.6  christos 			   unsigned int	 symbol_class)
   2688   1.1  christos {
   2689   1.1  christos   coff_symbol_type * csym;
   2690   1.1  christos 
   2691   1.3  christos   csym = coff_symbol_from (symbol);
   2692   1.1  christos   if (csym == NULL)
   2693   1.1  christos     {
   2694   1.1  christos       bfd_set_error (bfd_error_invalid_operation);
   2695   1.8  christos       return false;
   2696   1.1  christos     }
   2697   1.1  christos   else if (csym->native == NULL)
   2698   1.1  christos     {
   2699   1.1  christos       /* This is an alien symbol which no native coff backend data.
   2700   1.1  christos 	 We cheat here by creating a fake native entry for it and
   2701   1.1  christos 	 then filling in the class.  This code is based on that in
   2702   1.1  christos 	 coff_write_alien_symbol().  */
   2703   1.1  christos 
   2704   1.1  christos       combined_entry_type * native;
   2705   1.8  christos       size_t amt = sizeof (* native);
   2706   1.1  christos 
   2707   1.1  christos       native = (combined_entry_type *) bfd_zalloc (abfd, amt);
   2708   1.1  christos       if (native == NULL)
   2709   1.8  christos 	return false;
   2710   1.1  christos 
   2711   1.8  christos       native->is_sym = true;
   2712   1.1  christos       native->u.syment.n_type   = T_NULL;
   2713   1.1  christos       native->u.syment.n_sclass = symbol_class;
   2714   1.1  christos 
   2715   1.1  christos       if (bfd_is_und_section (symbol->section))
   2716   1.1  christos 	{
   2717   1.1  christos 	  native->u.syment.n_scnum = N_UNDEF;
   2718   1.1  christos 	  native->u.syment.n_value = symbol->value;
   2719   1.1  christos 	}
   2720   1.1  christos       else if (bfd_is_com_section (symbol->section))
   2721   1.1  christos 	{
   2722   1.1  christos 	  native->u.syment.n_scnum = N_UNDEF;
   2723   1.1  christos 	  native->u.syment.n_value = symbol->value;
   2724   1.1  christos 	}
   2725   1.1  christos       else
   2726   1.1  christos 	{
   2727   1.1  christos 	  native->u.syment.n_scnum =
   2728   1.1  christos 	    symbol->section->output_section->target_index;
   2729   1.1  christos 	  native->u.syment.n_value = (symbol->value
   2730   1.1  christos 				      + symbol->section->output_offset);
   2731   1.1  christos 	  if (! obj_pe (abfd))
   2732   1.1  christos 	    native->u.syment.n_value += symbol->section->output_section->vma;
   2733   1.1  christos 
   2734   1.1  christos 	  /* Copy the any flags from the file header into the symbol.
   2735   1.1  christos 	     FIXME: Why?  */
   2736   1.1  christos 	  native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
   2737   1.1  christos 	}
   2738   1.1  christos 
   2739   1.1  christos       csym->native = native;
   2740   1.1  christos     }
   2741   1.1  christos   else
   2742   1.1  christos     csym->native->u.syment.n_sclass = symbol_class;
   2743   1.1  christos 
   2744   1.8  christos   return true;
   2745   1.1  christos }
   2746   1.1  christos 
   2747   1.8  christos bool
   2748   1.1  christos _bfd_coff_section_already_linked (bfd *abfd,
   2749   1.1  christos 				  asection *sec,
   2750   1.1  christos 				  struct bfd_link_info *info)
   2751   1.1  christos {
   2752   1.1  christos   flagword flags;
   2753   1.1  christos   const char *name, *key;
   2754   1.1  christos   struct bfd_section_already_linked *l;
   2755   1.1  christos   struct bfd_section_already_linked_hash_entry *already_linked_list;
   2756   1.1  christos   struct coff_comdat_info *s_comdat;
   2757   1.1  christos 
   2758   1.7  christos   if (sec->output_section == bfd_abs_section_ptr)
   2759   1.8  christos     return false;
   2760   1.7  christos 
   2761   1.1  christos   flags = sec->flags;
   2762   1.1  christos   if ((flags & SEC_LINK_ONCE) == 0)
   2763   1.8  christos     return false;
   2764   1.1  christos 
   2765   1.1  christos   /* The COFF backend linker doesn't support group sections.  */
   2766   1.1  christos   if ((flags & SEC_GROUP) != 0)
   2767   1.8  christos     return false;
   2768   1.1  christos 
   2769   1.7  christos   name = bfd_section_name (sec);
   2770   1.1  christos   s_comdat = bfd_coff_get_comdat_section (abfd, sec);
   2771   1.1  christos 
   2772   1.1  christos   if (s_comdat != NULL)
   2773   1.1  christos     key = s_comdat->name;
   2774   1.1  christos   else
   2775   1.1  christos     {
   2776   1.8  christos       if (startswith (name, ".gnu.linkonce.")
   2777   1.1  christos 	  && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL)
   2778   1.1  christos 	key++;
   2779   1.1  christos       else
   2780   1.1  christos 	/* FIXME: gcc as of 2011-09 emits sections like .text$<key>,
   2781   1.1  christos 	   .xdata$<key> and .pdata$<key> only the first of which has a
   2782   1.1  christos 	   comdat key.  Should these all match the LTO IR key?  */
   2783   1.1  christos 	key = name;
   2784   1.1  christos     }
   2785   1.1  christos 
   2786   1.1  christos   already_linked_list = bfd_section_already_linked_table_lookup (key);
   2787  1.10  christos   if (!already_linked_list)
   2788  1.10  christos     goto bad;
   2789   1.1  christos 
   2790   1.1  christos   for (l = already_linked_list->entry; l != NULL; l = l->next)
   2791   1.1  christos     {
   2792   1.1  christos       struct coff_comdat_info *l_comdat;
   2793   1.1  christos 
   2794   1.1  christos       l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec);
   2795   1.1  christos 
   2796   1.1  christos       /* The section names must match, and both sections must be
   2797   1.1  christos 	 comdat and have the same comdat name, or both sections must
   2798   1.1  christos 	 be non-comdat.  LTO IR plugin sections are an exception.  They
   2799   1.1  christos 	 are always named .gnu.linkonce.t.<key> (<key> is some string)
   2800   1.1  christos 	 and match any comdat section with comdat name of <key>, and
   2801   1.1  christos 	 any linkonce section with the same suffix, ie.
   2802   1.1  christos 	 .gnu.linkonce.*.<key>.  */
   2803   1.1  christos       if (((s_comdat != NULL) == (l_comdat != NULL)
   2804   1.1  christos 	   && strcmp (name, l->sec->name) == 0)
   2805   1.8  christos 	  || (l->sec->owner->flags & BFD_PLUGIN) != 0
   2806   1.8  christos 	  || (sec->owner->flags & BFD_PLUGIN) != 0)
   2807   1.1  christos 	{
   2808   1.1  christos 	  /* The section has already been linked.  See if we should
   2809   1.1  christos 	     issue a warning.  */
   2810   1.1  christos 	  return _bfd_handle_already_linked (sec, l, info);
   2811   1.1  christos 	}
   2812   1.1  christos     }
   2813   1.1  christos 
   2814   1.1  christos   /* This is the first section with this name.  Record it.  */
   2815   1.1  christos   if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
   2816  1.10  christos     {
   2817  1.10  christos     bad:
   2818  1.10  christos       info->callbacks->fatal (_("%P: already_linked_table: %E\n"));
   2819  1.10  christos     }
   2820   1.8  christos   return false;
   2821   1.1  christos }
   2822   1.3  christos 
   2823   1.3  christos /* Initialize COOKIE for input bfd ABFD. */
   2824   1.3  christos 
   2825   1.8  christos static bool
   2826   1.3  christos init_reloc_cookie (struct coff_reloc_cookie *cookie,
   2827   1.3  christos 		   struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2828   1.3  christos 		   bfd *abfd)
   2829   1.3  christos {
   2830   1.3  christos   /* Sometimes the symbol table does not yet have been loaded here.  */
   2831   1.3  christos   bfd_coff_slurp_symbol_table (abfd);
   2832   1.3  christos 
   2833   1.3  christos   cookie->abfd = abfd;
   2834   1.3  christos   cookie->sym_hashes = obj_coff_sym_hashes (abfd);
   2835   1.3  christos 
   2836   1.3  christos   cookie->symbols = obj_symbols (abfd);
   2837   1.3  christos 
   2838   1.8  christos   return true;
   2839   1.3  christos }
   2840   1.3  christos 
   2841   1.3  christos /* Free the memory allocated by init_reloc_cookie, if appropriate.  */
   2842   1.3  christos 
   2843   1.3  christos static void
   2844   1.3  christos fini_reloc_cookie (struct coff_reloc_cookie *cookie ATTRIBUTE_UNUSED,
   2845   1.3  christos 		   bfd *abfd ATTRIBUTE_UNUSED)
   2846   1.3  christos {
   2847   1.3  christos   /* Nothing to do.  */
   2848   1.3  christos }
   2849   1.3  christos 
   2850   1.3  christos /* Initialize the relocation information in COOKIE for input section SEC
   2851   1.3  christos    of input bfd ABFD.  */
   2852   1.3  christos 
   2853   1.8  christos static bool
   2854   1.3  christos init_reloc_cookie_rels (struct coff_reloc_cookie *cookie,
   2855   1.3  christos 			struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2856   1.3  christos 			bfd *abfd,
   2857   1.3  christos 			asection *sec)
   2858   1.3  christos {
   2859   1.3  christos   if (sec->reloc_count == 0)
   2860   1.3  christos     {
   2861   1.3  christos       cookie->rels = NULL;
   2862   1.3  christos       cookie->relend = NULL;
   2863   1.3  christos       cookie->rel = NULL;
   2864   1.8  christos       return true;
   2865   1.3  christos     }
   2866   1.3  christos 
   2867   1.8  christos   cookie->rels = _bfd_coff_read_internal_relocs (abfd, sec, false, NULL,
   2868   1.8  christos 						 0, NULL);
   2869   1.3  christos 
   2870   1.3  christos   if (cookie->rels == NULL)
   2871   1.8  christos     return false;
   2872   1.3  christos 
   2873   1.3  christos   cookie->rel = cookie->rels;
   2874   1.3  christos   cookie->relend = (cookie->rels + sec->reloc_count);
   2875   1.8  christos   return true;
   2876   1.3  christos }
   2877   1.3  christos 
   2878   1.3  christos /* Free the memory allocated by init_reloc_cookie_rels,
   2879   1.3  christos    if appropriate.  */
   2880   1.3  christos 
   2881   1.3  christos static void
   2882   1.3  christos fini_reloc_cookie_rels (struct coff_reloc_cookie *cookie,
   2883   1.3  christos 			asection *sec)
   2884   1.3  christos {
   2885   1.5  christos   if (cookie->rels
   2886   1.5  christos       /* PR 20401.  The relocs may not have been cached, so check first.
   2887   1.5  christos 	 If the relocs were loaded by init_reloc_cookie_rels() then this
   2888   1.5  christos 	 will be the case.  FIXME: Would performance be improved if the
   2889   1.5  christos 	 relocs *were* cached ?  */
   2890   1.5  christos       && coff_section_data (NULL, sec)
   2891   1.5  christos       && coff_section_data (NULL, sec)->relocs != cookie->rels)
   2892   1.3  christos     free (cookie->rels);
   2893   1.3  christos }
   2894   1.3  christos 
   2895   1.3  christos /* Initialize the whole of COOKIE for input section SEC.  */
   2896   1.3  christos 
   2897   1.8  christos static bool
   2898   1.3  christos init_reloc_cookie_for_section (struct coff_reloc_cookie *cookie,
   2899   1.3  christos 			       struct bfd_link_info *info,
   2900   1.3  christos 			       asection *sec)
   2901   1.3  christos {
   2902   1.3  christos   if (!init_reloc_cookie (cookie, info, sec->owner))
   2903   1.8  christos     return false;
   2904   1.3  christos 
   2905   1.3  christos   if (!init_reloc_cookie_rels (cookie, info, sec->owner, sec))
   2906   1.3  christos     {
   2907   1.3  christos       fini_reloc_cookie (cookie, sec->owner);
   2908   1.8  christos       return false;
   2909   1.3  christos     }
   2910   1.8  christos   return true;
   2911   1.3  christos }
   2912   1.3  christos 
   2913   1.3  christos /* Free the memory allocated by init_reloc_cookie_for_section,
   2914   1.3  christos    if appropriate.  */
   2915   1.3  christos 
   2916   1.3  christos static void
   2917   1.3  christos fini_reloc_cookie_for_section (struct coff_reloc_cookie *cookie,
   2918   1.3  christos 			       asection *sec)
   2919   1.3  christos {
   2920   1.3  christos   fini_reloc_cookie_rels (cookie, sec);
   2921   1.3  christos   fini_reloc_cookie (cookie, sec->owner);
   2922   1.3  christos }
   2923   1.3  christos 
   2924   1.3  christos static asection *
   2925   1.3  christos _bfd_coff_gc_mark_hook (asection *sec,
   2926   1.3  christos 			struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2927   1.3  christos 			struct internal_reloc *rel ATTRIBUTE_UNUSED,
   2928   1.3  christos 			struct coff_link_hash_entry *h,
   2929   1.3  christos 			struct internal_syment *sym)
   2930   1.3  christos {
   2931   1.3  christos   if (h != NULL)
   2932   1.3  christos     {
   2933   1.3  christos       switch (h->root.type)
   2934   1.6  christos 	{
   2935   1.6  christos 	case bfd_link_hash_defined:
   2936   1.6  christos 	case bfd_link_hash_defweak:
   2937   1.6  christos 	  return h->root.u.def.section;
   2938   1.6  christos 
   2939   1.6  christos 	case bfd_link_hash_common:
   2940   1.6  christos 	  return h->root.u.c.p->section;
   2941   1.6  christos 
   2942   1.6  christos 	case bfd_link_hash_undefweak:
   2943   1.6  christos 	  if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
   2944   1.6  christos 	    {
   2945   1.6  christos 	      /* PE weak externals.  A weak symbol may include an auxiliary
   2946   1.6  christos 		 record indicating that if the weak symbol is not resolved,
   2947   1.6  christos 		 another external symbol is used instead.  */
   2948   1.6  christos 	      struct coff_link_hash_entry *h2 =
   2949   1.9  christos 		h->auxbfd->tdata.coff_obj_data->sym_hashes
   2950   1.9  christos 		[h->aux->x_sym.x_tagndx.u32];
   2951   1.3  christos 
   2952   1.6  christos 	      if (h2 && h2->root.type != bfd_link_hash_undefined)
   2953   1.6  christos 		return  h2->root.u.def.section;
   2954   1.6  christos 	    }
   2955   1.6  christos 	  break;
   2956   1.3  christos 
   2957   1.3  christos 	case bfd_link_hash_undefined:
   2958   1.6  christos 	default:
   2959   1.6  christos 	  break;
   2960   1.6  christos 	}
   2961   1.3  christos       return NULL;
   2962   1.3  christos     }
   2963   1.3  christos 
   2964   1.3  christos   return coff_section_from_bfd_index (sec->owner, sym->n_scnum);
   2965   1.3  christos }
   2966   1.3  christos 
   2967   1.3  christos /* COOKIE->rel describes a relocation against section SEC, which is
   2968   1.3  christos    a section we've decided to keep.  Return the section that contains
   2969   1.3  christos    the relocation symbol, or NULL if no section contains it.  */
   2970   1.3  christos 
   2971   1.3  christos static asection *
   2972   1.3  christos _bfd_coff_gc_mark_rsec (struct bfd_link_info *info, asection *sec,
   2973   1.3  christos 			coff_gc_mark_hook_fn gc_mark_hook,
   2974   1.3  christos 			struct coff_reloc_cookie *cookie)
   2975   1.3  christos {
   2976   1.3  christos   struct coff_link_hash_entry *h;
   2977   1.3  christos 
   2978   1.3  christos   h = cookie->sym_hashes[cookie->rel->r_symndx];
   2979   1.3  christos   if (h != NULL)
   2980   1.3  christos     {
   2981   1.3  christos       while (h->root.type == bfd_link_hash_indirect
   2982   1.3  christos 	     || h->root.type == bfd_link_hash_warning)
   2983   1.3  christos 	h = (struct coff_link_hash_entry *) h->root.u.i.link;
   2984   1.3  christos 
   2985   1.3  christos       return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
   2986   1.3  christos     }
   2987   1.3  christos 
   2988   1.3  christos   return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
   2989   1.3  christos 			  &(cookie->symbols
   2990   1.3  christos 			    + obj_convert (sec->owner)[cookie->rel->r_symndx])->native->u.syment);
   2991   1.3  christos }
   2992   1.3  christos 
   2993   1.8  christos static bool _bfd_coff_gc_mark
   2994   1.3  christos   (struct bfd_link_info *, asection *, coff_gc_mark_hook_fn);
   2995   1.3  christos 
   2996   1.3  christos /* COOKIE->rel describes a relocation against section SEC, which is
   2997   1.3  christos    a section we've decided to keep.  Mark the section that contains
   2998   1.3  christos    the relocation symbol.  */
   2999   1.3  christos 
   3000   1.8  christos static bool
   3001   1.3  christos _bfd_coff_gc_mark_reloc (struct bfd_link_info *info,
   3002   1.3  christos 			 asection *sec,
   3003   1.3  christos 			 coff_gc_mark_hook_fn gc_mark_hook,
   3004   1.3  christos 			 struct coff_reloc_cookie *cookie)
   3005   1.3  christos {
   3006   1.3  christos   asection *rsec;
   3007   1.3  christos 
   3008   1.3  christos   rsec = _bfd_coff_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
   3009   1.3  christos   if (rsec && !rsec->gc_mark)
   3010   1.3  christos     {
   3011   1.3  christos       if (bfd_get_flavour (rsec->owner) != bfd_target_coff_flavour)
   3012   1.3  christos 	rsec->gc_mark = 1;
   3013   1.3  christos       else if (!_bfd_coff_gc_mark (info, rsec, gc_mark_hook))
   3014   1.8  christos 	return false;
   3015   1.3  christos     }
   3016   1.8  christos   return true;
   3017   1.3  christos }
   3018   1.3  christos 
   3019   1.3  christos /* The mark phase of garbage collection.  For a given section, mark
   3020   1.3  christos    it and any sections in this section's group, and all the sections
   3021   1.3  christos    which define symbols to which it refers.  */
   3022   1.3  christos 
   3023   1.8  christos static bool
   3024   1.3  christos _bfd_coff_gc_mark (struct bfd_link_info *info,
   3025   1.3  christos 		   asection *sec,
   3026   1.3  christos 		   coff_gc_mark_hook_fn gc_mark_hook)
   3027   1.3  christos {
   3028   1.8  christos   bool ret = true;
   3029   1.3  christos 
   3030   1.3  christos   sec->gc_mark = 1;
   3031   1.3  christos 
   3032   1.3  christos   /* Look through the section relocs.  */
   3033   1.3  christos   if ((sec->flags & SEC_RELOC) != 0
   3034   1.3  christos       && sec->reloc_count > 0)
   3035   1.3  christos     {
   3036   1.3  christos       struct coff_reloc_cookie cookie;
   3037   1.3  christos 
   3038   1.3  christos       if (!init_reloc_cookie_for_section (&cookie, info, sec))
   3039   1.8  christos 	ret = false;
   3040   1.3  christos       else
   3041   1.6  christos 	{
   3042   1.6  christos 	  for (; cookie.rel < cookie.relend; cookie.rel++)
   3043   1.6  christos 	    {
   3044   1.3  christos 	      if (!_bfd_coff_gc_mark_reloc (info, sec, gc_mark_hook, &cookie))
   3045   1.3  christos 		{
   3046   1.8  christos 		  ret = false;
   3047   1.3  christos 		  break;
   3048   1.3  christos 		}
   3049   1.3  christos 	    }
   3050   1.6  christos 	  fini_reloc_cookie_for_section (&cookie, sec);
   3051   1.6  christos 	}
   3052   1.3  christos     }
   3053   1.3  christos 
   3054   1.3  christos   return ret;
   3055   1.3  christos }
   3056   1.3  christos 
   3057   1.8  christos static bool
   3058   1.3  christos _bfd_coff_gc_mark_extra_sections (struct bfd_link_info *info,
   3059   1.3  christos 				  coff_gc_mark_hook_fn mark_hook ATTRIBUTE_UNUSED)
   3060   1.3  christos {
   3061   1.3  christos   bfd *ibfd;
   3062   1.3  christos 
   3063   1.3  christos   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   3064   1.3  christos     {
   3065   1.3  christos       asection *isec;
   3066   1.8  christos       bool some_kept;
   3067   1.3  christos 
   3068   1.6  christos       if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour)
   3069   1.3  christos 	continue;
   3070   1.3  christos 
   3071   1.3  christos       /* Ensure all linker created sections are kept, and see whether
   3072   1.3  christos 	 any other section is already marked.  */
   3073   1.8  christos       some_kept = false;
   3074   1.3  christos       for (isec = ibfd->sections; isec != NULL; isec = isec->next)
   3075   1.3  christos 	{
   3076   1.3  christos 	  if ((isec->flags & SEC_LINKER_CREATED) != 0)
   3077   1.3  christos 	    isec->gc_mark = 1;
   3078   1.3  christos 	  else if (isec->gc_mark)
   3079   1.8  christos 	    some_kept = true;
   3080   1.3  christos 	}
   3081   1.3  christos 
   3082   1.3  christos       /* If no section in this file will be kept, then we can
   3083   1.3  christos 	 toss out debug sections.  */
   3084   1.3  christos       if (!some_kept)
   3085   1.3  christos 	continue;
   3086   1.3  christos 
   3087   1.3  christos       /* Keep debug and special sections like .comment when they are
   3088   1.3  christos 	 not part of a group, or when we have single-member groups.  */
   3089   1.3  christos       for (isec = ibfd->sections; isec != NULL; isec = isec->next)
   3090   1.3  christos 	if ((isec->flags & SEC_DEBUGGING) != 0
   3091   1.3  christos 	    || (isec->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
   3092   1.3  christos 	  isec->gc_mark = 1;
   3093   1.3  christos     }
   3094   1.8  christos   return true;
   3095   1.3  christos }
   3096   1.3  christos 
   3097   1.3  christos /* Sweep symbols in swept sections.  Called via coff_link_hash_traverse.  */
   3098   1.3  christos 
   3099   1.8  christos static bool
   3100   1.3  christos coff_gc_sweep_symbol (struct coff_link_hash_entry *h,
   3101   1.3  christos 		      void *data ATTRIBUTE_UNUSED)
   3102   1.3  christos {
   3103   1.3  christos   if (h->root.type == bfd_link_hash_warning)
   3104   1.3  christos     h = (struct coff_link_hash_entry *) h->root.u.i.link;
   3105   1.3  christos 
   3106   1.3  christos   if ((h->root.type == bfd_link_hash_defined
   3107   1.3  christos        || h->root.type == bfd_link_hash_defweak)
   3108   1.3  christos       && !h->root.u.def.section->gc_mark
   3109   1.3  christos       && !(h->root.u.def.section->owner->flags & DYNAMIC))
   3110   1.3  christos     {
   3111   1.3  christos       /* Do our best to hide the symbol.  */
   3112   1.3  christos       h->root.u.def.section = bfd_und_section_ptr;
   3113   1.3  christos       h->symbol_class = C_HIDDEN;
   3114   1.3  christos     }
   3115   1.3  christos 
   3116   1.8  christos   return true;
   3117   1.3  christos }
   3118   1.3  christos 
   3119   1.3  christos /* The sweep phase of garbage collection.  Remove all garbage sections.  */
   3120   1.3  christos 
   3121   1.8  christos typedef bool (*gc_sweep_hook_fn)
   3122   1.3  christos   (bfd *, struct bfd_link_info *, asection *, const struct internal_reloc *);
   3123   1.3  christos 
   3124  1.10  christos static inline bool
   3125  1.10  christos is_subsection (const char *str, const char *prefix)
   3126  1.10  christos {
   3127  1.10  christos   size_t n = strlen (prefix);
   3128  1.10  christos   if (strncmp (str, prefix, n) != 0)
   3129  1.10  christos     return false;
   3130  1.10  christos   if (str[n] == 0)
   3131  1.10  christos     return true;
   3132  1.10  christos   else if (str[n] != '$')
   3133  1.10  christos     return false;
   3134  1.10  christos   return ISDIGIT (str[n + 1]) && str[n + 2] == 0;
   3135  1.10  christos }
   3136  1.10  christos 
   3137   1.8  christos static bool
   3138   1.3  christos coff_gc_sweep (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
   3139   1.3  christos {
   3140   1.3  christos   bfd *sub;
   3141   1.3  christos 
   3142   1.3  christos   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
   3143   1.3  christos     {
   3144   1.3  christos       asection *o;
   3145   1.3  christos 
   3146   1.3  christos       if (bfd_get_flavour (sub) != bfd_target_coff_flavour)
   3147   1.3  christos 	continue;
   3148   1.3  christos 
   3149   1.3  christos       for (o = sub->sections; o != NULL; o = o->next)
   3150   1.3  christos 	{
   3151   1.3  christos 	    /* Keep debug and special sections.  */
   3152   1.6  christos 	  if ((o->flags & (SEC_DEBUGGING | SEC_LINKER_CREATED)) != 0
   3153   1.3  christos 	      || (o->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
   3154   1.3  christos 	    o->gc_mark = 1;
   3155   1.8  christos 	  else if (startswith (o->name, ".idata")
   3156   1.8  christos 		   || startswith (o->name, ".pdata")
   3157   1.8  christos 		   || startswith (o->name, ".xdata")
   3158  1.10  christos 		   || is_subsection (o->name, ".didat")
   3159   1.8  christos 		   || startswith (o->name, ".rsrc"))
   3160   1.3  christos 	    o->gc_mark = 1;
   3161   1.3  christos 
   3162   1.3  christos 	  if (o->gc_mark)
   3163   1.3  christos 	    continue;
   3164   1.3  christos 
   3165   1.3  christos 	  /* Skip sweeping sections already excluded.  */
   3166   1.3  christos 	  if (o->flags & SEC_EXCLUDE)
   3167   1.3  christos 	    continue;
   3168   1.3  christos 
   3169   1.3  christos 	  /* Since this is early in the link process, it is simple
   3170   1.3  christos 	     to remove a section from the output.  */
   3171   1.3  christos 	  o->flags |= SEC_EXCLUDE;
   3172   1.3  christos 
   3173   1.3  christos 	  if (info->print_gc_sections && o->size != 0)
   3174   1.6  christos 	    /* xgettext: c-format */
   3175   1.6  christos 	    _bfd_error_handler (_("removing unused section '%pA' in file '%pB'"),
   3176   1.6  christos 				o, sub);
   3177   1.3  christos 
   3178   1.3  christos #if 0
   3179   1.3  christos 	  /* But we also have to update some of the relocation
   3180   1.3  christos 	     info we collected before.  */
   3181   1.3  christos 	  if (gc_sweep_hook
   3182   1.3  christos 	      && (o->flags & SEC_RELOC) != 0
   3183   1.3  christos 	      && o->reloc_count > 0
   3184   1.3  christos 	      && !bfd_is_abs_section (o->output_section))
   3185   1.3  christos 	    {
   3186   1.3  christos 	      struct internal_reloc *internal_relocs;
   3187   1.8  christos 	      bool r;
   3188   1.3  christos 
   3189   1.3  christos 	      internal_relocs
   3190   1.3  christos 		= _bfd_coff_link_read_relocs (o->owner, o, NULL, NULL,
   3191   1.3  christos 					     info->keep_memory);
   3192   1.3  christos 	      if (internal_relocs == NULL)
   3193   1.8  christos 		return false;
   3194   1.3  christos 
   3195   1.3  christos 	      r = (*gc_sweep_hook) (o->owner, info, o, internal_relocs);
   3196   1.3  christos 
   3197   1.3  christos 	      if (coff_section_data (o)->relocs != internal_relocs)
   3198   1.3  christos 		free (internal_relocs);
   3199   1.3  christos 
   3200   1.3  christos 	      if (!r)
   3201   1.8  christos 		return false;
   3202   1.3  christos 	    }
   3203   1.3  christos #endif
   3204   1.3  christos 	}
   3205   1.3  christos     }
   3206   1.3  christos 
   3207   1.3  christos   /* Remove the symbols that were in the swept sections from the dynamic
   3208   1.3  christos      symbol table.  */
   3209   1.3  christos   coff_link_hash_traverse (coff_hash_table (info), coff_gc_sweep_symbol,
   3210   1.3  christos 			   NULL);
   3211   1.3  christos 
   3212   1.8  christos   return true;
   3213   1.3  christos }
   3214   1.3  christos 
   3215   1.3  christos /* Keep all sections containing symbols undefined on the command-line,
   3216   1.3  christos    and the section containing the entry symbol.  */
   3217   1.3  christos 
   3218   1.3  christos static void
   3219   1.3  christos _bfd_coff_gc_keep (struct bfd_link_info *info)
   3220   1.3  christos {
   3221   1.3  christos   struct bfd_sym_chain *sym;
   3222   1.3  christos 
   3223   1.3  christos   for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
   3224   1.3  christos     {
   3225   1.3  christos       struct coff_link_hash_entry *h;
   3226   1.3  christos 
   3227   1.3  christos       h = coff_link_hash_lookup (coff_hash_table (info), sym->name,
   3228   1.8  christos 				false, false, false);
   3229   1.3  christos 
   3230   1.3  christos       if (h != NULL
   3231   1.3  christos 	  && (h->root.type == bfd_link_hash_defined
   3232   1.3  christos 	      || h->root.type == bfd_link_hash_defweak)
   3233   1.3  christos 	  && !bfd_is_abs_section (h->root.u.def.section))
   3234   1.3  christos 	h->root.u.def.section->flags |= SEC_KEEP;
   3235   1.3  christos     }
   3236   1.3  christos }
   3237   1.3  christos 
   3238   1.3  christos /* Do mark and sweep of unused sections.  */
   3239   1.3  christos 
   3240   1.8  christos bool
   3241   1.3  christos bfd_coff_gc_sections (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
   3242   1.3  christos {
   3243   1.3  christos   bfd *sub;
   3244   1.3  christos 
   3245   1.3  christos   /* FIXME: Should we implement this? */
   3246   1.3  christos #if 0
   3247   1.3  christos   const bfd_coff_backend_data *bed = coff_backend_info (abfd);
   3248   1.3  christos 
   3249   1.3  christos   if (!bed->can_gc_sections
   3250   1.3  christos       || !is_coff_hash_table (info->hash))
   3251   1.3  christos     {
   3252   1.6  christos       _bfd_error_handler(_("warning: gc-sections option ignored"));
   3253   1.8  christos       return true;
   3254   1.3  christos     }
   3255   1.3  christos #endif
   3256   1.3  christos 
   3257   1.3  christos   _bfd_coff_gc_keep (info);
   3258   1.3  christos 
   3259   1.3  christos   /* Grovel through relocs to find out who stays ...  */
   3260   1.3  christos   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
   3261   1.3  christos     {
   3262   1.3  christos       asection *o;
   3263   1.3  christos 
   3264   1.3  christos       if (bfd_get_flavour (sub) != bfd_target_coff_flavour)
   3265   1.6  christos 	continue;
   3266   1.3  christos 
   3267   1.3  christos       for (o = sub->sections; o != NULL; o = o->next)
   3268   1.6  christos 	{
   3269   1.3  christos 	  if (((o->flags & (SEC_EXCLUDE | SEC_KEEP)) == SEC_KEEP
   3270   1.8  christos 	       || startswith (o->name, ".vectors")
   3271   1.8  christos 	       || startswith (o->name, ".ctors")
   3272   1.8  christos 	       || startswith (o->name, ".dtors"))
   3273   1.3  christos 	      && !o->gc_mark)
   3274   1.3  christos 	    {
   3275   1.3  christos 	      if (!_bfd_coff_gc_mark (info, o, _bfd_coff_gc_mark_hook))
   3276   1.8  christos 		return false;
   3277   1.3  christos 	    }
   3278   1.6  christos 	}
   3279   1.3  christos     }
   3280   1.3  christos 
   3281   1.3  christos   /* Allow the backend to mark additional target specific sections.  */
   3282   1.3  christos   _bfd_coff_gc_mark_extra_sections (info, _bfd_coff_gc_mark_hook);
   3283   1.3  christos 
   3284   1.3  christos   /* ... and mark SEC_EXCLUDE for those that go.  */
   3285   1.3  christos   return coff_gc_sweep (abfd, info);
   3286   1.3  christos }
   3287   1.7  christos 
   3288   1.7  christos /* Return name used to identify a comdat group.  */
   3289   1.7  christos 
   3290   1.7  christos const char *
   3291   1.7  christos bfd_coff_group_name (bfd *abfd, const asection *sec)
   3292   1.7  christos {
   3293   1.7  christos   struct coff_comdat_info *ci = bfd_coff_get_comdat_section (abfd, sec);
   3294   1.7  christos   if (ci != NULL)
   3295   1.7  christos     return ci->name;
   3296   1.7  christos   return NULL;
   3297   1.7  christos }
   3298   1.7  christos 
   3299   1.8  christos bool
   3300   1.9  christos _bfd_coff_free_cached_info (bfd *abfd)
   3301   1.7  christos {
   3302   1.9  christos   struct coff_tdata *tdata;
   3303   1.8  christos 
   3304   1.9  christos   if (bfd_family_coff (abfd)
   3305   1.9  christos       && (bfd_get_format (abfd) == bfd_object
   3306   1.9  christos 	  || bfd_get_format (abfd) == bfd_core)
   3307   1.9  christos       && (tdata = coff_data (abfd)) != NULL)
   3308   1.8  christos     {
   3309   1.9  christos       if (tdata->section_by_index)
   3310   1.9  christos 	{
   3311   1.9  christos 	  htab_delete (tdata->section_by_index);
   3312   1.9  christos 	  tdata->section_by_index = NULL;
   3313   1.9  christos 	}
   3314   1.9  christos 
   3315   1.9  christos       if (tdata->section_by_target_index)
   3316   1.9  christos 	{
   3317   1.9  christos 	  htab_delete (tdata->section_by_target_index);
   3318   1.9  christos 	  tdata->section_by_target_index = NULL;
   3319   1.9  christos 	}
   3320   1.9  christos 
   3321   1.9  christos       if (obj_pe (abfd) && pe_data (abfd)->comdat_hash)
   3322   1.9  christos 	{
   3323   1.9  christos 	  htab_delete (pe_data (abfd)->comdat_hash);
   3324   1.9  christos 	  pe_data (abfd)->comdat_hash = NULL;
   3325   1.9  christos 	}
   3326   1.9  christos 
   3327   1.9  christos       _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
   3328   1.9  christos       _bfd_stab_cleanup (abfd, &tdata->line_info);
   3329   1.9  christos 
   3330   1.8  christos       /* PR 25447:
   3331   1.8  christos 	 Do not clear the keep_syms and keep_strings flags.
   3332   1.8  christos 	 These may have been set by pe_ILF_build_a_bfd() indicating
   3333   1.8  christos 	 that the syms and strings pointers are not to be freed.  */
   3334  1.10  christos       _bfd_coff_free_symbols (abfd);
   3335  1.10  christos 
   3336  1.10  christos       /* Free raw syms, and any other data bfd_alloc'd after raw syms
   3337  1.10  christos 	 are read.  */
   3338  1.10  christos       if (!obj_coff_keep_raw_syms (abfd) && obj_raw_syments (abfd))
   3339  1.10  christos 	{
   3340  1.10  christos 	  bfd_release (abfd, obj_raw_syments (abfd));
   3341  1.10  christos 	  obj_raw_syments (abfd) = NULL;
   3342  1.10  christos 	  obj_symbols (abfd) = NULL;
   3343  1.10  christos 	  obj_convert (abfd) = NULL;
   3344  1.10  christos 	}
   3345   1.9  christos     }
   3346   1.8  christos 
   3347   1.9  christos   return _bfd_generic_bfd_free_cached_info (abfd);
   3348   1.7  christos }
   3349