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