Home | History | Annotate | Line # | Download | only in bfd
elf.c revision 1.1
      1  1.1  christos /* ELF executable support for BFD.
      2  1.1  christos 
      3  1.1  christos    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
      4  1.1  christos    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
      5  1.1  christos    Free Software Foundation, Inc.
      6  1.1  christos 
      7  1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      8  1.1  christos 
      9  1.1  christos    This program is free software; you can redistribute it and/or modify
     10  1.1  christos    it under the terms of the GNU General Public License as published by
     11  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     12  1.1  christos    (at your option) any later version.
     13  1.1  christos 
     14  1.1  christos    This program is distributed in the hope that it will be useful,
     15  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  1.1  christos    GNU General Public License for more details.
     18  1.1  christos 
     19  1.1  christos    You should have received a copy of the GNU General Public License
     20  1.1  christos    along with this program; if not, write to the Free Software
     21  1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     22  1.1  christos    MA 02110-1301, USA.  */
     23  1.1  christos 
     24  1.1  christos 
     25  1.1  christos /*
     26  1.1  christos SECTION
     27  1.1  christos 	ELF backends
     28  1.1  christos 
     29  1.1  christos 	BFD support for ELF formats is being worked on.
     30  1.1  christos 	Currently, the best supported back ends are for sparc and i386
     31  1.1  christos 	(running svr4 or Solaris 2).
     32  1.1  christos 
     33  1.1  christos 	Documentation of the internals of the support code still needs
     34  1.1  christos 	to be written.  The code is changing quickly enough that we
     35  1.1  christos 	haven't bothered yet.  */
     36  1.1  christos 
     37  1.1  christos /* For sparc64-cross-sparc32.  */
     38  1.1  christos #define _SYSCALL32
     39  1.1  christos #include "sysdep.h"
     40  1.1  christos #include "bfd.h"
     41  1.1  christos #include "bfdlink.h"
     42  1.1  christos #include "libbfd.h"
     43  1.1  christos #define ARCH_SIZE 0
     44  1.1  christos #include "elf-bfd.h"
     45  1.1  christos #include "libiberty.h"
     46  1.1  christos #include "safe-ctype.h"
     47  1.1  christos 
     48  1.1  christos #ifdef CORE_HEADER
     49  1.1  christos #include CORE_HEADER
     50  1.1  christos #endif
     51  1.1  christos 
     52  1.1  christos static int elf_sort_sections (const void *, const void *);
     53  1.1  christos static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
     54  1.1  christos static bfd_boolean prep_headers (bfd *);
     55  1.1  christos static bfd_boolean swap_out_syms (bfd *, struct bfd_strtab_hash **, int) ;
     56  1.1  christos static bfd_boolean elf_read_notes (bfd *, file_ptr, bfd_size_type) ;
     57  1.1  christos static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
     58  1.1  christos 				    file_ptr offset);
     59  1.1  christos 
     60  1.1  christos /* Swap version information in and out.  The version information is
     61  1.1  christos    currently size independent.  If that ever changes, this code will
     62  1.1  christos    need to move into elfcode.h.  */
     63  1.1  christos 
     64  1.1  christos /* Swap in a Verdef structure.  */
     65  1.1  christos 
     66  1.1  christos void
     67  1.1  christos _bfd_elf_swap_verdef_in (bfd *abfd,
     68  1.1  christos 			 const Elf_External_Verdef *src,
     69  1.1  christos 			 Elf_Internal_Verdef *dst)
     70  1.1  christos {
     71  1.1  christos   dst->vd_version = H_GET_16 (abfd, src->vd_version);
     72  1.1  christos   dst->vd_flags   = H_GET_16 (abfd, src->vd_flags);
     73  1.1  christos   dst->vd_ndx     = H_GET_16 (abfd, src->vd_ndx);
     74  1.1  christos   dst->vd_cnt     = H_GET_16 (abfd, src->vd_cnt);
     75  1.1  christos   dst->vd_hash    = H_GET_32 (abfd, src->vd_hash);
     76  1.1  christos   dst->vd_aux     = H_GET_32 (abfd, src->vd_aux);
     77  1.1  christos   dst->vd_next    = H_GET_32 (abfd, src->vd_next);
     78  1.1  christos }
     79  1.1  christos 
     80  1.1  christos /* Swap out a Verdef structure.  */
     81  1.1  christos 
     82  1.1  christos void
     83  1.1  christos _bfd_elf_swap_verdef_out (bfd *abfd,
     84  1.1  christos 			  const Elf_Internal_Verdef *src,
     85  1.1  christos 			  Elf_External_Verdef *dst)
     86  1.1  christos {
     87  1.1  christos   H_PUT_16 (abfd, src->vd_version, dst->vd_version);
     88  1.1  christos   H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
     89  1.1  christos   H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
     90  1.1  christos   H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
     91  1.1  christos   H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
     92  1.1  christos   H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
     93  1.1  christos   H_PUT_32 (abfd, src->vd_next, dst->vd_next);
     94  1.1  christos }
     95  1.1  christos 
     96  1.1  christos /* Swap in a Verdaux structure.  */
     97  1.1  christos 
     98  1.1  christos void
     99  1.1  christos _bfd_elf_swap_verdaux_in (bfd *abfd,
    100  1.1  christos 			  const Elf_External_Verdaux *src,
    101  1.1  christos 			  Elf_Internal_Verdaux *dst)
    102  1.1  christos {
    103  1.1  christos   dst->vda_name = H_GET_32 (abfd, src->vda_name);
    104  1.1  christos   dst->vda_next = H_GET_32 (abfd, src->vda_next);
    105  1.1  christos }
    106  1.1  christos 
    107  1.1  christos /* Swap out a Verdaux structure.  */
    108  1.1  christos 
    109  1.1  christos void
    110  1.1  christos _bfd_elf_swap_verdaux_out (bfd *abfd,
    111  1.1  christos 			   const Elf_Internal_Verdaux *src,
    112  1.1  christos 			   Elf_External_Verdaux *dst)
    113  1.1  christos {
    114  1.1  christos   H_PUT_32 (abfd, src->vda_name, dst->vda_name);
    115  1.1  christos   H_PUT_32 (abfd, src->vda_next, dst->vda_next);
    116  1.1  christos }
    117  1.1  christos 
    118  1.1  christos /* Swap in a Verneed structure.  */
    119  1.1  christos 
    120  1.1  christos void
    121  1.1  christos _bfd_elf_swap_verneed_in (bfd *abfd,
    122  1.1  christos 			  const Elf_External_Verneed *src,
    123  1.1  christos 			  Elf_Internal_Verneed *dst)
    124  1.1  christos {
    125  1.1  christos   dst->vn_version = H_GET_16 (abfd, src->vn_version);
    126  1.1  christos   dst->vn_cnt     = H_GET_16 (abfd, src->vn_cnt);
    127  1.1  christos   dst->vn_file    = H_GET_32 (abfd, src->vn_file);
    128  1.1  christos   dst->vn_aux     = H_GET_32 (abfd, src->vn_aux);
    129  1.1  christos   dst->vn_next    = H_GET_32 (abfd, src->vn_next);
    130  1.1  christos }
    131  1.1  christos 
    132  1.1  christos /* Swap out a Verneed structure.  */
    133  1.1  christos 
    134  1.1  christos void
    135  1.1  christos _bfd_elf_swap_verneed_out (bfd *abfd,
    136  1.1  christos 			   const Elf_Internal_Verneed *src,
    137  1.1  christos 			   Elf_External_Verneed *dst)
    138  1.1  christos {
    139  1.1  christos   H_PUT_16 (abfd, src->vn_version, dst->vn_version);
    140  1.1  christos   H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
    141  1.1  christos   H_PUT_32 (abfd, src->vn_file, dst->vn_file);
    142  1.1  christos   H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
    143  1.1  christos   H_PUT_32 (abfd, src->vn_next, dst->vn_next);
    144  1.1  christos }
    145  1.1  christos 
    146  1.1  christos /* Swap in a Vernaux structure.  */
    147  1.1  christos 
    148  1.1  christos void
    149  1.1  christos _bfd_elf_swap_vernaux_in (bfd *abfd,
    150  1.1  christos 			  const Elf_External_Vernaux *src,
    151  1.1  christos 			  Elf_Internal_Vernaux *dst)
    152  1.1  christos {
    153  1.1  christos   dst->vna_hash  = H_GET_32 (abfd, src->vna_hash);
    154  1.1  christos   dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
    155  1.1  christos   dst->vna_other = H_GET_16 (abfd, src->vna_other);
    156  1.1  christos   dst->vna_name  = H_GET_32 (abfd, src->vna_name);
    157  1.1  christos   dst->vna_next  = H_GET_32 (abfd, src->vna_next);
    158  1.1  christos }
    159  1.1  christos 
    160  1.1  christos /* Swap out a Vernaux structure.  */
    161  1.1  christos 
    162  1.1  christos void
    163  1.1  christos _bfd_elf_swap_vernaux_out (bfd *abfd,
    164  1.1  christos 			   const Elf_Internal_Vernaux *src,
    165  1.1  christos 			   Elf_External_Vernaux *dst)
    166  1.1  christos {
    167  1.1  christos   H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
    168  1.1  christos   H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
    169  1.1  christos   H_PUT_16 (abfd, src->vna_other, dst->vna_other);
    170  1.1  christos   H_PUT_32 (abfd, src->vna_name, dst->vna_name);
    171  1.1  christos   H_PUT_32 (abfd, src->vna_next, dst->vna_next);
    172  1.1  christos }
    173  1.1  christos 
    174  1.1  christos /* Swap in a Versym structure.  */
    175  1.1  christos 
    176  1.1  christos void
    177  1.1  christos _bfd_elf_swap_versym_in (bfd *abfd,
    178  1.1  christos 			 const Elf_External_Versym *src,
    179  1.1  christos 			 Elf_Internal_Versym *dst)
    180  1.1  christos {
    181  1.1  christos   dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
    182  1.1  christos }
    183  1.1  christos 
    184  1.1  christos /* Swap out a Versym structure.  */
    185  1.1  christos 
    186  1.1  christos void
    187  1.1  christos _bfd_elf_swap_versym_out (bfd *abfd,
    188  1.1  christos 			  const Elf_Internal_Versym *src,
    189  1.1  christos 			  Elf_External_Versym *dst)
    190  1.1  christos {
    191  1.1  christos   H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
    192  1.1  christos }
    193  1.1  christos 
    194  1.1  christos /* Standard ELF hash function.  Do not change this function; you will
    195  1.1  christos    cause invalid hash tables to be generated.  */
    196  1.1  christos 
    197  1.1  christos unsigned long
    198  1.1  christos bfd_elf_hash (const char *namearg)
    199  1.1  christos {
    200  1.1  christos   const unsigned char *name = (const unsigned char *) namearg;
    201  1.1  christos   unsigned long h = 0;
    202  1.1  christos   unsigned long g;
    203  1.1  christos   int ch;
    204  1.1  christos 
    205  1.1  christos   while ((ch = *name++) != '\0')
    206  1.1  christos     {
    207  1.1  christos       h = (h << 4) + ch;
    208  1.1  christos       if ((g = (h & 0xf0000000)) != 0)
    209  1.1  christos 	{
    210  1.1  christos 	  h ^= g >> 24;
    211  1.1  christos 	  /* The ELF ABI says `h &= ~g', but this is equivalent in
    212  1.1  christos 	     this case and on some machines one insn instead of two.  */
    213  1.1  christos 	  h ^= g;
    214  1.1  christos 	}
    215  1.1  christos     }
    216  1.1  christos   return h & 0xffffffff;
    217  1.1  christos }
    218  1.1  christos 
    219  1.1  christos /* DT_GNU_HASH hash function.  Do not change this function; you will
    220  1.1  christos    cause invalid hash tables to be generated.  */
    221  1.1  christos 
    222  1.1  christos unsigned long
    223  1.1  christos bfd_elf_gnu_hash (const char *namearg)
    224  1.1  christos {
    225  1.1  christos   const unsigned char *name = (const unsigned char *) namearg;
    226  1.1  christos   unsigned long h = 5381;
    227  1.1  christos   unsigned char ch;
    228  1.1  christos 
    229  1.1  christos   while ((ch = *name++) != '\0')
    230  1.1  christos     h = (h << 5) + h + ch;
    231  1.1  christos   return h & 0xffffffff;
    232  1.1  christos }
    233  1.1  christos 
    234  1.1  christos /* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
    235  1.1  christos    the object_id field of an elf_obj_tdata field set to OBJECT_ID.  */
    236  1.1  christos bfd_boolean
    237  1.1  christos bfd_elf_allocate_object (bfd *abfd,
    238  1.1  christos 			 size_t object_size,
    239  1.1  christos 			 enum elf_target_id object_id)
    240  1.1  christos {
    241  1.1  christos   BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
    242  1.1  christos   abfd->tdata.any = bfd_zalloc (abfd, object_size);
    243  1.1  christos   if (abfd->tdata.any == NULL)
    244  1.1  christos     return FALSE;
    245  1.1  christos 
    246  1.1  christos   elf_object_id (abfd) = object_id;
    247  1.1  christos   elf_program_header_size (abfd) = (bfd_size_type) -1;
    248  1.1  christos   return TRUE;
    249  1.1  christos }
    250  1.1  christos 
    251  1.1  christos 
    252  1.1  christos bfd_boolean
    253  1.1  christos bfd_elf_make_object (bfd *abfd)
    254  1.1  christos {
    255  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
    256  1.1  christos   return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
    257  1.1  christos 				  bed->target_id);
    258  1.1  christos }
    259  1.1  christos 
    260  1.1  christos bfd_boolean
    261  1.1  christos bfd_elf_mkcorefile (bfd *abfd)
    262  1.1  christos {
    263  1.1  christos   /* I think this can be done just like an object file.  */
    264  1.1  christos   return abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd);
    265  1.1  christos }
    266  1.1  christos 
    267  1.1  christos static char *
    268  1.1  christos bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
    269  1.1  christos {
    270  1.1  christos   Elf_Internal_Shdr **i_shdrp;
    271  1.1  christos   bfd_byte *shstrtab = NULL;
    272  1.1  christos   file_ptr offset;
    273  1.1  christos   bfd_size_type shstrtabsize;
    274  1.1  christos 
    275  1.1  christos   i_shdrp = elf_elfsections (abfd);
    276  1.1  christos   if (i_shdrp == 0
    277  1.1  christos       || shindex >= elf_numsections (abfd)
    278  1.1  christos       || i_shdrp[shindex] == 0)
    279  1.1  christos     return NULL;
    280  1.1  christos 
    281  1.1  christos   shstrtab = i_shdrp[shindex]->contents;
    282  1.1  christos   if (shstrtab == NULL)
    283  1.1  christos     {
    284  1.1  christos       /* No cached one, attempt to read, and cache what we read.  */
    285  1.1  christos       offset = i_shdrp[shindex]->sh_offset;
    286  1.1  christos       shstrtabsize = i_shdrp[shindex]->sh_size;
    287  1.1  christos 
    288  1.1  christos       /* Allocate and clear an extra byte at the end, to prevent crashes
    289  1.1  christos 	 in case the string table is not terminated.  */
    290  1.1  christos       if (shstrtabsize + 1 <= 1
    291  1.1  christos 	  || (shstrtab = (bfd_byte *) bfd_alloc (abfd, shstrtabsize + 1)) == NULL
    292  1.1  christos 	  || bfd_seek (abfd, offset, SEEK_SET) != 0)
    293  1.1  christos 	shstrtab = NULL;
    294  1.1  christos       else if (bfd_bread (shstrtab, shstrtabsize, abfd) != shstrtabsize)
    295  1.1  christos 	{
    296  1.1  christos 	  if (bfd_get_error () != bfd_error_system_call)
    297  1.1  christos 	    bfd_set_error (bfd_error_file_truncated);
    298  1.1  christos 	  shstrtab = NULL;
    299  1.1  christos 	  /* Once we've failed to read it, make sure we don't keep
    300  1.1  christos 	     trying.  Otherwise, we'll keep allocating space for
    301  1.1  christos 	     the string table over and over.  */
    302  1.1  christos 	  i_shdrp[shindex]->sh_size = 0;
    303  1.1  christos 	}
    304  1.1  christos       else
    305  1.1  christos 	shstrtab[shstrtabsize] = '\0';
    306  1.1  christos       i_shdrp[shindex]->contents = shstrtab;
    307  1.1  christos     }
    308  1.1  christos   return (char *) shstrtab;
    309  1.1  christos }
    310  1.1  christos 
    311  1.1  christos char *
    312  1.1  christos bfd_elf_string_from_elf_section (bfd *abfd,
    313  1.1  christos 				 unsigned int shindex,
    314  1.1  christos 				 unsigned int strindex)
    315  1.1  christos {
    316  1.1  christos   Elf_Internal_Shdr *hdr;
    317  1.1  christos 
    318  1.1  christos   if (strindex == 0)
    319  1.1  christos     return "";
    320  1.1  christos 
    321  1.1  christos   if (elf_elfsections (abfd) == NULL || shindex >= elf_numsections (abfd))
    322  1.1  christos     return NULL;
    323  1.1  christos 
    324  1.1  christos   hdr = elf_elfsections (abfd)[shindex];
    325  1.1  christos 
    326  1.1  christos   if (hdr->contents == NULL
    327  1.1  christos       && bfd_elf_get_str_section (abfd, shindex) == NULL)
    328  1.1  christos     return NULL;
    329  1.1  christos 
    330  1.1  christos   if (strindex >= hdr->sh_size)
    331  1.1  christos     {
    332  1.1  christos       unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
    333  1.1  christos       (*_bfd_error_handler)
    334  1.1  christos 	(_("%B: invalid string offset %u >= %lu for section `%s'"),
    335  1.1  christos 	 abfd, strindex, (unsigned long) hdr->sh_size,
    336  1.1  christos 	 (shindex == shstrndx && strindex == hdr->sh_name
    337  1.1  christos 	  ? ".shstrtab"
    338  1.1  christos 	  : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
    339  1.1  christos       return NULL;
    340  1.1  christos     }
    341  1.1  christos 
    342  1.1  christos   return ((char *) hdr->contents) + strindex;
    343  1.1  christos }
    344  1.1  christos 
    345  1.1  christos /* Read and convert symbols to internal format.
    346  1.1  christos    SYMCOUNT specifies the number of symbols to read, starting from
    347  1.1  christos    symbol SYMOFFSET.  If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
    348  1.1  christos    are non-NULL, they are used to store the internal symbols, external
    349  1.1  christos    symbols, and symbol section index extensions, respectively.
    350  1.1  christos    Returns a pointer to the internal symbol buffer (malloced if necessary)
    351  1.1  christos    or NULL if there were no symbols or some kind of problem.  */
    352  1.1  christos 
    353  1.1  christos Elf_Internal_Sym *
    354  1.1  christos bfd_elf_get_elf_syms (bfd *ibfd,
    355  1.1  christos 		      Elf_Internal_Shdr *symtab_hdr,
    356  1.1  christos 		      size_t symcount,
    357  1.1  christos 		      size_t symoffset,
    358  1.1  christos 		      Elf_Internal_Sym *intsym_buf,
    359  1.1  christos 		      void *extsym_buf,
    360  1.1  christos 		      Elf_External_Sym_Shndx *extshndx_buf)
    361  1.1  christos {
    362  1.1  christos   Elf_Internal_Shdr *shndx_hdr;
    363  1.1  christos   void *alloc_ext;
    364  1.1  christos   const bfd_byte *esym;
    365  1.1  christos   Elf_External_Sym_Shndx *alloc_extshndx;
    366  1.1  christos   Elf_External_Sym_Shndx *shndx;
    367  1.1  christos   Elf_Internal_Sym *alloc_intsym;
    368  1.1  christos   Elf_Internal_Sym *isym;
    369  1.1  christos   Elf_Internal_Sym *isymend;
    370  1.1  christos   const struct elf_backend_data *bed;
    371  1.1  christos   size_t extsym_size;
    372  1.1  christos   bfd_size_type amt;
    373  1.1  christos   file_ptr pos;
    374  1.1  christos 
    375  1.1  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
    376  1.1  christos     abort ();
    377  1.1  christos 
    378  1.1  christos   if (symcount == 0)
    379  1.1  christos     return intsym_buf;
    380  1.1  christos 
    381  1.1  christos   /* Normal syms might have section extension entries.  */
    382  1.1  christos   shndx_hdr = NULL;
    383  1.1  christos   if (symtab_hdr == &elf_tdata (ibfd)->symtab_hdr)
    384  1.1  christos     shndx_hdr = &elf_tdata (ibfd)->symtab_shndx_hdr;
    385  1.1  christos 
    386  1.1  christos   /* Read the symbols.  */
    387  1.1  christos   alloc_ext = NULL;
    388  1.1  christos   alloc_extshndx = NULL;
    389  1.1  christos   alloc_intsym = NULL;
    390  1.1  christos   bed = get_elf_backend_data (ibfd);
    391  1.1  christos   extsym_size = bed->s->sizeof_sym;
    392  1.1  christos   amt = symcount * extsym_size;
    393  1.1  christos   pos = symtab_hdr->sh_offset + symoffset * extsym_size;
    394  1.1  christos   if (extsym_buf == NULL)
    395  1.1  christos     {
    396  1.1  christos       alloc_ext = bfd_malloc2 (symcount, extsym_size);
    397  1.1  christos       extsym_buf = alloc_ext;
    398  1.1  christos     }
    399  1.1  christos   if (extsym_buf == NULL
    400  1.1  christos       || bfd_seek (ibfd, pos, SEEK_SET) != 0
    401  1.1  christos       || bfd_bread (extsym_buf, amt, ibfd) != amt)
    402  1.1  christos     {
    403  1.1  christos       intsym_buf = NULL;
    404  1.1  christos       goto out;
    405  1.1  christos     }
    406  1.1  christos 
    407  1.1  christos   if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
    408  1.1  christos     extshndx_buf = NULL;
    409  1.1  christos   else
    410  1.1  christos     {
    411  1.1  christos       amt = symcount * sizeof (Elf_External_Sym_Shndx);
    412  1.1  christos       pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
    413  1.1  christos       if (extshndx_buf == NULL)
    414  1.1  christos 	{
    415  1.1  christos 	  alloc_extshndx = (Elf_External_Sym_Shndx *)
    416  1.1  christos               bfd_malloc2 (symcount, sizeof (Elf_External_Sym_Shndx));
    417  1.1  christos 	  extshndx_buf = alloc_extshndx;
    418  1.1  christos 	}
    419  1.1  christos       if (extshndx_buf == NULL
    420  1.1  christos 	  || bfd_seek (ibfd, pos, SEEK_SET) != 0
    421  1.1  christos 	  || bfd_bread (extshndx_buf, amt, ibfd) != amt)
    422  1.1  christos 	{
    423  1.1  christos 	  intsym_buf = NULL;
    424  1.1  christos 	  goto out;
    425  1.1  christos 	}
    426  1.1  christos     }
    427  1.1  christos 
    428  1.1  christos   if (intsym_buf == NULL)
    429  1.1  christos     {
    430  1.1  christos       alloc_intsym = (Elf_Internal_Sym *)
    431  1.1  christos           bfd_malloc2 (symcount, sizeof (Elf_Internal_Sym));
    432  1.1  christos       intsym_buf = alloc_intsym;
    433  1.1  christos       if (intsym_buf == NULL)
    434  1.1  christos 	goto out;
    435  1.1  christos     }
    436  1.1  christos 
    437  1.1  christos   /* Convert the symbols to internal form.  */
    438  1.1  christos   isymend = intsym_buf + symcount;
    439  1.1  christos   for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
    440  1.1  christos            shndx = extshndx_buf;
    441  1.1  christos        isym < isymend;
    442  1.1  christos        esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
    443  1.1  christos     if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
    444  1.1  christos       {
    445  1.1  christos 	symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
    446  1.1  christos 	(*_bfd_error_handler) (_("%B symbol number %lu references "
    447  1.1  christos 				 "nonexistent SHT_SYMTAB_SHNDX section"),
    448  1.1  christos 			       ibfd, (unsigned long) symoffset);
    449  1.1  christos 	if (alloc_intsym != NULL)
    450  1.1  christos 	  free (alloc_intsym);
    451  1.1  christos 	intsym_buf = NULL;
    452  1.1  christos 	goto out;
    453  1.1  christos       }
    454  1.1  christos 
    455  1.1  christos  out:
    456  1.1  christos   if (alloc_ext != NULL)
    457  1.1  christos     free (alloc_ext);
    458  1.1  christos   if (alloc_extshndx != NULL)
    459  1.1  christos     free (alloc_extshndx);
    460  1.1  christos 
    461  1.1  christos   return intsym_buf;
    462  1.1  christos }
    463  1.1  christos 
    464  1.1  christos /* Look up a symbol name.  */
    465  1.1  christos const char *
    466  1.1  christos bfd_elf_sym_name (bfd *abfd,
    467  1.1  christos 		  Elf_Internal_Shdr *symtab_hdr,
    468  1.1  christos 		  Elf_Internal_Sym *isym,
    469  1.1  christos 		  asection *sym_sec)
    470  1.1  christos {
    471  1.1  christos   const char *name;
    472  1.1  christos   unsigned int iname = isym->st_name;
    473  1.1  christos   unsigned int shindex = symtab_hdr->sh_link;
    474  1.1  christos 
    475  1.1  christos   if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
    476  1.1  christos       /* Check for a bogus st_shndx to avoid crashing.  */
    477  1.1  christos       && isym->st_shndx < elf_numsections (abfd))
    478  1.1  christos     {
    479  1.1  christos       iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
    480  1.1  christos       shindex = elf_elfheader (abfd)->e_shstrndx;
    481  1.1  christos     }
    482  1.1  christos 
    483  1.1  christos   name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
    484  1.1  christos   if (name == NULL)
    485  1.1  christos     name = "(null)";
    486  1.1  christos   else if (sym_sec && *name == '\0')
    487  1.1  christos     name = bfd_section_name (abfd, sym_sec);
    488  1.1  christos 
    489  1.1  christos   return name;
    490  1.1  christos }
    491  1.1  christos 
    492  1.1  christos /* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
    493  1.1  christos    sections.  The first element is the flags, the rest are section
    494  1.1  christos    pointers.  */
    495  1.1  christos 
    496  1.1  christos typedef union elf_internal_group {
    497  1.1  christos   Elf_Internal_Shdr *shdr;
    498  1.1  christos   unsigned int flags;
    499  1.1  christos } Elf_Internal_Group;
    500  1.1  christos 
    501  1.1  christos /* Return the name of the group signature symbol.  Why isn't the
    502  1.1  christos    signature just a string?  */
    503  1.1  christos 
    504  1.1  christos static const char *
    505  1.1  christos group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
    506  1.1  christos {
    507  1.1  christos   Elf_Internal_Shdr *hdr;
    508  1.1  christos   unsigned char esym[sizeof (Elf64_External_Sym)];
    509  1.1  christos   Elf_External_Sym_Shndx eshndx;
    510  1.1  christos   Elf_Internal_Sym isym;
    511  1.1  christos 
    512  1.1  christos   /* First we need to ensure the symbol table is available.  Make sure
    513  1.1  christos      that it is a symbol table section.  */
    514  1.1  christos   if (ghdr->sh_link >= elf_numsections (abfd))
    515  1.1  christos     return NULL;
    516  1.1  christos   hdr = elf_elfsections (abfd) [ghdr->sh_link];
    517  1.1  christos   if (hdr->sh_type != SHT_SYMTAB
    518  1.1  christos       || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
    519  1.1  christos     return NULL;
    520  1.1  christos 
    521  1.1  christos   /* Go read the symbol.  */
    522  1.1  christos   hdr = &elf_tdata (abfd)->symtab_hdr;
    523  1.1  christos   if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
    524  1.1  christos 			    &isym, esym, &eshndx) == NULL)
    525  1.1  christos     return NULL;
    526  1.1  christos 
    527  1.1  christos   return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
    528  1.1  christos }
    529  1.1  christos 
    530  1.1  christos /* Set next_in_group list pointer, and group name for NEWSECT.  */
    531  1.1  christos 
    532  1.1  christos static bfd_boolean
    533  1.1  christos setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
    534  1.1  christos {
    535  1.1  christos   unsigned int num_group = elf_tdata (abfd)->num_group;
    536  1.1  christos 
    537  1.1  christos   /* If num_group is zero, read in all SHT_GROUP sections.  The count
    538  1.1  christos      is set to -1 if there are no SHT_GROUP sections.  */
    539  1.1  christos   if (num_group == 0)
    540  1.1  christos     {
    541  1.1  christos       unsigned int i, shnum;
    542  1.1  christos 
    543  1.1  christos       /* First count the number of groups.  If we have a SHT_GROUP
    544  1.1  christos 	 section with just a flag word (ie. sh_size is 4), ignore it.  */
    545  1.1  christos       shnum = elf_numsections (abfd);
    546  1.1  christos       num_group = 0;
    547  1.1  christos 
    548  1.1  christos #define IS_VALID_GROUP_SECTION_HEADER(shdr)		\
    549  1.1  christos 	(   (shdr)->sh_type == SHT_GROUP		\
    550  1.1  christos 	 && (shdr)->sh_size >= (2 * GRP_ENTRY_SIZE)	\
    551  1.1  christos 	 && (shdr)->sh_entsize == GRP_ENTRY_SIZE	\
    552  1.1  christos 	 && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
    553  1.1  christos 
    554  1.1  christos       for (i = 0; i < shnum; i++)
    555  1.1  christos 	{
    556  1.1  christos 	  Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
    557  1.1  christos 
    558  1.1  christos 	  if (IS_VALID_GROUP_SECTION_HEADER (shdr))
    559  1.1  christos 	    num_group += 1;
    560  1.1  christos 	}
    561  1.1  christos 
    562  1.1  christos       if (num_group == 0)
    563  1.1  christos 	{
    564  1.1  christos 	  num_group = (unsigned) -1;
    565  1.1  christos 	  elf_tdata (abfd)->num_group = num_group;
    566  1.1  christos 	}
    567  1.1  christos       else
    568  1.1  christos 	{
    569  1.1  christos 	  /* We keep a list of elf section headers for group sections,
    570  1.1  christos 	     so we can find them quickly.  */
    571  1.1  christos 	  bfd_size_type amt;
    572  1.1  christos 
    573  1.1  christos 	  elf_tdata (abfd)->num_group = num_group;
    574  1.1  christos 	  elf_tdata (abfd)->group_sect_ptr = (Elf_Internal_Shdr **)
    575  1.1  christos               bfd_alloc2 (abfd, num_group, sizeof (Elf_Internal_Shdr *));
    576  1.1  christos 	  if (elf_tdata (abfd)->group_sect_ptr == NULL)
    577  1.1  christos 	    return FALSE;
    578  1.1  christos 
    579  1.1  christos 	  num_group = 0;
    580  1.1  christos 	  for (i = 0; i < shnum; i++)
    581  1.1  christos 	    {
    582  1.1  christos 	      Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
    583  1.1  christos 
    584  1.1  christos 	      if (IS_VALID_GROUP_SECTION_HEADER (shdr))
    585  1.1  christos 		{
    586  1.1  christos 		  unsigned char *src;
    587  1.1  christos 		  Elf_Internal_Group *dest;
    588  1.1  christos 
    589  1.1  christos 		  /* Add to list of sections.  */
    590  1.1  christos 		  elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
    591  1.1  christos 		  num_group += 1;
    592  1.1  christos 
    593  1.1  christos 		  /* Read the raw contents.  */
    594  1.1  christos 		  BFD_ASSERT (sizeof (*dest) >= 4);
    595  1.1  christos 		  amt = shdr->sh_size * sizeof (*dest) / 4;
    596  1.1  christos 		  shdr->contents = (unsigned char *)
    597  1.1  christos                       bfd_alloc2 (abfd, shdr->sh_size, sizeof (*dest) / 4);
    598  1.1  christos 		  /* PR binutils/4110: Handle corrupt group headers.  */
    599  1.1  christos 		  if (shdr->contents == NULL)
    600  1.1  christos 		    {
    601  1.1  christos 		      _bfd_error_handler
    602  1.1  christos 			(_("%B: Corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
    603  1.1  christos 		      bfd_set_error (bfd_error_bad_value);
    604  1.1  christos 		      return FALSE;
    605  1.1  christos 		    }
    606  1.1  christos 
    607  1.1  christos 		  memset (shdr->contents, 0, amt);
    608  1.1  christos 
    609  1.1  christos 		  if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
    610  1.1  christos 		      || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
    611  1.1  christos 			  != shdr->sh_size))
    612  1.1  christos 		    return FALSE;
    613  1.1  christos 
    614  1.1  christos 		  /* Translate raw contents, a flag word followed by an
    615  1.1  christos 		     array of elf section indices all in target byte order,
    616  1.1  christos 		     to the flag word followed by an array of elf section
    617  1.1  christos 		     pointers.  */
    618  1.1  christos 		  src = shdr->contents + shdr->sh_size;
    619  1.1  christos 		  dest = (Elf_Internal_Group *) (shdr->contents + amt);
    620  1.1  christos 		  while (1)
    621  1.1  christos 		    {
    622  1.1  christos 		      unsigned int idx;
    623  1.1  christos 
    624  1.1  christos 		      src -= 4;
    625  1.1  christos 		      --dest;
    626  1.1  christos 		      idx = H_GET_32 (abfd, src);
    627  1.1  christos 		      if (src == shdr->contents)
    628  1.1  christos 			{
    629  1.1  christos 			  dest->flags = idx;
    630  1.1  christos 			  if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
    631  1.1  christos 			    shdr->bfd_section->flags
    632  1.1  christos 			      |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
    633  1.1  christos 			  break;
    634  1.1  christos 			}
    635  1.1  christos 		      if (idx >= shnum)
    636  1.1  christos 			{
    637  1.1  christos 			  ((*_bfd_error_handler)
    638  1.1  christos 			   (_("%B: invalid SHT_GROUP entry"), abfd));
    639  1.1  christos 			  idx = 0;
    640  1.1  christos 			}
    641  1.1  christos 		      dest->shdr = elf_elfsections (abfd)[idx];
    642  1.1  christos 		    }
    643  1.1  christos 		}
    644  1.1  christos 	    }
    645  1.1  christos 	}
    646  1.1  christos     }
    647  1.1  christos 
    648  1.1  christos   if (num_group != (unsigned) -1)
    649  1.1  christos     {
    650  1.1  christos       unsigned int i;
    651  1.1  christos 
    652  1.1  christos       for (i = 0; i < num_group; i++)
    653  1.1  christos 	{
    654  1.1  christos 	  Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
    655  1.1  christos 	  Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
    656  1.1  christos 	  unsigned int n_elt = shdr->sh_size / 4;
    657  1.1  christos 
    658  1.1  christos 	  /* Look through this group's sections to see if current
    659  1.1  christos 	     section is a member.  */
    660  1.1  christos 	  while (--n_elt != 0)
    661  1.1  christos 	    if ((++idx)->shdr == hdr)
    662  1.1  christos 	      {
    663  1.1  christos 		asection *s = NULL;
    664  1.1  christos 
    665  1.1  christos 		/* We are a member of this group.  Go looking through
    666  1.1  christos 		   other members to see if any others are linked via
    667  1.1  christos 		   next_in_group.  */
    668  1.1  christos 		idx = (Elf_Internal_Group *) shdr->contents;
    669  1.1  christos 		n_elt = shdr->sh_size / 4;
    670  1.1  christos 		while (--n_elt != 0)
    671  1.1  christos 		  if ((s = (++idx)->shdr->bfd_section) != NULL
    672  1.1  christos 		      && elf_next_in_group (s) != NULL)
    673  1.1  christos 		    break;
    674  1.1  christos 		if (n_elt != 0)
    675  1.1  christos 		  {
    676  1.1  christos 		    /* Snarf the group name from other member, and
    677  1.1  christos 		       insert current section in circular list.  */
    678  1.1  christos 		    elf_group_name (newsect) = elf_group_name (s);
    679  1.1  christos 		    elf_next_in_group (newsect) = elf_next_in_group (s);
    680  1.1  christos 		    elf_next_in_group (s) = newsect;
    681  1.1  christos 		  }
    682  1.1  christos 		else
    683  1.1  christos 		  {
    684  1.1  christos 		    const char *gname;
    685  1.1  christos 
    686  1.1  christos 		    gname = group_signature (abfd, shdr);
    687  1.1  christos 		    if (gname == NULL)
    688  1.1  christos 		      return FALSE;
    689  1.1  christos 		    elf_group_name (newsect) = gname;
    690  1.1  christos 
    691  1.1  christos 		    /* Start a circular list with one element.  */
    692  1.1  christos 		    elf_next_in_group (newsect) = newsect;
    693  1.1  christos 		  }
    694  1.1  christos 
    695  1.1  christos 		/* If the group section has been created, point to the
    696  1.1  christos 		   new member.  */
    697  1.1  christos 		if (shdr->bfd_section != NULL)
    698  1.1  christos 		  elf_next_in_group (shdr->bfd_section) = newsect;
    699  1.1  christos 
    700  1.1  christos 		i = num_group - 1;
    701  1.1  christos 		break;
    702  1.1  christos 	      }
    703  1.1  christos 	}
    704  1.1  christos     }
    705  1.1  christos 
    706  1.1  christos   if (elf_group_name (newsect) == NULL)
    707  1.1  christos     {
    708  1.1  christos       (*_bfd_error_handler) (_("%B: no group info for section %A"),
    709  1.1  christos 			     abfd, newsect);
    710  1.1  christos     }
    711  1.1  christos   return TRUE;
    712  1.1  christos }
    713  1.1  christos 
    714  1.1  christos bfd_boolean
    715  1.1  christos _bfd_elf_setup_sections (bfd *abfd)
    716  1.1  christos {
    717  1.1  christos   unsigned int i;
    718  1.1  christos   unsigned int num_group = elf_tdata (abfd)->num_group;
    719  1.1  christos   bfd_boolean result = TRUE;
    720  1.1  christos   asection *s;
    721  1.1  christos 
    722  1.1  christos   /* Process SHF_LINK_ORDER.  */
    723  1.1  christos   for (s = abfd->sections; s != NULL; s = s->next)
    724  1.1  christos     {
    725  1.1  christos       Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
    726  1.1  christos       if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
    727  1.1  christos 	{
    728  1.1  christos 	  unsigned int elfsec = this_hdr->sh_link;
    729  1.1  christos 	  /* FIXME: The old Intel compiler and old strip/objcopy may
    730  1.1  christos 	     not set the sh_link or sh_info fields.  Hence we could
    731  1.1  christos 	     get the situation where elfsec is 0.  */
    732  1.1  christos 	  if (elfsec == 0)
    733  1.1  christos 	    {
    734  1.1  christos 	      const struct elf_backend_data *bed = get_elf_backend_data (abfd);
    735  1.1  christos 	      if (bed->link_order_error_handler)
    736  1.1  christos 		bed->link_order_error_handler
    737  1.1  christos 		  (_("%B: warning: sh_link not set for section `%A'"),
    738  1.1  christos 		   abfd, s);
    739  1.1  christos 	    }
    740  1.1  christos 	  else
    741  1.1  christos 	    {
    742  1.1  christos 	      asection *linksec = NULL;
    743  1.1  christos 
    744  1.1  christos 	      if (elfsec < elf_numsections (abfd))
    745  1.1  christos 		{
    746  1.1  christos 		  this_hdr = elf_elfsections (abfd)[elfsec];
    747  1.1  christos 		  linksec = this_hdr->bfd_section;
    748  1.1  christos 		}
    749  1.1  christos 
    750  1.1  christos 	      /* PR 1991, 2008:
    751  1.1  christos 		 Some strip/objcopy may leave an incorrect value in
    752  1.1  christos 		 sh_link.  We don't want to proceed.  */
    753  1.1  christos 	      if (linksec == NULL)
    754  1.1  christos 		{
    755  1.1  christos 		  (*_bfd_error_handler)
    756  1.1  christos 		    (_("%B: sh_link [%d] in section `%A' is incorrect"),
    757  1.1  christos 		     s->owner, s, elfsec);
    758  1.1  christos 		  result = FALSE;
    759  1.1  christos 		}
    760  1.1  christos 
    761  1.1  christos 	      elf_linked_to_section (s) = linksec;
    762  1.1  christos 	    }
    763  1.1  christos 	}
    764  1.1  christos     }
    765  1.1  christos 
    766  1.1  christos   /* Process section groups.  */
    767  1.1  christos   if (num_group == (unsigned) -1)
    768  1.1  christos     return result;
    769  1.1  christos 
    770  1.1  christos   for (i = 0; i < num_group; i++)
    771  1.1  christos     {
    772  1.1  christos       Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
    773  1.1  christos       Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
    774  1.1  christos       unsigned int n_elt = shdr->sh_size / 4;
    775  1.1  christos 
    776  1.1  christos       while (--n_elt != 0)
    777  1.1  christos 	if ((++idx)->shdr->bfd_section)
    778  1.1  christos 	  elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
    779  1.1  christos 	else if (idx->shdr->sh_type == SHT_RELA
    780  1.1  christos 		 || idx->shdr->sh_type == SHT_REL)
    781  1.1  christos 	  /* We won't include relocation sections in section groups in
    782  1.1  christos 	     output object files. We adjust the group section size here
    783  1.1  christos 	     so that relocatable link will work correctly when
    784  1.1  christos 	     relocation sections are in section group in input object
    785  1.1  christos 	     files.  */
    786  1.1  christos 	  shdr->bfd_section->size -= 4;
    787  1.1  christos 	else
    788  1.1  christos 	  {
    789  1.1  christos 	    /* There are some unknown sections in the group.  */
    790  1.1  christos 	    (*_bfd_error_handler)
    791  1.1  christos 	      (_("%B: unknown [%d] section `%s' in group [%s]"),
    792  1.1  christos 	       abfd,
    793  1.1  christos 	       (unsigned int) idx->shdr->sh_type,
    794  1.1  christos 	       bfd_elf_string_from_elf_section (abfd,
    795  1.1  christos 						(elf_elfheader (abfd)
    796  1.1  christos 						 ->e_shstrndx),
    797  1.1  christos 						idx->shdr->sh_name),
    798  1.1  christos 	       shdr->bfd_section->name);
    799  1.1  christos 	    result = FALSE;
    800  1.1  christos 	  }
    801  1.1  christos     }
    802  1.1  christos   return result;
    803  1.1  christos }
    804  1.1  christos 
    805  1.1  christos bfd_boolean
    806  1.1  christos bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
    807  1.1  christos {
    808  1.1  christos   return elf_next_in_group (sec) != NULL;
    809  1.1  christos }
    810  1.1  christos 
    811  1.1  christos /* Make a BFD section from an ELF section.  We store a pointer to the
    812  1.1  christos    BFD section in the bfd_section field of the header.  */
    813  1.1  christos 
    814  1.1  christos bfd_boolean
    815  1.1  christos _bfd_elf_make_section_from_shdr (bfd *abfd,
    816  1.1  christos 				 Elf_Internal_Shdr *hdr,
    817  1.1  christos 				 const char *name,
    818  1.1  christos 				 int shindex)
    819  1.1  christos {
    820  1.1  christos   asection *newsect;
    821  1.1  christos   flagword flags;
    822  1.1  christos   const struct elf_backend_data *bed;
    823  1.1  christos 
    824  1.1  christos   if (hdr->bfd_section != NULL)
    825  1.1  christos     return TRUE;
    826  1.1  christos 
    827  1.1  christos   newsect = bfd_make_section_anyway (abfd, name);
    828  1.1  christos   if (newsect == NULL)
    829  1.1  christos     return FALSE;
    830  1.1  christos 
    831  1.1  christos   hdr->bfd_section = newsect;
    832  1.1  christos   elf_section_data (newsect)->this_hdr = *hdr;
    833  1.1  christos   elf_section_data (newsect)->this_idx = shindex;
    834  1.1  christos 
    835  1.1  christos   /* Always use the real type/flags.  */
    836  1.1  christos   elf_section_type (newsect) = hdr->sh_type;
    837  1.1  christos   elf_section_flags (newsect) = hdr->sh_flags;
    838  1.1  christos 
    839  1.1  christos   newsect->filepos = hdr->sh_offset;
    840  1.1  christos 
    841  1.1  christos   if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr)
    842  1.1  christos       || ! bfd_set_section_size (abfd, newsect, hdr->sh_size)
    843  1.1  christos       || ! bfd_set_section_alignment (abfd, newsect,
    844  1.1  christos 				      bfd_log2 (hdr->sh_addralign)))
    845  1.1  christos     return FALSE;
    846  1.1  christos 
    847  1.1  christos   flags = SEC_NO_FLAGS;
    848  1.1  christos   if (hdr->sh_type != SHT_NOBITS)
    849  1.1  christos     flags |= SEC_HAS_CONTENTS;
    850  1.1  christos   if (hdr->sh_type == SHT_GROUP)
    851  1.1  christos     flags |= SEC_GROUP | SEC_EXCLUDE;
    852  1.1  christos   if ((hdr->sh_flags & SHF_ALLOC) != 0)
    853  1.1  christos     {
    854  1.1  christos       flags |= SEC_ALLOC;
    855  1.1  christos       if (hdr->sh_type != SHT_NOBITS)
    856  1.1  christos 	flags |= SEC_LOAD;
    857  1.1  christos     }
    858  1.1  christos   if ((hdr->sh_flags & SHF_WRITE) == 0)
    859  1.1  christos     flags |= SEC_READONLY;
    860  1.1  christos   if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
    861  1.1  christos     flags |= SEC_CODE;
    862  1.1  christos   else if ((flags & SEC_LOAD) != 0)
    863  1.1  christos     flags |= SEC_DATA;
    864  1.1  christos   if ((hdr->sh_flags & SHF_MERGE) != 0)
    865  1.1  christos     {
    866  1.1  christos       flags |= SEC_MERGE;
    867  1.1  christos       newsect->entsize = hdr->sh_entsize;
    868  1.1  christos       if ((hdr->sh_flags & SHF_STRINGS) != 0)
    869  1.1  christos 	flags |= SEC_STRINGS;
    870  1.1  christos     }
    871  1.1  christos   if (hdr->sh_flags & SHF_GROUP)
    872  1.1  christos     if (!setup_group (abfd, hdr, newsect))
    873  1.1  christos       return FALSE;
    874  1.1  christos   if ((hdr->sh_flags & SHF_TLS) != 0)
    875  1.1  christos     flags |= SEC_THREAD_LOCAL;
    876  1.1  christos   if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
    877  1.1  christos     flags |= SEC_EXCLUDE;
    878  1.1  christos 
    879  1.1  christos   if ((flags & SEC_ALLOC) == 0)
    880  1.1  christos     {
    881  1.1  christos       /* The debugging sections appear to be recognized only by name,
    882  1.1  christos 	 not any sort of flag.  Their SEC_ALLOC bits are cleared.  */
    883  1.1  christos       static const struct
    884  1.1  christos 	{
    885  1.1  christos 	  const char *name;
    886  1.1  christos 	  int len;
    887  1.1  christos 	} debug_sections [] =
    888  1.1  christos 	{
    889  1.1  christos 	  { STRING_COMMA_LEN ("debug") },	/* 'd' */
    890  1.1  christos 	  { NULL,		 0  },	/* 'e' */
    891  1.1  christos 	  { NULL,		 0  },	/* 'f' */
    892  1.1  christos 	  { STRING_COMMA_LEN ("gnu.linkonce.wi.") },	/* 'g' */
    893  1.1  christos 	  { NULL,		 0  },	/* 'h' */
    894  1.1  christos 	  { NULL,		 0  },	/* 'i' */
    895  1.1  christos 	  { NULL,		 0  },	/* 'j' */
    896  1.1  christos 	  { NULL,		 0  },	/* 'k' */
    897  1.1  christos 	  { STRING_COMMA_LEN ("line") },	/* 'l' */
    898  1.1  christos 	  { NULL,		 0  },	/* 'm' */
    899  1.1  christos 	  { NULL,		 0  },	/* 'n' */
    900  1.1  christos 	  { NULL,		 0  },	/* 'o' */
    901  1.1  christos 	  { NULL,		 0  },	/* 'p' */
    902  1.1  christos 	  { NULL,		 0  },	/* 'q' */
    903  1.1  christos 	  { NULL,		 0  },	/* 'r' */
    904  1.1  christos 	  { STRING_COMMA_LEN ("stab") },	/* 's' */
    905  1.1  christos 	  { NULL,		 0  },	/* 't' */
    906  1.1  christos 	  { NULL,		 0  },	/* 'u' */
    907  1.1  christos 	  { NULL,		 0  },	/* 'v' */
    908  1.1  christos 	  { NULL,		 0  },	/* 'w' */
    909  1.1  christos 	  { NULL,		 0  },	/* 'x' */
    910  1.1  christos 	  { NULL,		 0  },	/* 'y' */
    911  1.1  christos 	  { STRING_COMMA_LEN ("zdebug") }	/* 'z' */
    912  1.1  christos 	};
    913  1.1  christos 
    914  1.1  christos       if (name [0] == '.')
    915  1.1  christos 	{
    916  1.1  christos 	  int i = name [1] - 'd';
    917  1.1  christos 	  if (i >= 0
    918  1.1  christos 	      && i < (int) ARRAY_SIZE (debug_sections)
    919  1.1  christos 	      && debug_sections [i].name != NULL
    920  1.1  christos 	      && strncmp (&name [1], debug_sections [i].name,
    921  1.1  christos 			  debug_sections [i].len) == 0)
    922  1.1  christos 	    flags |= SEC_DEBUGGING;
    923  1.1  christos 	}
    924  1.1  christos     }
    925  1.1  christos 
    926  1.1  christos   /* As a GNU extension, if the name begins with .gnu.linkonce, we
    927  1.1  christos      only link a single copy of the section.  This is used to support
    928  1.1  christos      g++.  g++ will emit each template expansion in its own section.
    929  1.1  christos      The symbols will be defined as weak, so that multiple definitions
    930  1.1  christos      are permitted.  The GNU linker extension is to actually discard
    931  1.1  christos      all but one of the sections.  */
    932  1.1  christos   if (CONST_STRNEQ (name, ".gnu.linkonce")
    933  1.1  christos       && elf_next_in_group (newsect) == NULL)
    934  1.1  christos     flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
    935  1.1  christos 
    936  1.1  christos   bed = get_elf_backend_data (abfd);
    937  1.1  christos   if (bed->elf_backend_section_flags)
    938  1.1  christos     if (! bed->elf_backend_section_flags (&flags, hdr))
    939  1.1  christos       return FALSE;
    940  1.1  christos 
    941  1.1  christos   if (! bfd_set_section_flags (abfd, newsect, flags))
    942  1.1  christos     return FALSE;
    943  1.1  christos 
    944  1.1  christos   /* We do not parse the PT_NOTE segments as we are interested even in the
    945  1.1  christos      separate debug info files which may have the segments offsets corrupted.
    946  1.1  christos      PT_NOTEs from the core files are currently not parsed using BFD.  */
    947  1.1  christos   if (hdr->sh_type == SHT_NOTE)
    948  1.1  christos     {
    949  1.1  christos       bfd_byte *contents;
    950  1.1  christos 
    951  1.1  christos       if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
    952  1.1  christos 	return FALSE;
    953  1.1  christos 
    954  1.1  christos       elf_parse_notes (abfd, (char *) contents, hdr->sh_size, -1);
    955  1.1  christos       free (contents);
    956  1.1  christos     }
    957  1.1  christos 
    958  1.1  christos   if ((flags & SEC_ALLOC) != 0)
    959  1.1  christos     {
    960  1.1  christos       Elf_Internal_Phdr *phdr;
    961  1.1  christos       unsigned int i, nload;
    962  1.1  christos 
    963  1.1  christos       /* Some ELF linkers produce binaries with all the program header
    964  1.1  christos 	 p_paddr fields zero.  If we have such a binary with more than
    965  1.1  christos 	 one PT_LOAD header, then leave the section lma equal to vma
    966  1.1  christos 	 so that we don't create sections with overlapping lma.  */
    967  1.1  christos       phdr = elf_tdata (abfd)->phdr;
    968  1.1  christos       for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
    969  1.1  christos 	if (phdr->p_paddr != 0)
    970  1.1  christos 	  break;
    971  1.1  christos 	else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
    972  1.1  christos 	  ++nload;
    973  1.1  christos       if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
    974  1.1  christos 	return TRUE;
    975  1.1  christos 
    976  1.1  christos       phdr = elf_tdata (abfd)->phdr;
    977  1.1  christos       for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
    978  1.1  christos 	{
    979  1.1  christos 	  if (phdr->p_type == PT_LOAD
    980  1.1  christos 	      && ELF_SECTION_IN_SEGMENT (hdr, phdr))
    981  1.1  christos 	    {
    982  1.1  christos 	      if ((flags & SEC_LOAD) == 0)
    983  1.1  christos 		newsect->lma = (phdr->p_paddr
    984  1.1  christos 				+ hdr->sh_addr - phdr->p_vaddr);
    985  1.1  christos 	      else
    986  1.1  christos 		/* We used to use the same adjustment for SEC_LOAD
    987  1.1  christos 		   sections, but that doesn't work if the segment
    988  1.1  christos 		   is packed with code from multiple VMAs.
    989  1.1  christos 		   Instead we calculate the section LMA based on
    990  1.1  christos 		   the segment LMA.  It is assumed that the
    991  1.1  christos 		   segment will contain sections with contiguous
    992  1.1  christos 		   LMAs, even if the VMAs are not.  */
    993  1.1  christos 		newsect->lma = (phdr->p_paddr
    994  1.1  christos 				+ hdr->sh_offset - phdr->p_offset);
    995  1.1  christos 
    996  1.1  christos 	      /* With contiguous segments, we can't tell from file
    997  1.1  christos 		 offsets whether a section with zero size should
    998  1.1  christos 		 be placed at the end of one segment or the
    999  1.1  christos 		 beginning of the next.  Decide based on vaddr.  */
   1000  1.1  christos 	      if (hdr->sh_addr >= phdr->p_vaddr
   1001  1.1  christos 		  && (hdr->sh_addr + hdr->sh_size
   1002  1.1  christos 		      <= phdr->p_vaddr + phdr->p_memsz))
   1003  1.1  christos 		break;
   1004  1.1  christos 	    }
   1005  1.1  christos 	}
   1006  1.1  christos     }
   1007  1.1  christos 
   1008  1.1  christos   /* Compress/decompress DWARF debug sections with names: .debug_* and
   1009  1.1  christos      .zdebug_*, after the section flags is set.  */
   1010  1.1  christos   if ((flags & SEC_DEBUGGING)
   1011  1.1  christos       && ((name[1] == 'd' && name[6] == '_')
   1012  1.1  christos 	  || (name[1] == 'z' && name[7] == '_')))
   1013  1.1  christos     {
   1014  1.1  christos       enum { nothing, compress, decompress } action = nothing;
   1015  1.1  christos       char *new_name;
   1016  1.1  christos 
   1017  1.1  christos       if (bfd_is_section_compressed (abfd, newsect))
   1018  1.1  christos 	{
   1019  1.1  christos 	  /* Compressed section.  Check if we should decompress.  */
   1020  1.1  christos 	  if ((abfd->flags & BFD_DECOMPRESS))
   1021  1.1  christos 	    action = decompress;
   1022  1.1  christos 	}
   1023  1.1  christos       else
   1024  1.1  christos 	{
   1025  1.1  christos 	  /* Normal section.  Check if we should compress.  */
   1026  1.1  christos 	  if ((abfd->flags & BFD_COMPRESS))
   1027  1.1  christos 	    action = compress;
   1028  1.1  christos 	}
   1029  1.1  christos 
   1030  1.1  christos       new_name = NULL;
   1031  1.1  christos       switch (action)
   1032  1.1  christos 	{
   1033  1.1  christos 	case nothing:
   1034  1.1  christos 	  break;
   1035  1.1  christos 	case compress:
   1036  1.1  christos 	  if (!bfd_init_section_compress_status (abfd, newsect))
   1037  1.1  christos 	    {
   1038  1.1  christos 	      (*_bfd_error_handler)
   1039  1.1  christos 		(_("%B: unable to initialize commpress status for section %s"),
   1040  1.1  christos 		 abfd, name);
   1041  1.1  christos 	      return FALSE;
   1042  1.1  christos 	    }
   1043  1.1  christos 	  if (name[1] != 'z')
   1044  1.1  christos 	    {
   1045  1.1  christos 	      unsigned int len = strlen (name);
   1046  1.1  christos 
   1047  1.1  christos 	      new_name = bfd_alloc (abfd, len + 2);
   1048  1.1  christos 	      if (new_name == NULL)
   1049  1.1  christos 		return FALSE;
   1050  1.1  christos 	      new_name[0] = '.';
   1051  1.1  christos 	      new_name[1] = 'z';
   1052  1.1  christos 	      memcpy (new_name + 2, name + 1, len);
   1053  1.1  christos 	    }
   1054  1.1  christos 	  break;
   1055  1.1  christos 	case decompress:
   1056  1.1  christos 	  if (!bfd_init_section_decompress_status (abfd, newsect))
   1057  1.1  christos 	    {
   1058  1.1  christos 	      (*_bfd_error_handler)
   1059  1.1  christos 		(_("%B: unable to initialize decommpress status for section %s"),
   1060  1.1  christos 		 abfd, name);
   1061  1.1  christos 	      return FALSE;
   1062  1.1  christos 	    }
   1063  1.1  christos 	  if (name[1] == 'z')
   1064  1.1  christos 	    {
   1065  1.1  christos 	      unsigned int len = strlen (name);
   1066  1.1  christos 
   1067  1.1  christos 	      new_name = bfd_alloc (abfd, len);
   1068  1.1  christos 	      if (new_name == NULL)
   1069  1.1  christos 		return FALSE;
   1070  1.1  christos 	      new_name[0] = '.';
   1071  1.1  christos 	      memcpy (new_name + 1, name + 2, len - 1);
   1072  1.1  christos 	    }
   1073  1.1  christos 	  break;
   1074  1.1  christos 	}
   1075  1.1  christos       if (new_name != NULL)
   1076  1.1  christos 	bfd_rename_section (abfd, newsect, new_name);
   1077  1.1  christos     }
   1078  1.1  christos 
   1079  1.1  christos   return TRUE;
   1080  1.1  christos }
   1081  1.1  christos 
   1082  1.1  christos const char *const bfd_elf_section_type_names[] = {
   1083  1.1  christos   "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
   1084  1.1  christos   "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
   1085  1.1  christos   "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
   1086  1.1  christos };
   1087  1.1  christos 
   1088  1.1  christos /* ELF relocs are against symbols.  If we are producing relocatable
   1089  1.1  christos    output, and the reloc is against an external symbol, and nothing
   1090  1.1  christos    has given us any additional addend, the resulting reloc will also
   1091  1.1  christos    be against the same symbol.  In such a case, we don't want to
   1092  1.1  christos    change anything about the way the reloc is handled, since it will
   1093  1.1  christos    all be done at final link time.  Rather than put special case code
   1094  1.1  christos    into bfd_perform_relocation, all the reloc types use this howto
   1095  1.1  christos    function.  It just short circuits the reloc if producing
   1096  1.1  christos    relocatable output against an external symbol.  */
   1097  1.1  christos 
   1098  1.1  christos bfd_reloc_status_type
   1099  1.1  christos bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
   1100  1.1  christos 		       arelent *reloc_entry,
   1101  1.1  christos 		       asymbol *symbol,
   1102  1.1  christos 		       void *data ATTRIBUTE_UNUSED,
   1103  1.1  christos 		       asection *input_section,
   1104  1.1  christos 		       bfd *output_bfd,
   1105  1.1  christos 		       char **error_message ATTRIBUTE_UNUSED)
   1106  1.1  christos {
   1107  1.1  christos   if (output_bfd != NULL
   1108  1.1  christos       && (symbol->flags & BSF_SECTION_SYM) == 0
   1109  1.1  christos       && (! reloc_entry->howto->partial_inplace
   1110  1.1  christos 	  || reloc_entry->addend == 0))
   1111  1.1  christos     {
   1112  1.1  christos       reloc_entry->address += input_section->output_offset;
   1113  1.1  christos       return bfd_reloc_ok;
   1114  1.1  christos     }
   1115  1.1  christos 
   1116  1.1  christos   return bfd_reloc_continue;
   1117  1.1  christos }
   1118  1.1  christos 
   1119  1.1  christos /* Copy the program header and other data from one object module to
   1121  1.1  christos    another.  */
   1122  1.1  christos 
   1123  1.1  christos bfd_boolean
   1124  1.1  christos _bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   1125  1.1  christos {
   1126  1.1  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   1127  1.1  christos       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   1128  1.1  christos     return TRUE;
   1129  1.1  christos 
   1130  1.1  christos   BFD_ASSERT (!elf_flags_init (obfd)
   1131  1.1  christos 	      || (elf_elfheader (obfd)->e_flags
   1132  1.1  christos 		  == elf_elfheader (ibfd)->e_flags));
   1133  1.1  christos 
   1134  1.1  christos   elf_gp (obfd) = elf_gp (ibfd);
   1135  1.1  christos   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
   1136  1.1  christos   elf_flags_init (obfd) = TRUE;
   1137  1.1  christos 
   1138  1.1  christos   /* Copy object attributes.  */
   1139  1.1  christos   _bfd_elf_copy_obj_attributes (ibfd, obfd);
   1140  1.1  christos   return TRUE;
   1141  1.1  christos }
   1142  1.1  christos 
   1143  1.1  christos static const char *
   1144  1.1  christos get_segment_type (unsigned int p_type)
   1145  1.1  christos {
   1146  1.1  christos   const char *pt;
   1147  1.1  christos   switch (p_type)
   1148  1.1  christos     {
   1149  1.1  christos     case PT_NULL: pt = "NULL"; break;
   1150  1.1  christos     case PT_LOAD: pt = "LOAD"; break;
   1151  1.1  christos     case PT_DYNAMIC: pt = "DYNAMIC"; break;
   1152  1.1  christos     case PT_INTERP: pt = "INTERP"; break;
   1153  1.1  christos     case PT_NOTE: pt = "NOTE"; break;
   1154  1.1  christos     case PT_SHLIB: pt = "SHLIB"; break;
   1155  1.1  christos     case PT_PHDR: pt = "PHDR"; break;
   1156  1.1  christos     case PT_TLS: pt = "TLS"; break;
   1157  1.1  christos     case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
   1158  1.1  christos     case PT_GNU_STACK: pt = "STACK"; break;
   1159  1.1  christos     case PT_GNU_RELRO: pt = "RELRO"; break;
   1160  1.1  christos     default: pt = NULL; break;
   1161  1.1  christos     }
   1162  1.1  christos   return pt;
   1163  1.1  christos }
   1164  1.1  christos 
   1165  1.1  christos /* Print out the program headers.  */
   1166  1.1  christos 
   1167  1.1  christos bfd_boolean
   1168  1.1  christos _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
   1169  1.1  christos {
   1170  1.1  christos   FILE *f = (FILE *) farg;
   1171  1.1  christos   Elf_Internal_Phdr *p;
   1172  1.1  christos   asection *s;
   1173  1.1  christos   bfd_byte *dynbuf = NULL;
   1174  1.1  christos 
   1175  1.1  christos   p = elf_tdata (abfd)->phdr;
   1176  1.1  christos   if (p != NULL)
   1177  1.1  christos     {
   1178  1.1  christos       unsigned int i, c;
   1179  1.1  christos 
   1180  1.1  christos       fprintf (f, _("\nProgram Header:\n"));
   1181  1.1  christos       c = elf_elfheader (abfd)->e_phnum;
   1182  1.1  christos       for (i = 0; i < c; i++, p++)
   1183  1.1  christos 	{
   1184  1.1  christos 	  const char *pt = get_segment_type (p->p_type);
   1185  1.1  christos 	  char buf[20];
   1186  1.1  christos 
   1187  1.1  christos 	  if (pt == NULL)
   1188  1.1  christos 	    {
   1189  1.1  christos 	      sprintf (buf, "0x%lx", p->p_type);
   1190  1.1  christos 	      pt = buf;
   1191  1.1  christos 	    }
   1192  1.1  christos 	  fprintf (f, "%8s off    0x", pt);
   1193  1.1  christos 	  bfd_fprintf_vma (abfd, f, p->p_offset);
   1194  1.1  christos 	  fprintf (f, " vaddr 0x");
   1195  1.1  christos 	  bfd_fprintf_vma (abfd, f, p->p_vaddr);
   1196  1.1  christos 	  fprintf (f, " paddr 0x");
   1197  1.1  christos 	  bfd_fprintf_vma (abfd, f, p->p_paddr);
   1198  1.1  christos 	  fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
   1199  1.1  christos 	  fprintf (f, "         filesz 0x");
   1200  1.1  christos 	  bfd_fprintf_vma (abfd, f, p->p_filesz);
   1201  1.1  christos 	  fprintf (f, " memsz 0x");
   1202  1.1  christos 	  bfd_fprintf_vma (abfd, f, p->p_memsz);
   1203  1.1  christos 	  fprintf (f, " flags %c%c%c",
   1204  1.1  christos 		   (p->p_flags & PF_R) != 0 ? 'r' : '-',
   1205  1.1  christos 		   (p->p_flags & PF_W) != 0 ? 'w' : '-',
   1206  1.1  christos 		   (p->p_flags & PF_X) != 0 ? 'x' : '-');
   1207  1.1  christos 	  if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
   1208  1.1  christos 	    fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
   1209  1.1  christos 	  fprintf (f, "\n");
   1210  1.1  christos 	}
   1211  1.1  christos     }
   1212  1.1  christos 
   1213  1.1  christos   s = bfd_get_section_by_name (abfd, ".dynamic");
   1214  1.1  christos   if (s != NULL)
   1215  1.1  christos     {
   1216  1.1  christos       unsigned int elfsec;
   1217  1.1  christos       unsigned long shlink;
   1218  1.1  christos       bfd_byte *extdyn, *extdynend;
   1219  1.1  christos       size_t extdynsize;
   1220  1.1  christos       void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
   1221  1.1  christos 
   1222  1.1  christos       fprintf (f, _("\nDynamic Section:\n"));
   1223  1.1  christos 
   1224  1.1  christos       if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
   1225  1.1  christos 	goto error_return;
   1226  1.1  christos 
   1227  1.1  christos       elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
   1228  1.1  christos       if (elfsec == SHN_BAD)
   1229  1.1  christos 	goto error_return;
   1230  1.1  christos       shlink = elf_elfsections (abfd)[elfsec]->sh_link;
   1231  1.1  christos 
   1232  1.1  christos       extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
   1233  1.1  christos       swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
   1234  1.1  christos 
   1235  1.1  christos       extdyn = dynbuf;
   1236  1.1  christos       extdynend = extdyn + s->size;
   1237  1.1  christos       for (; extdyn < extdynend; extdyn += extdynsize)
   1238  1.1  christos 	{
   1239  1.1  christos 	  Elf_Internal_Dyn dyn;
   1240  1.1  christos 	  const char *name = "";
   1241  1.1  christos 	  char ab[20];
   1242  1.1  christos 	  bfd_boolean stringp;
   1243  1.1  christos 	  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   1244  1.1  christos 
   1245  1.1  christos 	  (*swap_dyn_in) (abfd, extdyn, &dyn);
   1246  1.1  christos 
   1247  1.1  christos 	  if (dyn.d_tag == DT_NULL)
   1248  1.1  christos 	    break;
   1249  1.1  christos 
   1250  1.1  christos 	  stringp = FALSE;
   1251  1.1  christos 	  switch (dyn.d_tag)
   1252  1.1  christos 	    {
   1253  1.1  christos 	    default:
   1254  1.1  christos 	      if (bed->elf_backend_get_target_dtag)
   1255  1.1  christos 		name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
   1256  1.1  christos 
   1257  1.1  christos 	      if (!strcmp (name, ""))
   1258  1.1  christos 		{
   1259  1.1  christos 		  sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag);
   1260  1.1  christos 		  name = ab;
   1261  1.1  christos 		}
   1262  1.1  christos 	      break;
   1263  1.1  christos 
   1264  1.1  christos 	    case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
   1265  1.1  christos 	    case DT_PLTRELSZ: name = "PLTRELSZ"; break;
   1266  1.1  christos 	    case DT_PLTGOT: name = "PLTGOT"; break;
   1267  1.1  christos 	    case DT_HASH: name = "HASH"; break;
   1268  1.1  christos 	    case DT_STRTAB: name = "STRTAB"; break;
   1269  1.1  christos 	    case DT_SYMTAB: name = "SYMTAB"; break;
   1270  1.1  christos 	    case DT_RELA: name = "RELA"; break;
   1271  1.1  christos 	    case DT_RELASZ: name = "RELASZ"; break;
   1272  1.1  christos 	    case DT_RELAENT: name = "RELAENT"; break;
   1273  1.1  christos 	    case DT_STRSZ: name = "STRSZ"; break;
   1274  1.1  christos 	    case DT_SYMENT: name = "SYMENT"; break;
   1275  1.1  christos 	    case DT_INIT: name = "INIT"; break;
   1276  1.1  christos 	    case DT_FINI: name = "FINI"; break;
   1277  1.1  christos 	    case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
   1278  1.1  christos 	    case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
   1279  1.1  christos 	    case DT_SYMBOLIC: name = "SYMBOLIC"; break;
   1280  1.1  christos 	    case DT_REL: name = "REL"; break;
   1281  1.1  christos 	    case DT_RELSZ: name = "RELSZ"; break;
   1282  1.1  christos 	    case DT_RELENT: name = "RELENT"; break;
   1283  1.1  christos 	    case DT_PLTREL: name = "PLTREL"; break;
   1284  1.1  christos 	    case DT_DEBUG: name = "DEBUG"; break;
   1285  1.1  christos 	    case DT_TEXTREL: name = "TEXTREL"; break;
   1286  1.1  christos 	    case DT_JMPREL: name = "JMPREL"; break;
   1287  1.1  christos 	    case DT_BIND_NOW: name = "BIND_NOW"; break;
   1288  1.1  christos 	    case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
   1289  1.1  christos 	    case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
   1290  1.1  christos 	    case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
   1291  1.1  christos 	    case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
   1292  1.1  christos 	    case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
   1293  1.1  christos 	    case DT_FLAGS: name = "FLAGS"; break;
   1294  1.1  christos 	    case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
   1295  1.1  christos 	    case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
   1296  1.1  christos 	    case DT_CHECKSUM: name = "CHECKSUM"; break;
   1297  1.1  christos 	    case DT_PLTPADSZ: name = "PLTPADSZ"; break;
   1298  1.1  christos 	    case DT_MOVEENT: name = "MOVEENT"; break;
   1299  1.1  christos 	    case DT_MOVESZ: name = "MOVESZ"; break;
   1300  1.1  christos 	    case DT_FEATURE: name = "FEATURE"; break;
   1301  1.1  christos 	    case DT_POSFLAG_1: name = "POSFLAG_1"; break;
   1302  1.1  christos 	    case DT_SYMINSZ: name = "SYMINSZ"; break;
   1303  1.1  christos 	    case DT_SYMINENT: name = "SYMINENT"; break;
   1304  1.1  christos 	    case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
   1305  1.1  christos 	    case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
   1306  1.1  christos 	    case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
   1307  1.1  christos 	    case DT_PLTPAD: name = "PLTPAD"; break;
   1308  1.1  christos 	    case DT_MOVETAB: name = "MOVETAB"; break;
   1309  1.1  christos 	    case DT_SYMINFO: name = "SYMINFO"; break;
   1310  1.1  christos 	    case DT_RELACOUNT: name = "RELACOUNT"; break;
   1311  1.1  christos 	    case DT_RELCOUNT: name = "RELCOUNT"; break;
   1312  1.1  christos 	    case DT_FLAGS_1: name = "FLAGS_1"; break;
   1313  1.1  christos 	    case DT_VERSYM: name = "VERSYM"; break;
   1314  1.1  christos 	    case DT_VERDEF: name = "VERDEF"; break;
   1315  1.1  christos 	    case DT_VERDEFNUM: name = "VERDEFNUM"; break;
   1316  1.1  christos 	    case DT_VERNEED: name = "VERNEED"; break;
   1317  1.1  christos 	    case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
   1318  1.1  christos 	    case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
   1319  1.1  christos 	    case DT_USED: name = "USED"; break;
   1320  1.1  christos 	    case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
   1321  1.1  christos 	    case DT_GNU_HASH: name = "GNU_HASH"; break;
   1322  1.1  christos 	    }
   1323  1.1  christos 
   1324  1.1  christos 	  fprintf (f, "  %-20s ", name);
   1325  1.1  christos 	  if (! stringp)
   1326  1.1  christos 	    {
   1327  1.1  christos 	      fprintf (f, "0x");
   1328  1.1  christos 	      bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
   1329  1.1  christos 	    }
   1330  1.1  christos 	  else
   1331  1.1  christos 	    {
   1332  1.1  christos 	      const char *string;
   1333  1.1  christos 	      unsigned int tagv = dyn.d_un.d_val;
   1334  1.1  christos 
   1335  1.1  christos 	      string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
   1336  1.1  christos 	      if (string == NULL)
   1337  1.1  christos 		goto error_return;
   1338  1.1  christos 	      fprintf (f, "%s", string);
   1339  1.1  christos 	    }
   1340  1.1  christos 	  fprintf (f, "\n");
   1341  1.1  christos 	}
   1342  1.1  christos 
   1343  1.1  christos       free (dynbuf);
   1344  1.1  christos       dynbuf = NULL;
   1345  1.1  christos     }
   1346  1.1  christos 
   1347  1.1  christos   if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
   1348  1.1  christos       || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
   1349  1.1  christos     {
   1350  1.1  christos       if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
   1351  1.1  christos 	return FALSE;
   1352  1.1  christos     }
   1353  1.1  christos 
   1354  1.1  christos   if (elf_dynverdef (abfd) != 0)
   1355  1.1  christos     {
   1356  1.1  christos       Elf_Internal_Verdef *t;
   1357  1.1  christos 
   1358  1.1  christos       fprintf (f, _("\nVersion definitions:\n"));
   1359  1.1  christos       for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
   1360  1.1  christos 	{
   1361  1.1  christos 	  fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
   1362  1.1  christos 		   t->vd_flags, t->vd_hash,
   1363  1.1  christos 		   t->vd_nodename ? t->vd_nodename : "<corrupt>");
   1364  1.1  christos 	  if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
   1365  1.1  christos 	    {
   1366  1.1  christos 	      Elf_Internal_Verdaux *a;
   1367  1.1  christos 
   1368  1.1  christos 	      fprintf (f, "\t");
   1369  1.1  christos 	      for (a = t->vd_auxptr->vda_nextptr;
   1370  1.1  christos 		   a != NULL;
   1371  1.1  christos 		   a = a->vda_nextptr)
   1372  1.1  christos 		fprintf (f, "%s ",
   1373  1.1  christos 			 a->vda_nodename ? a->vda_nodename : "<corrupt>");
   1374  1.1  christos 	      fprintf (f, "\n");
   1375  1.1  christos 	    }
   1376  1.1  christos 	}
   1377  1.1  christos     }
   1378  1.1  christos 
   1379  1.1  christos   if (elf_dynverref (abfd) != 0)
   1380  1.1  christos     {
   1381  1.1  christos       Elf_Internal_Verneed *t;
   1382  1.1  christos 
   1383  1.1  christos       fprintf (f, _("\nVersion References:\n"));
   1384  1.1  christos       for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
   1385  1.1  christos 	{
   1386  1.1  christos 	  Elf_Internal_Vernaux *a;
   1387  1.1  christos 
   1388  1.1  christos 	  fprintf (f, _("  required from %s:\n"),
   1389  1.1  christos 		   t->vn_filename ? t->vn_filename : "<corrupt>");
   1390  1.1  christos 	  for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
   1391  1.1  christos 	    fprintf (f, "    0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
   1392  1.1  christos 		     a->vna_flags, a->vna_other,
   1393  1.1  christos 		     a->vna_nodename ? a->vna_nodename : "<corrupt>");
   1394  1.1  christos 	}
   1395  1.1  christos     }
   1396  1.1  christos 
   1397  1.1  christos   return TRUE;
   1398  1.1  christos 
   1399  1.1  christos  error_return:
   1400  1.1  christos   if (dynbuf != NULL)
   1401  1.1  christos     free (dynbuf);
   1402  1.1  christos   return FALSE;
   1403  1.1  christos }
   1404  1.1  christos 
   1405  1.1  christos /* Display ELF-specific fields of a symbol.  */
   1406  1.1  christos 
   1407  1.1  christos void
   1408  1.1  christos bfd_elf_print_symbol (bfd *abfd,
   1409  1.1  christos 		      void *filep,
   1410  1.1  christos 		      asymbol *symbol,
   1411  1.1  christos 		      bfd_print_symbol_type how)
   1412  1.1  christos {
   1413  1.1  christos   FILE *file = (FILE *) filep;
   1414  1.1  christos   switch (how)
   1415  1.1  christos     {
   1416  1.1  christos     case bfd_print_symbol_name:
   1417  1.1  christos       fprintf (file, "%s", symbol->name);
   1418  1.1  christos       break;
   1419  1.1  christos     case bfd_print_symbol_more:
   1420  1.1  christos       fprintf (file, "elf ");
   1421  1.1  christos       bfd_fprintf_vma (abfd, file, symbol->value);
   1422  1.1  christos       fprintf (file, " %lx", (unsigned long) symbol->flags);
   1423  1.1  christos       break;
   1424  1.1  christos     case bfd_print_symbol_all:
   1425  1.1  christos       {
   1426  1.1  christos 	const char *section_name;
   1427  1.1  christos 	const char *name = NULL;
   1428  1.1  christos 	const struct elf_backend_data *bed;
   1429  1.1  christos 	unsigned char st_other;
   1430  1.1  christos 	bfd_vma val;
   1431  1.1  christos 
   1432  1.1  christos 	section_name = symbol->section ? symbol->section->name : "(*none*)";
   1433  1.1  christos 
   1434  1.1  christos 	bed = get_elf_backend_data (abfd);
   1435  1.1  christos 	if (bed->elf_backend_print_symbol_all)
   1436  1.1  christos 	  name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
   1437  1.1  christos 
   1438  1.1  christos 	if (name == NULL)
   1439  1.1  christos 	  {
   1440  1.1  christos 	    name = symbol->name;
   1441  1.1  christos 	    bfd_print_symbol_vandf (abfd, file, symbol);
   1442  1.1  christos 	  }
   1443  1.1  christos 
   1444  1.1  christos 	fprintf (file, " %s\t", section_name);
   1445  1.1  christos 	/* Print the "other" value for a symbol.  For common symbols,
   1446  1.1  christos 	   we've already printed the size; now print the alignment.
   1447  1.1  christos 	   For other symbols, we have no specified alignment, and
   1448  1.1  christos 	   we've printed the address; now print the size.  */
   1449  1.1  christos 	if (symbol->section && bfd_is_com_section (symbol->section))
   1450  1.1  christos 	  val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
   1451  1.1  christos 	else
   1452  1.1  christos 	  val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
   1453  1.1  christos 	bfd_fprintf_vma (abfd, file, val);
   1454  1.1  christos 
   1455  1.1  christos 	/* If we have version information, print it.  */
   1456  1.1  christos 	if (elf_tdata (abfd)->dynversym_section != 0
   1457  1.1  christos 	    && (elf_tdata (abfd)->dynverdef_section != 0
   1458  1.1  christos 		|| elf_tdata (abfd)->dynverref_section != 0))
   1459  1.1  christos 	  {
   1460  1.1  christos 	    unsigned int vernum;
   1461  1.1  christos 	    const char *version_string;
   1462  1.1  christos 
   1463  1.1  christos 	    vernum = ((elf_symbol_type *) symbol)->version & VERSYM_VERSION;
   1464  1.1  christos 
   1465  1.1  christos 	    if (vernum == 0)
   1466  1.1  christos 	      version_string = "";
   1467  1.1  christos 	    else if (vernum == 1)
   1468  1.1  christos 	      version_string = "Base";
   1469  1.1  christos 	    else if (vernum <= elf_tdata (abfd)->cverdefs)
   1470  1.1  christos 	      version_string =
   1471  1.1  christos 		elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
   1472  1.1  christos 	    else
   1473  1.1  christos 	      {
   1474  1.1  christos 		Elf_Internal_Verneed *t;
   1475  1.1  christos 
   1476  1.1  christos 		version_string = "";
   1477  1.1  christos 		for (t = elf_tdata (abfd)->verref;
   1478  1.1  christos 		     t != NULL;
   1479  1.1  christos 		     t = t->vn_nextref)
   1480  1.1  christos 		  {
   1481  1.1  christos 		    Elf_Internal_Vernaux *a;
   1482  1.1  christos 
   1483  1.1  christos 		    for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
   1484  1.1  christos 		      {
   1485  1.1  christos 			if (a->vna_other == vernum)
   1486  1.1  christos 			  {
   1487  1.1  christos 			    version_string = a->vna_nodename;
   1488  1.1  christos 			    break;
   1489  1.1  christos 			  }
   1490  1.1  christos 		      }
   1491  1.1  christos 		  }
   1492  1.1  christos 	      }
   1493  1.1  christos 
   1494  1.1  christos 	    if ((((elf_symbol_type *) symbol)->version & VERSYM_HIDDEN) == 0)
   1495  1.1  christos 	      fprintf (file, "  %-11s", version_string);
   1496  1.1  christos 	    else
   1497  1.1  christos 	      {
   1498  1.1  christos 		int i;
   1499  1.1  christos 
   1500  1.1  christos 		fprintf (file, " (%s)", version_string);
   1501  1.1  christos 		for (i = 10 - strlen (version_string); i > 0; --i)
   1502  1.1  christos 		  putc (' ', file);
   1503  1.1  christos 	      }
   1504  1.1  christos 	  }
   1505  1.1  christos 
   1506  1.1  christos 	/* If the st_other field is not zero, print it.  */
   1507  1.1  christos 	st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
   1508  1.1  christos 
   1509  1.1  christos 	switch (st_other)
   1510  1.1  christos 	  {
   1511  1.1  christos 	  case 0: break;
   1512  1.1  christos 	  case STV_INTERNAL:  fprintf (file, " .internal");  break;
   1513  1.1  christos 	  case STV_HIDDEN:    fprintf (file, " .hidden");    break;
   1514  1.1  christos 	  case STV_PROTECTED: fprintf (file, " .protected"); break;
   1515  1.1  christos 	  default:
   1516  1.1  christos 	    /* Some other non-defined flags are also present, so print
   1517  1.1  christos 	       everything hex.  */
   1518  1.1  christos 	    fprintf (file, " 0x%02x", (unsigned int) st_other);
   1519  1.1  christos 	  }
   1520  1.1  christos 
   1521  1.1  christos 	fprintf (file, " %s", name);
   1522  1.1  christos       }
   1523  1.1  christos       break;
   1524  1.1  christos     }
   1525  1.1  christos }
   1526  1.1  christos 
   1527  1.1  christos /* Allocate an ELF string table--force the first byte to be zero.  */
   1528  1.1  christos 
   1529  1.1  christos struct bfd_strtab_hash *
   1530  1.1  christos _bfd_elf_stringtab_init (void)
   1531  1.1  christos {
   1532  1.1  christos   struct bfd_strtab_hash *ret;
   1533  1.1  christos 
   1534  1.1  christos   ret = _bfd_stringtab_init ();
   1535  1.1  christos   if (ret != NULL)
   1536  1.1  christos     {
   1537  1.1  christos       bfd_size_type loc;
   1538  1.1  christos 
   1539  1.1  christos       loc = _bfd_stringtab_add (ret, "", TRUE, FALSE);
   1540  1.1  christos       BFD_ASSERT (loc == 0 || loc == (bfd_size_type) -1);
   1541  1.1  christos       if (loc == (bfd_size_type) -1)
   1542  1.1  christos 	{
   1543  1.1  christos 	  _bfd_stringtab_free (ret);
   1544  1.1  christos 	  ret = NULL;
   1545  1.1  christos 	}
   1546  1.1  christos     }
   1547  1.1  christos   return ret;
   1548  1.1  christos }
   1549  1.1  christos 
   1550  1.1  christos /* ELF .o/exec file reading */
   1552  1.1  christos 
   1553  1.1  christos /* Create a new bfd section from an ELF section header.  */
   1554  1.1  christos 
   1555  1.1  christos bfd_boolean
   1556  1.1  christos bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
   1557  1.1  christos {
   1558  1.1  christos   Elf_Internal_Shdr *hdr;
   1559  1.1  christos   Elf_Internal_Ehdr *ehdr;
   1560  1.1  christos   const struct elf_backend_data *bed;
   1561  1.1  christos   const char *name;
   1562  1.1  christos 
   1563  1.1  christos   if (shindex >= elf_numsections (abfd))
   1564  1.1  christos     return FALSE;
   1565  1.1  christos 
   1566  1.1  christos   hdr = elf_elfsections (abfd)[shindex];
   1567  1.1  christos   ehdr = elf_elfheader (abfd);
   1568  1.1  christos   name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
   1569  1.1  christos 					  hdr->sh_name);
   1570  1.1  christos   if (name == NULL)
   1571  1.1  christos     return FALSE;
   1572  1.1  christos 
   1573  1.1  christos   bed = get_elf_backend_data (abfd);
   1574  1.1  christos   switch (hdr->sh_type)
   1575  1.1  christos     {
   1576  1.1  christos     case SHT_NULL:
   1577  1.1  christos       /* Inactive section. Throw it away.  */
   1578  1.1  christos       return TRUE;
   1579  1.1  christos 
   1580  1.1  christos     case SHT_PROGBITS:	/* Normal section with contents.  */
   1581  1.1  christos     case SHT_NOBITS:	/* .bss section.  */
   1582  1.1  christos     case SHT_HASH:	/* .hash section.  */
   1583  1.1  christos     case SHT_NOTE:	/* .note section.  */
   1584  1.1  christos     case SHT_INIT_ARRAY:	/* .init_array section.  */
   1585  1.1  christos     case SHT_FINI_ARRAY:	/* .fini_array section.  */
   1586  1.1  christos     case SHT_PREINIT_ARRAY:	/* .preinit_array section.  */
   1587  1.1  christos     case SHT_GNU_LIBLIST:	/* .gnu.liblist section.  */
   1588  1.1  christos     case SHT_GNU_HASH:		/* .gnu.hash section.  */
   1589  1.1  christos       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1590  1.1  christos 
   1591  1.1  christos     case SHT_DYNAMIC:	/* Dynamic linking information.  */
   1592  1.1  christos       if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   1593  1.1  christos 	return FALSE;
   1594  1.1  christos       if (hdr->sh_link > elf_numsections (abfd))
   1595  1.1  christos 	{
   1596  1.1  christos 	  /* PR 10478: Accept Solaris binaries with a sh_link
   1597  1.1  christos 	     field set to SHN_BEFORE or SHN_AFTER.  */
   1598  1.1  christos 	  switch (bfd_get_arch (abfd))
   1599  1.1  christos 	    {
   1600  1.1  christos 	    case bfd_arch_i386:
   1601  1.1  christos 	    case bfd_arch_sparc:
   1602  1.1  christos 	      if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
   1603  1.1  christos 		  || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
   1604  1.1  christos 		break;
   1605  1.1  christos 	      /* Otherwise fall through.  */
   1606  1.1  christos 	    default:
   1607  1.1  christos 	      return FALSE;
   1608  1.1  christos 	    }
   1609  1.1  christos 	}
   1610  1.1  christos       else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
   1611  1.1  christos 	return FALSE;
   1612  1.1  christos       else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
   1613  1.1  christos 	{
   1614  1.1  christos 	  Elf_Internal_Shdr *dynsymhdr;
   1615  1.1  christos 
   1616  1.1  christos 	  /* The shared libraries distributed with hpux11 have a bogus
   1617  1.1  christos 	     sh_link field for the ".dynamic" section.  Find the
   1618  1.1  christos 	     string table for the ".dynsym" section instead.  */
   1619  1.1  christos 	  if (elf_dynsymtab (abfd) != 0)
   1620  1.1  christos 	    {
   1621  1.1  christos 	      dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
   1622  1.1  christos 	      hdr->sh_link = dynsymhdr->sh_link;
   1623  1.1  christos 	    }
   1624  1.1  christos 	  else
   1625  1.1  christos 	    {
   1626  1.1  christos 	      unsigned int i, num_sec;
   1627  1.1  christos 
   1628  1.1  christos 	      num_sec = elf_numsections (abfd);
   1629  1.1  christos 	      for (i = 1; i < num_sec; i++)
   1630  1.1  christos 		{
   1631  1.1  christos 		  dynsymhdr = elf_elfsections (abfd)[i];
   1632  1.1  christos 		  if (dynsymhdr->sh_type == SHT_DYNSYM)
   1633  1.1  christos 		    {
   1634  1.1  christos 		      hdr->sh_link = dynsymhdr->sh_link;
   1635  1.1  christos 		      break;
   1636  1.1  christos 		    }
   1637  1.1  christos 		}
   1638  1.1  christos 	    }
   1639  1.1  christos 	}
   1640  1.1  christos       break;
   1641  1.1  christos 
   1642  1.1  christos     case SHT_SYMTAB:		/* A symbol table */
   1643  1.1  christos       if (elf_onesymtab (abfd) == shindex)
   1644  1.1  christos 	return TRUE;
   1645  1.1  christos 
   1646  1.1  christos       if (hdr->sh_entsize != bed->s->sizeof_sym)
   1647  1.1  christos 	return FALSE;
   1648  1.1  christos       if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
   1649  1.1  christos 	return FALSE;
   1650  1.1  christos       BFD_ASSERT (elf_onesymtab (abfd) == 0);
   1651  1.1  christos       elf_onesymtab (abfd) = shindex;
   1652  1.1  christos       elf_tdata (abfd)->symtab_hdr = *hdr;
   1653  1.1  christos       elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->symtab_hdr;
   1654  1.1  christos       abfd->flags |= HAS_SYMS;
   1655  1.1  christos 
   1656  1.1  christos       /* Sometimes a shared object will map in the symbol table.  If
   1657  1.1  christos 	 SHF_ALLOC is set, and this is a shared object, then we also
   1658  1.1  christos 	 treat this section as a BFD section.  We can not base the
   1659  1.1  christos 	 decision purely on SHF_ALLOC, because that flag is sometimes
   1660  1.1  christos 	 set in a relocatable object file, which would confuse the
   1661  1.1  christos 	 linker.  */
   1662  1.1  christos       if ((hdr->sh_flags & SHF_ALLOC) != 0
   1663  1.1  christos 	  && (abfd->flags & DYNAMIC) != 0
   1664  1.1  christos 	  && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
   1665  1.1  christos 						shindex))
   1666  1.1  christos 	return FALSE;
   1667  1.1  christos 
   1668  1.1  christos       /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
   1669  1.1  christos 	 can't read symbols without that section loaded as well.  It
   1670  1.1  christos 	 is most likely specified by the next section header.  */
   1671  1.1  christos       if (elf_elfsections (abfd)[elf_symtab_shndx (abfd)]->sh_link != shindex)
   1672  1.1  christos 	{
   1673  1.1  christos 	  unsigned int i, num_sec;
   1674  1.1  christos 
   1675  1.1  christos 	  num_sec = elf_numsections (abfd);
   1676  1.1  christos 	  for (i = shindex + 1; i < num_sec; i++)
   1677  1.1  christos 	    {
   1678  1.1  christos 	      Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
   1679  1.1  christos 	      if (hdr2->sh_type == SHT_SYMTAB_SHNDX
   1680  1.1  christos 		  && hdr2->sh_link == shindex)
   1681  1.1  christos 		break;
   1682  1.1  christos 	    }
   1683  1.1  christos 	  if (i == num_sec)
   1684  1.1  christos 	    for (i = 1; i < shindex; i++)
   1685  1.1  christos 	      {
   1686  1.1  christos 		Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
   1687  1.1  christos 		if (hdr2->sh_type == SHT_SYMTAB_SHNDX
   1688  1.1  christos 		    && hdr2->sh_link == shindex)
   1689  1.1  christos 		  break;
   1690  1.1  christos 	      }
   1691  1.1  christos 	  if (i != shindex)
   1692  1.1  christos 	    return bfd_section_from_shdr (abfd, i);
   1693  1.1  christos 	}
   1694  1.1  christos       return TRUE;
   1695  1.1  christos 
   1696  1.1  christos     case SHT_DYNSYM:		/* A dynamic symbol table */
   1697  1.1  christos       if (elf_dynsymtab (abfd) == shindex)
   1698  1.1  christos 	return TRUE;
   1699  1.1  christos 
   1700  1.1  christos       if (hdr->sh_entsize != bed->s->sizeof_sym)
   1701  1.1  christos 	return FALSE;
   1702  1.1  christos       BFD_ASSERT (elf_dynsymtab (abfd) == 0);
   1703  1.1  christos       elf_dynsymtab (abfd) = shindex;
   1704  1.1  christos       elf_tdata (abfd)->dynsymtab_hdr = *hdr;
   1705  1.1  christos       elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
   1706  1.1  christos       abfd->flags |= HAS_SYMS;
   1707  1.1  christos 
   1708  1.1  christos       /* Besides being a symbol table, we also treat this as a regular
   1709  1.1  christos 	 section, so that objcopy can handle it.  */
   1710  1.1  christos       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1711  1.1  christos 
   1712  1.1  christos     case SHT_SYMTAB_SHNDX:	/* Symbol section indices when >64k sections */
   1713  1.1  christos       if (elf_symtab_shndx (abfd) == shindex)
   1714  1.1  christos 	return TRUE;
   1715  1.1  christos 
   1716  1.1  christos       BFD_ASSERT (elf_symtab_shndx (abfd) == 0);
   1717  1.1  christos       elf_symtab_shndx (abfd) = shindex;
   1718  1.1  christos       elf_tdata (abfd)->symtab_shndx_hdr = *hdr;
   1719  1.1  christos       elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->symtab_shndx_hdr;
   1720  1.1  christos       return TRUE;
   1721  1.1  christos 
   1722  1.1  christos     case SHT_STRTAB:		/* A string table */
   1723  1.1  christos       if (hdr->bfd_section != NULL)
   1724  1.1  christos 	return TRUE;
   1725  1.1  christos       if (ehdr->e_shstrndx == shindex)
   1726  1.1  christos 	{
   1727  1.1  christos 	  elf_tdata (abfd)->shstrtab_hdr = *hdr;
   1728  1.1  christos 	  elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
   1729  1.1  christos 	  return TRUE;
   1730  1.1  christos 	}
   1731  1.1  christos       if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
   1732  1.1  christos 	{
   1733  1.1  christos 	symtab_strtab:
   1734  1.1  christos 	  elf_tdata (abfd)->strtab_hdr = *hdr;
   1735  1.1  christos 	  elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
   1736  1.1  christos 	  return TRUE;
   1737  1.1  christos 	}
   1738  1.1  christos       if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
   1739  1.1  christos 	{
   1740  1.1  christos 	dynsymtab_strtab:
   1741  1.1  christos 	  elf_tdata (abfd)->dynstrtab_hdr = *hdr;
   1742  1.1  christos 	  hdr = &elf_tdata (abfd)->dynstrtab_hdr;
   1743  1.1  christos 	  elf_elfsections (abfd)[shindex] = hdr;
   1744  1.1  christos 	  /* We also treat this as a regular section, so that objcopy
   1745  1.1  christos 	     can handle it.  */
   1746  1.1  christos 	  return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
   1747  1.1  christos 						  shindex);
   1748  1.1  christos 	}
   1749  1.1  christos 
   1750  1.1  christos       /* If the string table isn't one of the above, then treat it as a
   1751  1.1  christos 	 regular section.  We need to scan all the headers to be sure,
   1752  1.1  christos 	 just in case this strtab section appeared before the above.  */
   1753  1.1  christos       if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
   1754  1.1  christos 	{
   1755  1.1  christos 	  unsigned int i, num_sec;
   1756  1.1  christos 
   1757  1.1  christos 	  num_sec = elf_numsections (abfd);
   1758  1.1  christos 	  for (i = 1; i < num_sec; i++)
   1759  1.1  christos 	    {
   1760  1.1  christos 	      Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
   1761  1.1  christos 	      if (hdr2->sh_link == shindex)
   1762  1.1  christos 		{
   1763  1.1  christos 		  /* Prevent endless recursion on broken objects.  */
   1764  1.1  christos 		  if (i == shindex)
   1765  1.1  christos 		    return FALSE;
   1766  1.1  christos 		  if (! bfd_section_from_shdr (abfd, i))
   1767  1.1  christos 		    return FALSE;
   1768  1.1  christos 		  if (elf_onesymtab (abfd) == i)
   1769  1.1  christos 		    goto symtab_strtab;
   1770  1.1  christos 		  if (elf_dynsymtab (abfd) == i)
   1771  1.1  christos 		    goto dynsymtab_strtab;
   1772  1.1  christos 		}
   1773  1.1  christos 	    }
   1774  1.1  christos 	}
   1775  1.1  christos       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1776  1.1  christos 
   1777  1.1  christos     case SHT_REL:
   1778  1.1  christos     case SHT_RELA:
   1779  1.1  christos       /* *These* do a lot of work -- but build no sections!  */
   1780  1.1  christos       {
   1781  1.1  christos 	asection *target_sect;
   1782  1.1  christos 	Elf_Internal_Shdr *hdr2, **p_hdr;
   1783  1.1  christos 	unsigned int num_sec = elf_numsections (abfd);
   1784  1.1  christos 	struct bfd_elf_section_data *esdt;
   1785  1.1  christos 	bfd_size_type amt;
   1786  1.1  christos 
   1787  1.1  christos 	if (hdr->sh_entsize
   1788  1.1  christos 	    != (bfd_size_type) (hdr->sh_type == SHT_REL
   1789  1.1  christos 				? bed->s->sizeof_rel : bed->s->sizeof_rela))
   1790  1.1  christos 	  return FALSE;
   1791  1.1  christos 
   1792  1.1  christos 	/* Check for a bogus link to avoid crashing.  */
   1793  1.1  christos 	if (hdr->sh_link >= num_sec)
   1794  1.1  christos 	  {
   1795  1.1  christos 	    ((*_bfd_error_handler)
   1796  1.1  christos 	     (_("%B: invalid link %lu for reloc section %s (index %u)"),
   1797  1.1  christos 	      abfd, hdr->sh_link, name, shindex));
   1798  1.1  christos 	    return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
   1799  1.1  christos 						    shindex);
   1800  1.1  christos 	  }
   1801  1.1  christos 
   1802  1.1  christos 	/* For some incomprehensible reason Oracle distributes
   1803  1.1  christos 	   libraries for Solaris in which some of the objects have
   1804  1.1  christos 	   bogus sh_link fields.  It would be nice if we could just
   1805  1.1  christos 	   reject them, but, unfortunately, some people need to use
   1806  1.1  christos 	   them.  We scan through the section headers; if we find only
   1807  1.1  christos 	   one suitable symbol table, we clobber the sh_link to point
   1808  1.1  christos 	   to it.  I hope this doesn't break anything.
   1809  1.1  christos 
   1810  1.1  christos 	   Don't do it on executable nor shared library.  */
   1811  1.1  christos 	if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
   1812  1.1  christos 	    && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
   1813  1.1  christos 	    && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
   1814  1.1  christos 	  {
   1815  1.1  christos 	    unsigned int scan;
   1816  1.1  christos 	    int found;
   1817  1.1  christos 
   1818  1.1  christos 	    found = 0;
   1819  1.1  christos 	    for (scan = 1; scan < num_sec; scan++)
   1820  1.1  christos 	      {
   1821  1.1  christos 		if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
   1822  1.1  christos 		    || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
   1823  1.1  christos 		  {
   1824  1.1  christos 		    if (found != 0)
   1825  1.1  christos 		      {
   1826  1.1  christos 			found = 0;
   1827  1.1  christos 			break;
   1828  1.1  christos 		      }
   1829  1.1  christos 		    found = scan;
   1830  1.1  christos 		  }
   1831  1.1  christos 	      }
   1832  1.1  christos 	    if (found != 0)
   1833  1.1  christos 	      hdr->sh_link = found;
   1834  1.1  christos 	  }
   1835  1.1  christos 
   1836  1.1  christos 	/* Get the symbol table.  */
   1837  1.1  christos 	if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
   1838  1.1  christos 	     || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
   1839  1.1  christos 	    && ! bfd_section_from_shdr (abfd, hdr->sh_link))
   1840  1.1  christos 	  return FALSE;
   1841  1.1  christos 
   1842  1.1  christos 	/* If this reloc section does not use the main symbol table we
   1843  1.1  christos 	   don't treat it as a reloc section.  BFD can't adequately
   1844  1.1  christos 	   represent such a section, so at least for now, we don't
   1845  1.1  christos 	   try.  We just present it as a normal section.  We also
   1846  1.1  christos 	   can't use it as a reloc section if it points to the null
   1847  1.1  christos 	   section, an invalid section, another reloc section, or its
   1848  1.1  christos 	   sh_link points to the null section.  */
   1849  1.1  christos 	if (hdr->sh_link != elf_onesymtab (abfd)
   1850  1.1  christos 	    || hdr->sh_link == SHN_UNDEF
   1851  1.1  christos 	    || hdr->sh_info == SHN_UNDEF
   1852  1.1  christos 	    || hdr->sh_info >= num_sec
   1853  1.1  christos 	    || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
   1854  1.1  christos 	    || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
   1855  1.1  christos 	  return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
   1856  1.1  christos 						  shindex);
   1857  1.1  christos 
   1858  1.1  christos 	if (! bfd_section_from_shdr (abfd, hdr->sh_info))
   1859  1.1  christos 	  return FALSE;
   1860  1.1  christos 	target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
   1861  1.1  christos 	if (target_sect == NULL)
   1862  1.1  christos 	  return FALSE;
   1863  1.1  christos 
   1864  1.1  christos 	esdt = elf_section_data (target_sect);
   1865  1.1  christos 	if (hdr->sh_type == SHT_RELA)
   1866  1.1  christos 	  p_hdr = &esdt->rela.hdr;
   1867  1.1  christos 	else
   1868  1.1  christos 	  p_hdr = &esdt->rel.hdr;
   1869  1.1  christos 
   1870  1.1  christos 	BFD_ASSERT (*p_hdr == NULL);
   1871  1.1  christos 	amt = sizeof (*hdr2);
   1872  1.1  christos 	hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
   1873  1.1  christos 	if (hdr2 == NULL)
   1874  1.1  christos 	  return FALSE;
   1875  1.1  christos 	*hdr2 = *hdr;
   1876  1.1  christos 	*p_hdr = hdr2;
   1877  1.1  christos 	elf_elfsections (abfd)[shindex] = hdr2;
   1878  1.1  christos 	target_sect->reloc_count += NUM_SHDR_ENTRIES (hdr);
   1879  1.1  christos 	target_sect->flags |= SEC_RELOC;
   1880  1.1  christos 	target_sect->relocation = NULL;
   1881  1.1  christos 	target_sect->rel_filepos = hdr->sh_offset;
   1882  1.1  christos 	/* In the section to which the relocations apply, mark whether
   1883  1.1  christos 	   its relocations are of the REL or RELA variety.  */
   1884  1.1  christos 	if (hdr->sh_size != 0)
   1885  1.1  christos 	  {
   1886  1.1  christos 	    if (hdr->sh_type == SHT_RELA)
   1887  1.1  christos 	      target_sect->use_rela_p = 1;
   1888  1.1  christos 	  }
   1889  1.1  christos 	abfd->flags |= HAS_RELOC;
   1890  1.1  christos 	return TRUE;
   1891  1.1  christos       }
   1892  1.1  christos 
   1893  1.1  christos     case SHT_GNU_verdef:
   1894  1.1  christos       elf_dynverdef (abfd) = shindex;
   1895  1.1  christos       elf_tdata (abfd)->dynverdef_hdr = *hdr;
   1896  1.1  christos       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1897  1.1  christos 
   1898  1.1  christos     case SHT_GNU_versym:
   1899  1.1  christos       if (hdr->sh_entsize != sizeof (Elf_External_Versym))
   1900  1.1  christos 	return FALSE;
   1901  1.1  christos       elf_dynversym (abfd) = shindex;
   1902  1.1  christos       elf_tdata (abfd)->dynversym_hdr = *hdr;
   1903  1.1  christos       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1904  1.1  christos 
   1905  1.1  christos     case SHT_GNU_verneed:
   1906  1.1  christos       elf_dynverref (abfd) = shindex;
   1907  1.1  christos       elf_tdata (abfd)->dynverref_hdr = *hdr;
   1908  1.1  christos       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1909  1.1  christos 
   1910  1.1  christos     case SHT_SHLIB:
   1911  1.1  christos       return TRUE;
   1912  1.1  christos 
   1913  1.1  christos     case SHT_GROUP:
   1914  1.1  christos       if (! IS_VALID_GROUP_SECTION_HEADER (hdr))
   1915  1.1  christos 	return FALSE;
   1916  1.1  christos       if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   1917  1.1  christos 	return FALSE;
   1918  1.1  christos       if (hdr->contents != NULL)
   1919  1.1  christos 	{
   1920  1.1  christos 	  Elf_Internal_Group *idx = (Elf_Internal_Group *) hdr->contents;
   1921  1.1  christos 	  unsigned int n_elt = hdr->sh_size / GRP_ENTRY_SIZE;
   1922  1.1  christos 	  asection *s;
   1923  1.1  christos 
   1924  1.1  christos 	  if (idx->flags & GRP_COMDAT)
   1925  1.1  christos 	    hdr->bfd_section->flags
   1926  1.1  christos 	      |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
   1927  1.1  christos 
   1928  1.1  christos 	  /* We try to keep the same section order as it comes in.  */
   1929  1.1  christos 	  idx += n_elt;
   1930  1.1  christos 	  while (--n_elt != 0)
   1931  1.1  christos 	    {
   1932  1.1  christos 	      --idx;
   1933  1.1  christos 
   1934  1.1  christos 	      if (idx->shdr != NULL
   1935  1.1  christos 		  && (s = idx->shdr->bfd_section) != NULL
   1936  1.1  christos 		  && elf_next_in_group (s) != NULL)
   1937  1.1  christos 		{
   1938  1.1  christos 		  elf_next_in_group (hdr->bfd_section) = s;
   1939  1.1  christos 		  break;
   1940  1.1  christos 		}
   1941  1.1  christos 	    }
   1942  1.1  christos 	}
   1943  1.1  christos       break;
   1944  1.1  christos 
   1945  1.1  christos     default:
   1946  1.1  christos       /* Possibly an attributes section.  */
   1947  1.1  christos       if (hdr->sh_type == SHT_GNU_ATTRIBUTES
   1948  1.1  christos 	  || hdr->sh_type == bed->obj_attrs_section_type)
   1949  1.1  christos 	{
   1950  1.1  christos 	  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   1951  1.1  christos 	    return FALSE;
   1952  1.1  christos 	  _bfd_elf_parse_attributes (abfd, hdr);
   1953  1.1  christos 	  return TRUE;
   1954  1.1  christos 	}
   1955  1.1  christos 
   1956  1.1  christos       /* Check for any processor-specific section types.  */
   1957  1.1  christos       if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
   1958  1.1  christos 	return TRUE;
   1959  1.1  christos 
   1960  1.1  christos       if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
   1961  1.1  christos 	{
   1962  1.1  christos 	  if ((hdr->sh_flags & SHF_ALLOC) != 0)
   1963  1.1  christos 	    /* FIXME: How to properly handle allocated section reserved
   1964  1.1  christos 	       for applications?  */
   1965  1.1  christos 	    (*_bfd_error_handler)
   1966  1.1  christos 	      (_("%B: don't know how to handle allocated, application "
   1967  1.1  christos 		 "specific section `%s' [0x%8x]"),
   1968  1.1  christos 	       abfd, name, hdr->sh_type);
   1969  1.1  christos 	  else
   1970  1.1  christos 	    /* Allow sections reserved for applications.  */
   1971  1.1  christos 	    return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
   1972  1.1  christos 						    shindex);
   1973  1.1  christos 	}
   1974  1.1  christos       else if (hdr->sh_type >= SHT_LOPROC
   1975  1.1  christos 	       && hdr->sh_type <= SHT_HIPROC)
   1976  1.1  christos 	/* FIXME: We should handle this section.  */
   1977  1.1  christos 	(*_bfd_error_handler)
   1978  1.1  christos 	  (_("%B: don't know how to handle processor specific section "
   1979  1.1  christos 	     "`%s' [0x%8x]"),
   1980  1.1  christos 	   abfd, name, hdr->sh_type);
   1981  1.1  christos       else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
   1982  1.1  christos 	{
   1983  1.1  christos 	  /* Unrecognised OS-specific sections.  */
   1984  1.1  christos 	  if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
   1985  1.1  christos 	    /* SHF_OS_NONCONFORMING indicates that special knowledge is
   1986  1.1  christos 	       required to correctly process the section and the file should
   1987  1.1  christos 	       be rejected with an error message.  */
   1988  1.1  christos 	    (*_bfd_error_handler)
   1989  1.1  christos 	      (_("%B: don't know how to handle OS specific section "
   1990  1.1  christos 		 "`%s' [0x%8x]"),
   1991  1.1  christos 	       abfd, name, hdr->sh_type);
   1992  1.1  christos 	  else
   1993  1.1  christos 	    /* Otherwise it should be processed.  */
   1994  1.1  christos 	    return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
   1995  1.1  christos 	}
   1996  1.1  christos       else
   1997  1.1  christos 	/* FIXME: We should handle this section.  */
   1998  1.1  christos 	(*_bfd_error_handler)
   1999  1.1  christos 	  (_("%B: don't know how to handle section `%s' [0x%8x]"),
   2000  1.1  christos 	   abfd, name, hdr->sh_type);
   2001  1.1  christos 
   2002  1.1  christos       return FALSE;
   2003  1.1  christos     }
   2004  1.1  christos 
   2005  1.1  christos   return TRUE;
   2006  1.1  christos }
   2007  1.1  christos 
   2008  1.1  christos /* Return the local symbol specified by ABFD, R_SYMNDX.  */
   2009  1.1  christos 
   2010  1.1  christos Elf_Internal_Sym *
   2011  1.1  christos bfd_sym_from_r_symndx (struct sym_cache *cache,
   2012  1.1  christos 		       bfd *abfd,
   2013  1.1  christos 		       unsigned long r_symndx)
   2014  1.1  christos {
   2015  1.1  christos   unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
   2016  1.1  christos 
   2017  1.1  christos   if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
   2018  1.1  christos     {
   2019  1.1  christos       Elf_Internal_Shdr *symtab_hdr;
   2020  1.1  christos       unsigned char esym[sizeof (Elf64_External_Sym)];
   2021  1.1  christos       Elf_External_Sym_Shndx eshndx;
   2022  1.1  christos 
   2023  1.1  christos       symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   2024  1.1  christos       if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
   2025  1.1  christos 				&cache->sym[ent], esym, &eshndx) == NULL)
   2026  1.1  christos 	return NULL;
   2027  1.1  christos 
   2028  1.1  christos       if (cache->abfd != abfd)
   2029  1.1  christos 	{
   2030  1.1  christos 	  memset (cache->indx, -1, sizeof (cache->indx));
   2031  1.1  christos 	  cache->abfd = abfd;
   2032  1.1  christos 	}
   2033  1.1  christos       cache->indx[ent] = r_symndx;
   2034  1.1  christos     }
   2035  1.1  christos 
   2036  1.1  christos   return &cache->sym[ent];
   2037  1.1  christos }
   2038  1.1  christos 
   2039  1.1  christos /* Given an ELF section number, retrieve the corresponding BFD
   2040  1.1  christos    section.  */
   2041  1.1  christos 
   2042  1.1  christos asection *
   2043  1.1  christos bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
   2044  1.1  christos {
   2045  1.1  christos   if (sec_index >= elf_numsections (abfd))
   2046  1.1  christos     return NULL;
   2047  1.1  christos   return elf_elfsections (abfd)[sec_index]->bfd_section;
   2048  1.1  christos }
   2049  1.1  christos 
   2050  1.1  christos static const struct bfd_elf_special_section special_sections_b[] =
   2051  1.1  christos {
   2052  1.1  christos   { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
   2053  1.1  christos   { NULL,                   0,  0, 0,            0 }
   2054  1.1  christos };
   2055  1.1  christos 
   2056  1.1  christos static const struct bfd_elf_special_section special_sections_c[] =
   2057  1.1  christos {
   2058  1.1  christos   { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
   2059  1.1  christos   { NULL,                       0, 0, 0,            0 }
   2060  1.1  christos };
   2061  1.1  christos 
   2062  1.1  christos static const struct bfd_elf_special_section special_sections_d[] =
   2063  1.1  christos {
   2064  1.1  christos   { STRING_COMMA_LEN (".data"),         -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
   2065  1.1  christos   { STRING_COMMA_LEN (".data1"),         0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
   2066  1.1  christos   { STRING_COMMA_LEN (".debug"),         0, SHT_PROGBITS, 0 },
   2067  1.1  christos   { STRING_COMMA_LEN (".debug_line"),    0, SHT_PROGBITS, 0 },
   2068  1.1  christos   { STRING_COMMA_LEN (".debug_info"),    0, SHT_PROGBITS, 0 },
   2069  1.1  christos   { STRING_COMMA_LEN (".debug_abbrev"),  0, SHT_PROGBITS, 0 },
   2070  1.1  christos   { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
   2071  1.1  christos   { STRING_COMMA_LEN (".dynamic"),       0, SHT_DYNAMIC,  SHF_ALLOC },
   2072  1.1  christos   { STRING_COMMA_LEN (".dynstr"),        0, SHT_STRTAB,   SHF_ALLOC },
   2073  1.1  christos   { STRING_COMMA_LEN (".dynsym"),        0, SHT_DYNSYM,   SHF_ALLOC },
   2074  1.1  christos   { NULL,                      0,        0, 0,            0 }
   2075  1.1  christos };
   2076  1.1  christos 
   2077  1.1  christos static const struct bfd_elf_special_section special_sections_f[] =
   2078  1.1  christos {
   2079  1.1  christos   { STRING_COMMA_LEN (".fini"),       0, SHT_PROGBITS,   SHF_ALLOC + SHF_EXECINSTR },
   2080  1.1  christos   { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
   2081  1.1  christos   { NULL,                          0, 0, 0,              0 }
   2082  1.1  christos };
   2083  1.1  christos 
   2084  1.1  christos static const struct bfd_elf_special_section special_sections_g[] =
   2085  1.1  christos {
   2086  1.1  christos   { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS,      SHF_ALLOC + SHF_WRITE },
   2087  1.1  christos   { STRING_COMMA_LEN (".gnu.lto_"),       -1, SHT_PROGBITS,    SHF_EXCLUDE },
   2088  1.1  christos   { STRING_COMMA_LEN (".got"),             0, SHT_PROGBITS,    SHF_ALLOC + SHF_WRITE },
   2089  1.1  christos   { STRING_COMMA_LEN (".gnu.version"),     0, SHT_GNU_versym,  0 },
   2090  1.1  christos   { STRING_COMMA_LEN (".gnu.version_d"),   0, SHT_GNU_verdef,  0 },
   2091  1.1  christos   { STRING_COMMA_LEN (".gnu.version_r"),   0, SHT_GNU_verneed, 0 },
   2092  1.1  christos   { STRING_COMMA_LEN (".gnu.liblist"),     0, SHT_GNU_LIBLIST, SHF_ALLOC },
   2093  1.1  christos   { STRING_COMMA_LEN (".gnu.conflict"),    0, SHT_RELA,        SHF_ALLOC },
   2094  1.1  christos   { STRING_COMMA_LEN (".gnu.hash"),        0, SHT_GNU_HASH,    SHF_ALLOC },
   2095  1.1  christos   { NULL,                        0,        0, 0,               0 }
   2096  1.1  christos };
   2097  1.1  christos 
   2098  1.1  christos static const struct bfd_elf_special_section special_sections_h[] =
   2099  1.1  christos {
   2100  1.1  christos   { STRING_COMMA_LEN (".hash"), 0, SHT_HASH,     SHF_ALLOC },
   2101  1.1  christos   { NULL,                    0, 0, 0,            0 }
   2102  1.1  christos };
   2103  1.1  christos 
   2104  1.1  christos static const struct bfd_elf_special_section special_sections_i[] =
   2105  1.1  christos {
   2106  1.1  christos   { STRING_COMMA_LEN (".init"),       0, SHT_PROGBITS,   SHF_ALLOC + SHF_EXECINSTR },
   2107  1.1  christos   { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
   2108  1.1  christos   { STRING_COMMA_LEN (".interp"),     0, SHT_PROGBITS,   0 },
   2109  1.1  christos   { NULL,                      0,     0, 0,              0 }
   2110  1.1  christos };
   2111  1.1  christos 
   2112  1.1  christos static const struct bfd_elf_special_section special_sections_l[] =
   2113  1.1  christos {
   2114  1.1  christos   { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
   2115  1.1  christos   { NULL,                    0, 0, 0,            0 }
   2116  1.1  christos };
   2117  1.1  christos 
   2118  1.1  christos static const struct bfd_elf_special_section special_sections_n[] =
   2119  1.1  christos {
   2120  1.1  christos   { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
   2121  1.1  christos   { STRING_COMMA_LEN (".note"),          -1, SHT_NOTE,     0 },
   2122  1.1  christos   { NULL,                    0,           0, 0,            0 }
   2123  1.1  christos };
   2124  1.1  christos 
   2125  1.1  christos static const struct bfd_elf_special_section special_sections_p[] =
   2126  1.1  christos {
   2127  1.1  christos   { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
   2128  1.1  christos   { STRING_COMMA_LEN (".plt"),           0, SHT_PROGBITS,      SHF_ALLOC + SHF_EXECINSTR },
   2129  1.1  christos   { NULL,                   0,           0, 0,                 0 }
   2130  1.1  christos };
   2131  1.1  christos 
   2132  1.1  christos static const struct bfd_elf_special_section special_sections_r[] =
   2133  1.1  christos {
   2134  1.1  christos   { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
   2135  1.1  christos   { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
   2136  1.1  christos   { STRING_COMMA_LEN (".rela"),   -1, SHT_RELA,     0 },
   2137  1.1  christos   { STRING_COMMA_LEN (".rel"),    -1, SHT_REL,      0 },
   2138  1.1  christos   { NULL,                   0,     0, 0,            0 }
   2139  1.1  christos };
   2140  1.1  christos 
   2141  1.1  christos static const struct bfd_elf_special_section special_sections_s[] =
   2142  1.1  christos {
   2143  1.1  christos   { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
   2144  1.1  christos   { STRING_COMMA_LEN (".strtab"),   0, SHT_STRTAB, 0 },
   2145  1.1  christos   { STRING_COMMA_LEN (".symtab"),   0, SHT_SYMTAB, 0 },
   2146  1.1  christos   /* See struct bfd_elf_special_section declaration for the semantics of
   2147  1.1  christos      this special case where .prefix_length != strlen (.prefix).  */
   2148  1.1  christos   { ".stabstr",			5,  3, SHT_STRTAB, 0 },
   2149  1.1  christos   { NULL,                       0,  0, 0,          0 }
   2150  1.1  christos };
   2151  1.1  christos 
   2152  1.1  christos static const struct bfd_elf_special_section special_sections_t[] =
   2153  1.1  christos {
   2154  1.1  christos   { STRING_COMMA_LEN (".text"),  -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
   2155  1.1  christos   { STRING_COMMA_LEN (".tbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_TLS },
   2156  1.1  christos   { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
   2157  1.1  christos   { NULL,                     0,  0, 0,            0 }
   2158  1.1  christos };
   2159  1.1  christos 
   2160  1.1  christos static const struct bfd_elf_special_section special_sections_z[] =
   2161  1.1  christos {
   2162  1.1  christos   { STRING_COMMA_LEN (".zdebug_line"),    0, SHT_PROGBITS, 0 },
   2163  1.1  christos   { STRING_COMMA_LEN (".zdebug_info"),    0, SHT_PROGBITS, 0 },
   2164  1.1  christos   { STRING_COMMA_LEN (".zdebug_abbrev"),  0, SHT_PROGBITS, 0 },
   2165  1.1  christos   { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
   2166  1.1  christos   { NULL,                     0,  0, 0,            0 }
   2167  1.1  christos };
   2168  1.1  christos 
   2169  1.1  christos static const struct bfd_elf_special_section *special_sections[] =
   2170  1.1  christos {
   2171  1.1  christos   special_sections_b,		/* 'b' */
   2172  1.1  christos   special_sections_c,		/* 'c' */
   2173  1.1  christos   special_sections_d,		/* 'd' */
   2174  1.1  christos   NULL,				/* 'e' */
   2175  1.1  christos   special_sections_f,		/* 'f' */
   2176  1.1  christos   special_sections_g,		/* 'g' */
   2177  1.1  christos   special_sections_h,		/* 'h' */
   2178  1.1  christos   special_sections_i,		/* 'i' */
   2179  1.1  christos   NULL,				/* 'j' */
   2180  1.1  christos   NULL,				/* 'k' */
   2181  1.1  christos   special_sections_l,		/* 'l' */
   2182  1.1  christos   NULL,				/* 'm' */
   2183  1.1  christos   special_sections_n,		/* 'n' */
   2184  1.1  christos   NULL,				/* 'o' */
   2185  1.1  christos   special_sections_p,		/* 'p' */
   2186  1.1  christos   NULL,				/* 'q' */
   2187  1.1  christos   special_sections_r,		/* 'r' */
   2188  1.1  christos   special_sections_s,		/* 's' */
   2189  1.1  christos   special_sections_t,		/* 't' */
   2190  1.1  christos   NULL,				/* 'u' */
   2191  1.1  christos   NULL,				/* 'v' */
   2192  1.1  christos   NULL,				/* 'w' */
   2193  1.1  christos   NULL,				/* 'x' */
   2194  1.1  christos   NULL,				/* 'y' */
   2195  1.1  christos   special_sections_z		/* 'z' */
   2196  1.1  christos };
   2197  1.1  christos 
   2198  1.1  christos const struct bfd_elf_special_section *
   2199  1.1  christos _bfd_elf_get_special_section (const char *name,
   2200  1.1  christos 			      const struct bfd_elf_special_section *spec,
   2201  1.1  christos 			      unsigned int rela)
   2202  1.1  christos {
   2203  1.1  christos   int i;
   2204  1.1  christos   int len;
   2205  1.1  christos 
   2206  1.1  christos   len = strlen (name);
   2207  1.1  christos 
   2208  1.1  christos   for (i = 0; spec[i].prefix != NULL; i++)
   2209  1.1  christos     {
   2210  1.1  christos       int suffix_len;
   2211  1.1  christos       int prefix_len = spec[i].prefix_length;
   2212  1.1  christos 
   2213  1.1  christos       if (len < prefix_len)
   2214  1.1  christos 	continue;
   2215  1.1  christos       if (memcmp (name, spec[i].prefix, prefix_len) != 0)
   2216  1.1  christos 	continue;
   2217  1.1  christos 
   2218  1.1  christos       suffix_len = spec[i].suffix_length;
   2219  1.1  christos       if (suffix_len <= 0)
   2220  1.1  christos 	{
   2221  1.1  christos 	  if (name[prefix_len] != 0)
   2222  1.1  christos 	    {
   2223  1.1  christos 	      if (suffix_len == 0)
   2224  1.1  christos 		continue;
   2225  1.1  christos 	      if (name[prefix_len] != '.'
   2226  1.1  christos 		  && (suffix_len == -2
   2227  1.1  christos 		      || (rela && spec[i].type == SHT_REL)))
   2228  1.1  christos 		continue;
   2229  1.1  christos 	    }
   2230  1.1  christos 	}
   2231  1.1  christos       else
   2232  1.1  christos 	{
   2233  1.1  christos 	  if (len < prefix_len + suffix_len)
   2234  1.1  christos 	    continue;
   2235  1.1  christos 	  if (memcmp (name + len - suffix_len,
   2236  1.1  christos 		      spec[i].prefix + prefix_len,
   2237  1.1  christos 		      suffix_len) != 0)
   2238  1.1  christos 	    continue;
   2239  1.1  christos 	}
   2240  1.1  christos       return &spec[i];
   2241  1.1  christos     }
   2242  1.1  christos 
   2243  1.1  christos   return NULL;
   2244  1.1  christos }
   2245  1.1  christos 
   2246  1.1  christos const struct bfd_elf_special_section *
   2247  1.1  christos _bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
   2248  1.1  christos {
   2249  1.1  christos   int i;
   2250  1.1  christos   const struct bfd_elf_special_section *spec;
   2251  1.1  christos   const struct elf_backend_data *bed;
   2252  1.1  christos 
   2253  1.1  christos   /* See if this is one of the special sections.  */
   2254  1.1  christos   if (sec->name == NULL)
   2255  1.1  christos     return NULL;
   2256  1.1  christos 
   2257  1.1  christos   bed = get_elf_backend_data (abfd);
   2258  1.1  christos   spec = bed->special_sections;
   2259  1.1  christos   if (spec)
   2260  1.1  christos     {
   2261  1.1  christos       spec = _bfd_elf_get_special_section (sec->name,
   2262  1.1  christos 					   bed->special_sections,
   2263  1.1  christos 					   sec->use_rela_p);
   2264  1.1  christos       if (spec != NULL)
   2265  1.1  christos 	return spec;
   2266  1.1  christos     }
   2267  1.1  christos 
   2268  1.1  christos   if (sec->name[0] != '.')
   2269  1.1  christos     return NULL;
   2270  1.1  christos 
   2271  1.1  christos   i = sec->name[1] - 'b';
   2272  1.1  christos   if (i < 0 || i > 'z' - 'b')
   2273  1.1  christos     return NULL;
   2274  1.1  christos 
   2275  1.1  christos   spec = special_sections[i];
   2276  1.1  christos 
   2277  1.1  christos   if (spec == NULL)
   2278  1.1  christos     return NULL;
   2279  1.1  christos 
   2280  1.1  christos   return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
   2281  1.1  christos }
   2282  1.1  christos 
   2283  1.1  christos bfd_boolean
   2284  1.1  christos _bfd_elf_new_section_hook (bfd *abfd, asection *sec)
   2285  1.1  christos {
   2286  1.1  christos   struct bfd_elf_section_data *sdata;
   2287  1.1  christos   const struct elf_backend_data *bed;
   2288  1.1  christos   const struct bfd_elf_special_section *ssect;
   2289  1.1  christos 
   2290  1.1  christos   sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
   2291  1.1  christos   if (sdata == NULL)
   2292  1.1  christos     {
   2293  1.1  christos       sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
   2294  1.1  christos                                                           sizeof (*sdata));
   2295  1.1  christos       if (sdata == NULL)
   2296  1.1  christos 	return FALSE;
   2297  1.1  christos       sec->used_by_bfd = sdata;
   2298  1.1  christos     }
   2299  1.1  christos 
   2300  1.1  christos   /* Indicate whether or not this section should use RELA relocations.  */
   2301  1.1  christos   bed = get_elf_backend_data (abfd);
   2302  1.1  christos   sec->use_rela_p = bed->default_use_rela_p;
   2303  1.1  christos 
   2304  1.1  christos   /* When we read a file, we don't need to set ELF section type and
   2305  1.1  christos      flags.  They will be overridden in _bfd_elf_make_section_from_shdr
   2306  1.1  christos      anyway.  We will set ELF section type and flags for all linker
   2307  1.1  christos      created sections.  If user specifies BFD section flags, we will
   2308  1.1  christos      set ELF section type and flags based on BFD section flags in
   2309  1.1  christos      elf_fake_sections.  Special handling for .init_array/.fini_array
   2310  1.1  christos      output sections since they may contain .ctors/.dtors input
   2311  1.1  christos      sections.  We don't want _bfd_elf_init_private_section_data to
   2312  1.1  christos      copy ELF section type from .ctors/.dtors input sections.  */
   2313  1.1  christos   if (abfd->direction != read_direction
   2314  1.1  christos       || (sec->flags & SEC_LINKER_CREATED) != 0)
   2315  1.1  christos     {
   2316  1.1  christos       ssect = (*bed->get_sec_type_attr) (abfd, sec);
   2317  1.1  christos       if (ssect != NULL
   2318  1.1  christos 	  && (!sec->flags
   2319  1.1  christos 	      || (sec->flags & SEC_LINKER_CREATED) != 0
   2320  1.1  christos 	      || ssect->type == SHT_INIT_ARRAY
   2321  1.1  christos 	      || ssect->type == SHT_FINI_ARRAY))
   2322  1.1  christos 	{
   2323  1.1  christos 	  elf_section_type (sec) = ssect->type;
   2324  1.1  christos 	  elf_section_flags (sec) = ssect->attr;
   2325  1.1  christos 	}
   2326  1.1  christos     }
   2327  1.1  christos 
   2328  1.1  christos   return _bfd_generic_new_section_hook (abfd, sec);
   2329  1.1  christos }
   2330  1.1  christos 
   2331  1.1  christos /* Create a new bfd section from an ELF program header.
   2332  1.1  christos 
   2333  1.1  christos    Since program segments have no names, we generate a synthetic name
   2334  1.1  christos    of the form segment<NUM>, where NUM is generally the index in the
   2335  1.1  christos    program header table.  For segments that are split (see below) we
   2336  1.1  christos    generate the names segment<NUM>a and segment<NUM>b.
   2337  1.1  christos 
   2338  1.1  christos    Note that some program segments may have a file size that is different than
   2339  1.1  christos    (less than) the memory size.  All this means is that at execution the
   2340  1.1  christos    system must allocate the amount of memory specified by the memory size,
   2341  1.1  christos    but only initialize it with the first "file size" bytes read from the
   2342  1.1  christos    file.  This would occur for example, with program segments consisting
   2343  1.1  christos    of combined data+bss.
   2344  1.1  christos 
   2345  1.1  christos    To handle the above situation, this routine generates TWO bfd sections
   2346  1.1  christos    for the single program segment.  The first has the length specified by
   2347  1.1  christos    the file size of the segment, and the second has the length specified
   2348  1.1  christos    by the difference between the two sizes.  In effect, the segment is split
   2349  1.1  christos    into its initialized and uninitialized parts.
   2350  1.1  christos 
   2351  1.1  christos  */
   2352  1.1  christos 
   2353  1.1  christos bfd_boolean
   2354  1.1  christos _bfd_elf_make_section_from_phdr (bfd *abfd,
   2355  1.1  christos 				 Elf_Internal_Phdr *hdr,
   2356  1.1  christos 				 int hdr_index,
   2357  1.1  christos 				 const char *type_name)
   2358  1.1  christos {
   2359  1.1  christos   asection *newsect;
   2360  1.1  christos   char *name;
   2361  1.1  christos   char namebuf[64];
   2362  1.1  christos   size_t len;
   2363  1.1  christos   int split;
   2364  1.1  christos 
   2365  1.1  christos   split = ((hdr->p_memsz > 0)
   2366  1.1  christos 	    && (hdr->p_filesz > 0)
   2367  1.1  christos 	    && (hdr->p_memsz > hdr->p_filesz));
   2368  1.1  christos 
   2369  1.1  christos   if (hdr->p_filesz > 0)
   2370  1.1  christos     {
   2371  1.1  christos       sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
   2372  1.1  christos       len = strlen (namebuf) + 1;
   2373  1.1  christos       name = (char *) bfd_alloc (abfd, len);
   2374  1.1  christos       if (!name)
   2375  1.1  christos 	return FALSE;
   2376  1.1  christos       memcpy (name, namebuf, len);
   2377  1.1  christos       newsect = bfd_make_section (abfd, name);
   2378  1.1  christos       if (newsect == NULL)
   2379  1.1  christos 	return FALSE;
   2380  1.1  christos       newsect->vma = hdr->p_vaddr;
   2381  1.1  christos       newsect->lma = hdr->p_paddr;
   2382  1.1  christos       newsect->size = hdr->p_filesz;
   2383  1.1  christos       newsect->filepos = hdr->p_offset;
   2384  1.1  christos       newsect->flags |= SEC_HAS_CONTENTS;
   2385  1.1  christos       newsect->alignment_power = bfd_log2 (hdr->p_align);
   2386  1.1  christos       if (hdr->p_type == PT_LOAD)
   2387  1.1  christos 	{
   2388  1.1  christos 	  newsect->flags |= SEC_ALLOC;
   2389  1.1  christos 	  newsect->flags |= SEC_LOAD;
   2390  1.1  christos 	  if (hdr->p_flags & PF_X)
   2391  1.1  christos 	    {
   2392  1.1  christos 	      /* FIXME: all we known is that it has execute PERMISSION,
   2393  1.1  christos 		 may be data.  */
   2394  1.1  christos 	      newsect->flags |= SEC_CODE;
   2395  1.1  christos 	    }
   2396  1.1  christos 	}
   2397  1.1  christos       if (!(hdr->p_flags & PF_W))
   2398  1.1  christos 	{
   2399  1.1  christos 	  newsect->flags |= SEC_READONLY;
   2400  1.1  christos 	}
   2401  1.1  christos     }
   2402  1.1  christos 
   2403  1.1  christos   if (hdr->p_memsz > hdr->p_filesz)
   2404  1.1  christos     {
   2405  1.1  christos       bfd_vma align;
   2406  1.1  christos 
   2407  1.1  christos       sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
   2408  1.1  christos       len = strlen (namebuf) + 1;
   2409  1.1  christos       name = (char *) bfd_alloc (abfd, len);
   2410  1.1  christos       if (!name)
   2411  1.1  christos 	return FALSE;
   2412  1.1  christos       memcpy (name, namebuf, len);
   2413  1.1  christos       newsect = bfd_make_section (abfd, name);
   2414  1.1  christos       if (newsect == NULL)
   2415  1.1  christos 	return FALSE;
   2416  1.1  christos       newsect->vma = hdr->p_vaddr + hdr->p_filesz;
   2417  1.1  christos       newsect->lma = hdr->p_paddr + hdr->p_filesz;
   2418  1.1  christos       newsect->size = hdr->p_memsz - hdr->p_filesz;
   2419  1.1  christos       newsect->filepos = hdr->p_offset + hdr->p_filesz;
   2420  1.1  christos       align = newsect->vma & -newsect->vma;
   2421  1.1  christos       if (align == 0 || align > hdr->p_align)
   2422  1.1  christos 	align = hdr->p_align;
   2423  1.1  christos       newsect->alignment_power = bfd_log2 (align);
   2424  1.1  christos       if (hdr->p_type == PT_LOAD)
   2425  1.1  christos 	{
   2426  1.1  christos 	  /* Hack for gdb.  Segments that have not been modified do
   2427  1.1  christos 	     not have their contents written to a core file, on the
   2428  1.1  christos 	     assumption that a debugger can find the contents in the
   2429  1.1  christos 	     executable.  We flag this case by setting the fake
   2430  1.1  christos 	     section size to zero.  Note that "real" bss sections will
   2431  1.1  christos 	     always have their contents dumped to the core file.  */
   2432  1.1  christos 	  if (bfd_get_format (abfd) == bfd_core)
   2433  1.1  christos 	    newsect->size = 0;
   2434  1.1  christos 	  newsect->flags |= SEC_ALLOC;
   2435  1.1  christos 	  if (hdr->p_flags & PF_X)
   2436  1.1  christos 	    newsect->flags |= SEC_CODE;
   2437  1.1  christos 	}
   2438  1.1  christos       if (!(hdr->p_flags & PF_W))
   2439  1.1  christos 	newsect->flags |= SEC_READONLY;
   2440  1.1  christos     }
   2441  1.1  christos 
   2442  1.1  christos   return TRUE;
   2443  1.1  christos }
   2444  1.1  christos 
   2445  1.1  christos bfd_boolean
   2446  1.1  christos bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
   2447  1.1  christos {
   2448  1.1  christos   const struct elf_backend_data *bed;
   2449  1.1  christos 
   2450  1.1  christos   switch (hdr->p_type)
   2451  1.1  christos     {
   2452  1.1  christos     case PT_NULL:
   2453  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
   2454  1.1  christos 
   2455  1.1  christos     case PT_LOAD:
   2456  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load");
   2457  1.1  christos 
   2458  1.1  christos     case PT_DYNAMIC:
   2459  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
   2460  1.1  christos 
   2461  1.1  christos     case PT_INTERP:
   2462  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
   2463  1.1  christos 
   2464  1.1  christos     case PT_NOTE:
   2465  1.1  christos       if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
   2466  1.1  christos 	return FALSE;
   2467  1.1  christos       if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz))
   2468  1.1  christos 	return FALSE;
   2469  1.1  christos       return TRUE;
   2470  1.1  christos 
   2471  1.1  christos     case PT_SHLIB:
   2472  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
   2473  1.1  christos 
   2474  1.1  christos     case PT_PHDR:
   2475  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
   2476  1.1  christos 
   2477  1.1  christos     case PT_GNU_EH_FRAME:
   2478  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
   2479  1.1  christos 					      "eh_frame_hdr");
   2480  1.1  christos 
   2481  1.1  christos     case PT_GNU_STACK:
   2482  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
   2483  1.1  christos 
   2484  1.1  christos     case PT_GNU_RELRO:
   2485  1.1  christos       return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
   2486  1.1  christos 
   2487  1.1  christos     default:
   2488  1.1  christos       /* Check for any processor-specific program segment types.  */
   2489  1.1  christos       bed = get_elf_backend_data (abfd);
   2490  1.1  christos       return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
   2491  1.1  christos     }
   2492  1.1  christos }
   2493  1.1  christos 
   2494  1.1  christos /* Return the REL_HDR for SEC, assuming there is only a single one, either
   2495  1.1  christos    REL or RELA.  */
   2496  1.1  christos 
   2497  1.1  christos Elf_Internal_Shdr *
   2498  1.1  christos _bfd_elf_single_rel_hdr (asection *sec)
   2499  1.1  christos {
   2500  1.1  christos   if (elf_section_data (sec)->rel.hdr)
   2501  1.1  christos     {
   2502  1.1  christos       BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
   2503  1.1  christos       return elf_section_data (sec)->rel.hdr;
   2504  1.1  christos     }
   2505  1.1  christos   else
   2506  1.1  christos     return elf_section_data (sec)->rela.hdr;
   2507  1.1  christos }
   2508  1.1  christos 
   2509  1.1  christos /* Allocate and initialize a section-header for a new reloc section,
   2510  1.1  christos    containing relocations against ASECT.  It is stored in RELDATA.  If
   2511  1.1  christos    USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
   2512  1.1  christos    relocations.  */
   2513  1.1  christos 
   2514  1.1  christos bfd_boolean
   2515  1.1  christos _bfd_elf_init_reloc_shdr (bfd *abfd,
   2516  1.1  christos 			  struct bfd_elf_section_reloc_data *reldata,
   2517  1.1  christos 			  asection *asect,
   2518  1.1  christos 			  bfd_boolean use_rela_p)
   2519  1.1  christos {
   2520  1.1  christos   Elf_Internal_Shdr *rel_hdr;
   2521  1.1  christos   char *name;
   2522  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   2523  1.1  christos   bfd_size_type amt;
   2524  1.1  christos 
   2525  1.1  christos   amt = sizeof (Elf_Internal_Shdr);
   2526  1.1  christos   BFD_ASSERT (reldata->hdr == NULL);
   2527  1.1  christos   rel_hdr = bfd_zalloc (abfd, amt);
   2528  1.1  christos   reldata->hdr = rel_hdr;
   2529  1.1  christos 
   2530  1.1  christos   amt = sizeof ".rela" + strlen (asect->name);
   2531  1.1  christos   name = (char *) bfd_alloc (abfd, amt);
   2532  1.1  christos   if (name == NULL)
   2533  1.1  christos     return FALSE;
   2534  1.1  christos   sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", asect->name);
   2535  1.1  christos   rel_hdr->sh_name =
   2536  1.1  christos     (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
   2537  1.1  christos 					FALSE);
   2538  1.1  christos   if (rel_hdr->sh_name == (unsigned int) -1)
   2539  1.1  christos     return FALSE;
   2540  1.1  christos   rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
   2541  1.1  christos   rel_hdr->sh_entsize = (use_rela_p
   2542  1.1  christos 			 ? bed->s->sizeof_rela
   2543  1.1  christos 			 : bed->s->sizeof_rel);
   2544  1.1  christos   rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
   2545  1.1  christos   rel_hdr->sh_flags = 0;
   2546  1.1  christos   rel_hdr->sh_addr = 0;
   2547  1.1  christos   rel_hdr->sh_size = 0;
   2548  1.1  christos   rel_hdr->sh_offset = 0;
   2549  1.1  christos 
   2550  1.1  christos   return TRUE;
   2551  1.1  christos }
   2552  1.1  christos 
   2553  1.1  christos /* Return the default section type based on the passed in section flags.  */
   2554  1.1  christos 
   2555  1.1  christos int
   2556  1.1  christos bfd_elf_get_default_section_type (flagword flags)
   2557  1.1  christos {
   2558  1.1  christos   if ((flags & SEC_ALLOC) != 0
   2559  1.1  christos       && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
   2560  1.1  christos     return SHT_NOBITS;
   2561  1.1  christos   return SHT_PROGBITS;
   2562  1.1  christos }
   2563  1.1  christos 
   2564  1.1  christos struct fake_section_arg
   2565  1.1  christos {
   2566  1.1  christos   struct bfd_link_info *link_info;
   2567  1.1  christos   bfd_boolean failed;
   2568  1.1  christos };
   2569  1.1  christos 
   2570  1.1  christos /* Set up an ELF internal section header for a section.  */
   2571  1.1  christos 
   2572  1.1  christos static void
   2573  1.1  christos elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
   2574  1.1  christos {
   2575  1.1  christos   struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
   2576  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   2577  1.1  christos   struct bfd_elf_section_data *esd = elf_section_data (asect);
   2578  1.1  christos   Elf_Internal_Shdr *this_hdr;
   2579  1.1  christos   unsigned int sh_type;
   2580  1.1  christos 
   2581  1.1  christos   if (arg->failed)
   2582  1.1  christos     {
   2583  1.1  christos       /* We already failed; just get out of the bfd_map_over_sections
   2584  1.1  christos 	 loop.  */
   2585  1.1  christos       return;
   2586  1.1  christos     }
   2587  1.1  christos 
   2588  1.1  christos   this_hdr = &esd->this_hdr;
   2589  1.1  christos 
   2590  1.1  christos   this_hdr->sh_name = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
   2591  1.1  christos 							  asect->name, FALSE);
   2592  1.1  christos   if (this_hdr->sh_name == (unsigned int) -1)
   2593  1.1  christos     {
   2594  1.1  christos       arg->failed = TRUE;
   2595  1.1  christos       return;
   2596  1.1  christos     }
   2597  1.1  christos 
   2598  1.1  christos   /* Don't clear sh_flags. Assembler may set additional bits.  */
   2599  1.1  christos 
   2600  1.1  christos   if ((asect->flags & SEC_ALLOC) != 0
   2601  1.1  christos       || asect->user_set_vma)
   2602  1.1  christos     this_hdr->sh_addr = asect->vma;
   2603  1.1  christos   else
   2604  1.1  christos     this_hdr->sh_addr = 0;
   2605  1.1  christos 
   2606  1.1  christos   this_hdr->sh_offset = 0;
   2607  1.1  christos   this_hdr->sh_size = asect->size;
   2608  1.1  christos   this_hdr->sh_link = 0;
   2609  1.1  christos   this_hdr->sh_addralign = (bfd_vma) 1 << asect->alignment_power;
   2610  1.1  christos   /* The sh_entsize and sh_info fields may have been set already by
   2611  1.1  christos      copy_private_section_data.  */
   2612  1.1  christos 
   2613  1.1  christos   this_hdr->bfd_section = asect;
   2614  1.1  christos   this_hdr->contents = NULL;
   2615  1.1  christos 
   2616  1.1  christos   /* If the section type is unspecified, we set it based on
   2617  1.1  christos      asect->flags.  */
   2618  1.1  christos   if ((asect->flags & SEC_GROUP) != 0)
   2619  1.1  christos     sh_type = SHT_GROUP;
   2620  1.1  christos   else
   2621  1.1  christos     sh_type = bfd_elf_get_default_section_type (asect->flags);
   2622  1.1  christos 
   2623  1.1  christos   if (this_hdr->sh_type == SHT_NULL)
   2624  1.1  christos     this_hdr->sh_type = sh_type;
   2625  1.1  christos   else if (this_hdr->sh_type == SHT_NOBITS
   2626  1.1  christos 	   && sh_type == SHT_PROGBITS
   2627  1.1  christos 	   && (asect->flags & SEC_ALLOC) != 0)
   2628  1.1  christos     {
   2629  1.1  christos       /* Warn if we are changing a NOBITS section to PROGBITS, but
   2630  1.1  christos 	 allow the link to proceed.  This can happen when users link
   2631  1.1  christos 	 non-bss input sections to bss output sections, or emit data
   2632  1.1  christos 	 to a bss output section via a linker script.  */
   2633  1.1  christos       (*_bfd_error_handler)
   2634  1.1  christos 	(_("warning: section `%A' type changed to PROGBITS"), asect);
   2635  1.1  christos       this_hdr->sh_type = sh_type;
   2636  1.1  christos     }
   2637  1.1  christos 
   2638  1.1  christos   switch (this_hdr->sh_type)
   2639  1.1  christos     {
   2640  1.1  christos     default:
   2641  1.1  christos       break;
   2642  1.1  christos 
   2643  1.1  christos     case SHT_STRTAB:
   2644  1.1  christos     case SHT_INIT_ARRAY:
   2645  1.1  christos     case SHT_FINI_ARRAY:
   2646  1.1  christos     case SHT_PREINIT_ARRAY:
   2647  1.1  christos     case SHT_NOTE:
   2648  1.1  christos     case SHT_NOBITS:
   2649  1.1  christos     case SHT_PROGBITS:
   2650  1.1  christos       break;
   2651  1.1  christos 
   2652  1.1  christos     case SHT_HASH:
   2653  1.1  christos       this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
   2654  1.1  christos       break;
   2655  1.1  christos 
   2656  1.1  christos     case SHT_DYNSYM:
   2657  1.1  christos       this_hdr->sh_entsize = bed->s->sizeof_sym;
   2658  1.1  christos       break;
   2659  1.1  christos 
   2660  1.1  christos     case SHT_DYNAMIC:
   2661  1.1  christos       this_hdr->sh_entsize = bed->s->sizeof_dyn;
   2662  1.1  christos       break;
   2663  1.1  christos 
   2664  1.1  christos     case SHT_RELA:
   2665  1.1  christos       if (get_elf_backend_data (abfd)->may_use_rela_p)
   2666  1.1  christos 	this_hdr->sh_entsize = bed->s->sizeof_rela;
   2667  1.1  christos       break;
   2668  1.1  christos 
   2669  1.1  christos      case SHT_REL:
   2670  1.1  christos       if (get_elf_backend_data (abfd)->may_use_rel_p)
   2671  1.1  christos 	this_hdr->sh_entsize = bed->s->sizeof_rel;
   2672  1.1  christos       break;
   2673  1.1  christos 
   2674  1.1  christos      case SHT_GNU_versym:
   2675  1.1  christos       this_hdr->sh_entsize = sizeof (Elf_External_Versym);
   2676  1.1  christos       break;
   2677  1.1  christos 
   2678  1.1  christos      case SHT_GNU_verdef:
   2679  1.1  christos       this_hdr->sh_entsize = 0;
   2680  1.1  christos       /* objcopy or strip will copy over sh_info, but may not set
   2681  1.1  christos 	 cverdefs.  The linker will set cverdefs, but sh_info will be
   2682  1.1  christos 	 zero.  */
   2683  1.1  christos       if (this_hdr->sh_info == 0)
   2684  1.1  christos 	this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
   2685  1.1  christos       else
   2686  1.1  christos 	BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
   2687  1.1  christos 		    || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
   2688  1.1  christos       break;
   2689  1.1  christos 
   2690  1.1  christos     case SHT_GNU_verneed:
   2691  1.1  christos       this_hdr->sh_entsize = 0;
   2692  1.1  christos       /* objcopy or strip will copy over sh_info, but may not set
   2693  1.1  christos 	 cverrefs.  The linker will set cverrefs, but sh_info will be
   2694  1.1  christos 	 zero.  */
   2695  1.1  christos       if (this_hdr->sh_info == 0)
   2696  1.1  christos 	this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
   2697  1.1  christos       else
   2698  1.1  christos 	BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
   2699  1.1  christos 		    || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
   2700  1.1  christos       break;
   2701  1.1  christos 
   2702  1.1  christos     case SHT_GROUP:
   2703  1.1  christos       this_hdr->sh_entsize = GRP_ENTRY_SIZE;
   2704  1.1  christos       break;
   2705  1.1  christos 
   2706  1.1  christos     case SHT_GNU_HASH:
   2707  1.1  christos       this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
   2708  1.1  christos       break;
   2709  1.1  christos     }
   2710  1.1  christos 
   2711  1.1  christos   if ((asect->flags & SEC_ALLOC) != 0)
   2712  1.1  christos     this_hdr->sh_flags |= SHF_ALLOC;
   2713  1.1  christos   if ((asect->flags & SEC_READONLY) == 0)
   2714  1.1  christos     this_hdr->sh_flags |= SHF_WRITE;
   2715  1.1  christos   if ((asect->flags & SEC_CODE) != 0)
   2716  1.1  christos     this_hdr->sh_flags |= SHF_EXECINSTR;
   2717  1.1  christos   if ((asect->flags & SEC_MERGE) != 0)
   2718  1.1  christos     {
   2719  1.1  christos       this_hdr->sh_flags |= SHF_MERGE;
   2720  1.1  christos       this_hdr->sh_entsize = asect->entsize;
   2721  1.1  christos       if ((asect->flags & SEC_STRINGS) != 0)
   2722  1.1  christos 	this_hdr->sh_flags |= SHF_STRINGS;
   2723  1.1  christos     }
   2724  1.1  christos   if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
   2725  1.1  christos     this_hdr->sh_flags |= SHF_GROUP;
   2726  1.1  christos   if ((asect->flags & SEC_THREAD_LOCAL) != 0)
   2727  1.1  christos     {
   2728  1.1  christos       this_hdr->sh_flags |= SHF_TLS;
   2729  1.1  christos       if (asect->size == 0
   2730  1.1  christos 	  && (asect->flags & SEC_HAS_CONTENTS) == 0)
   2731  1.1  christos 	{
   2732  1.1  christos 	  struct bfd_link_order *o = asect->map_tail.link_order;
   2733  1.1  christos 
   2734  1.1  christos 	  this_hdr->sh_size = 0;
   2735  1.1  christos 	  if (o != NULL)
   2736  1.1  christos 	    {
   2737  1.1  christos 	      this_hdr->sh_size = o->offset + o->size;
   2738  1.1  christos 	      if (this_hdr->sh_size != 0)
   2739  1.1  christos 		this_hdr->sh_type = SHT_NOBITS;
   2740  1.1  christos 	    }
   2741  1.1  christos 	}
   2742  1.1  christos     }
   2743  1.1  christos   if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
   2744  1.1  christos     this_hdr->sh_flags |= SHF_EXCLUDE;
   2745  1.1  christos 
   2746  1.1  christos   /* If the section has relocs, set up a section header for the
   2747  1.1  christos      SHT_REL[A] section.  If two relocation sections are required for
   2748  1.1  christos      this section, it is up to the processor-specific back-end to
   2749  1.1  christos      create the other.  */
   2750  1.1  christos   if ((asect->flags & SEC_RELOC) != 0)
   2751  1.1  christos     {
   2752  1.1  christos       /* When doing a relocatable link, create both REL and RELA sections if
   2753  1.1  christos 	 needed.  */
   2754  1.1  christos       if (arg->link_info
   2755  1.1  christos 	  /* Do the normal setup if we wouldn't create any sections here.  */
   2756  1.1  christos 	  && esd->rel.count + esd->rela.count > 0
   2757  1.1  christos 	  && (arg->link_info->relocatable || arg->link_info->emitrelocations))
   2758  1.1  christos 	{
   2759  1.1  christos 	  if (esd->rel.count && esd->rel.hdr == NULL
   2760  1.1  christos 	      && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, asect, FALSE))
   2761  1.1  christos 	    {
   2762  1.1  christos 	      arg->failed = TRUE;
   2763  1.1  christos 	      return;
   2764  1.1  christos 	    }
   2765  1.1  christos 	  if (esd->rela.count && esd->rela.hdr == NULL
   2766  1.1  christos 	      && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, asect, TRUE))
   2767  1.1  christos 	    {
   2768  1.1  christos 	      arg->failed = TRUE;
   2769  1.1  christos 	      return;
   2770  1.1  christos 	    }
   2771  1.1  christos 	}
   2772  1.1  christos       else if (!_bfd_elf_init_reloc_shdr (abfd,
   2773  1.1  christos 					  (asect->use_rela_p
   2774  1.1  christos 					   ? &esd->rela : &esd->rel),
   2775  1.1  christos 					  asect,
   2776  1.1  christos 					  asect->use_rela_p))
   2777  1.1  christos 	  arg->failed = TRUE;
   2778  1.1  christos     }
   2779  1.1  christos 
   2780  1.1  christos   /* Check for processor-specific section types.  */
   2781  1.1  christos   sh_type = this_hdr->sh_type;
   2782  1.1  christos   if (bed->elf_backend_fake_sections
   2783  1.1  christos       && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
   2784  1.1  christos     arg->failed = TRUE;
   2785  1.1  christos 
   2786  1.1  christos   if (sh_type == SHT_NOBITS && asect->size != 0)
   2787  1.1  christos     {
   2788  1.1  christos       /* Don't change the header type from NOBITS if we are being
   2789  1.1  christos 	 called for objcopy --only-keep-debug.  */
   2790  1.1  christos       this_hdr->sh_type = sh_type;
   2791  1.1  christos     }
   2792  1.1  christos }
   2793  1.1  christos 
   2794  1.1  christos /* Fill in the contents of a SHT_GROUP section.  Called from
   2795  1.1  christos    _bfd_elf_compute_section_file_positions for gas, objcopy, and
   2796  1.1  christos    when ELF targets use the generic linker, ld.  Called for ld -r
   2797  1.1  christos    from bfd_elf_final_link.  */
   2798  1.1  christos 
   2799  1.1  christos void
   2800  1.1  christos bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
   2801  1.1  christos {
   2802  1.1  christos   bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
   2803  1.1  christos   asection *elt, *first;
   2804  1.1  christos   unsigned char *loc;
   2805  1.1  christos   bfd_boolean gas;
   2806  1.1  christos 
   2807  1.1  christos   /* Ignore linker created group section.  See elfNN_ia64_object_p in
   2808  1.1  christos      elfxx-ia64.c.  */
   2809  1.1  christos   if (((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP)
   2810  1.1  christos       || *failedptr)
   2811  1.1  christos     return;
   2812  1.1  christos 
   2813  1.1  christos   if (elf_section_data (sec)->this_hdr.sh_info == 0)
   2814  1.1  christos     {
   2815  1.1  christos       unsigned long symindx = 0;
   2816  1.1  christos 
   2817  1.1  christos       /* elf_group_id will have been set up by objcopy and the
   2818  1.1  christos 	 generic linker.  */
   2819  1.1  christos       if (elf_group_id (sec) != NULL)
   2820  1.1  christos 	symindx = elf_group_id (sec)->udata.i;
   2821  1.1  christos 
   2822  1.1  christos       if (symindx == 0)
   2823  1.1  christos 	{
   2824  1.1  christos 	  /* If called from the assembler, swap_out_syms will have set up
   2825  1.1  christos 	     elf_section_syms.  */
   2826  1.1  christos 	  BFD_ASSERT (elf_section_syms (abfd) != NULL);
   2827  1.1  christos 	  symindx = elf_section_syms (abfd)[sec->index]->udata.i;
   2828  1.1  christos 	}
   2829  1.1  christos       elf_section_data (sec)->this_hdr.sh_info = symindx;
   2830  1.1  christos     }
   2831  1.1  christos   else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
   2832  1.1  christos     {
   2833  1.1  christos       /* The ELF backend linker sets sh_info to -2 when the group
   2834  1.1  christos 	 signature symbol is global, and thus the index can't be
   2835  1.1  christos 	 set until all local symbols are output.  */
   2836  1.1  christos       asection *igroup = elf_sec_group (elf_next_in_group (sec));
   2837  1.1  christos       struct bfd_elf_section_data *sec_data = elf_section_data (igroup);
   2838  1.1  christos       unsigned long symndx = sec_data->this_hdr.sh_info;
   2839  1.1  christos       unsigned long extsymoff = 0;
   2840  1.1  christos       struct elf_link_hash_entry *h;
   2841  1.1  christos 
   2842  1.1  christos       if (!elf_bad_symtab (igroup->owner))
   2843  1.1  christos 	{
   2844  1.1  christos 	  Elf_Internal_Shdr *symtab_hdr;
   2845  1.1  christos 
   2846  1.1  christos 	  symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
   2847  1.1  christos 	  extsymoff = symtab_hdr->sh_info;
   2848  1.1  christos 	}
   2849  1.1  christos       h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
   2850  1.1  christos       while (h->root.type == bfd_link_hash_indirect
   2851  1.1  christos 	     || h->root.type == bfd_link_hash_warning)
   2852  1.1  christos 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2853  1.1  christos 
   2854  1.1  christos       elf_section_data (sec)->this_hdr.sh_info = h->indx;
   2855  1.1  christos     }
   2856  1.1  christos 
   2857  1.1  christos   /* The contents won't be allocated for "ld -r" or objcopy.  */
   2858  1.1  christos   gas = TRUE;
   2859  1.1  christos   if (sec->contents == NULL)
   2860  1.1  christos     {
   2861  1.1  christos       gas = FALSE;
   2862  1.1  christos       sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
   2863  1.1  christos 
   2864  1.1  christos       /* Arrange for the section to be written out.  */
   2865  1.1  christos       elf_section_data (sec)->this_hdr.contents = sec->contents;
   2866  1.1  christos       if (sec->contents == NULL)
   2867  1.1  christos 	{
   2868  1.1  christos 	  *failedptr = TRUE;
   2869  1.1  christos 	  return;
   2870  1.1  christos 	}
   2871  1.1  christos     }
   2872  1.1  christos 
   2873  1.1  christos   loc = sec->contents + sec->size;
   2874  1.1  christos 
   2875  1.1  christos   /* Get the pointer to the first section in the group that gas
   2876  1.1  christos      squirreled away here.  objcopy arranges for this to be set to the
   2877  1.1  christos      start of the input section group.  */
   2878  1.1  christos   first = elt = elf_next_in_group (sec);
   2879  1.1  christos 
   2880  1.1  christos   /* First element is a flag word.  Rest of section is elf section
   2881  1.1  christos      indices for all the sections of the group.  Write them backwards
   2882  1.1  christos      just to keep the group in the same order as given in .section
   2883  1.1  christos      directives, not that it matters.  */
   2884  1.1  christos   while (elt != NULL)
   2885  1.1  christos     {
   2886  1.1  christos       asection *s;
   2887  1.1  christos 
   2888  1.1  christos       s = elt;
   2889  1.1  christos       if (!gas)
   2890  1.1  christos 	s = s->output_section;
   2891  1.1  christos       if (s != NULL
   2892  1.1  christos 	  && !bfd_is_abs_section (s))
   2893  1.1  christos 	{
   2894  1.1  christos 	  unsigned int idx = elf_section_data (s)->this_idx;
   2895  1.1  christos 
   2896  1.1  christos 	  loc -= 4;
   2897  1.1  christos 	  H_PUT_32 (abfd, idx, loc);
   2898  1.1  christos 	}
   2899  1.1  christos       elt = elf_next_in_group (elt);
   2900  1.1  christos       if (elt == first)
   2901  1.1  christos 	break;
   2902  1.1  christos     }
   2903  1.1  christos 
   2904  1.1  christos   if ((loc -= 4) != sec->contents)
   2905  1.1  christos     abort ();
   2906  1.1  christos 
   2907  1.1  christos   H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
   2908  1.1  christos }
   2909  1.1  christos 
   2910  1.1  christos /* Assign all ELF section numbers.  The dummy first section is handled here
   2911  1.1  christos    too.  The link/info pointers for the standard section types are filled
   2912  1.1  christos    in here too, while we're at it.  */
   2913  1.1  christos 
   2914  1.1  christos static bfd_boolean
   2915  1.1  christos assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
   2916  1.1  christos {
   2917  1.1  christos   struct elf_obj_tdata *t = elf_tdata (abfd);
   2918  1.1  christos   asection *sec;
   2919  1.1  christos   unsigned int section_number, secn;
   2920  1.1  christos   Elf_Internal_Shdr **i_shdrp;
   2921  1.1  christos   struct bfd_elf_section_data *d;
   2922  1.1  christos   bfd_boolean need_symtab;
   2923  1.1  christos 
   2924  1.1  christos   section_number = 1;
   2925  1.1  christos 
   2926  1.1  christos   _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
   2927  1.1  christos 
   2928  1.1  christos   /* SHT_GROUP sections are in relocatable files only.  */
   2929  1.1  christos   if (link_info == NULL || link_info->relocatable)
   2930  1.1  christos     {
   2931  1.1  christos       /* Put SHT_GROUP sections first.  */
   2932  1.1  christos       for (sec = abfd->sections; sec != NULL; sec = sec->next)
   2933  1.1  christos 	{
   2934  1.1  christos 	  d = elf_section_data (sec);
   2935  1.1  christos 
   2936  1.1  christos 	  if (d->this_hdr.sh_type == SHT_GROUP)
   2937  1.1  christos 	    {
   2938  1.1  christos 	      if (sec->flags & SEC_LINKER_CREATED)
   2939  1.1  christos 		{
   2940  1.1  christos 		  /* Remove the linker created SHT_GROUP sections.  */
   2941  1.1  christos 		  bfd_section_list_remove (abfd, sec);
   2942  1.1  christos 		  abfd->section_count--;
   2943  1.1  christos 		}
   2944  1.1  christos 	      else
   2945  1.1  christos 		d->this_idx = section_number++;
   2946  1.1  christos 	    }
   2947  1.1  christos 	}
   2948  1.1  christos     }
   2949  1.1  christos 
   2950  1.1  christos   for (sec = abfd->sections; sec; sec = sec->next)
   2951  1.1  christos     {
   2952  1.1  christos       d = elf_section_data (sec);
   2953  1.1  christos 
   2954  1.1  christos       if (d->this_hdr.sh_type != SHT_GROUP)
   2955  1.1  christos 	d->this_idx = section_number++;
   2956  1.1  christos       _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
   2957  1.1  christos       if (d->rel.hdr)
   2958  1.1  christos 	{
   2959  1.1  christos 	  d->rel.idx = section_number++;
   2960  1.1  christos 	  _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
   2961  1.1  christos 	}
   2962  1.1  christos       else
   2963  1.1  christos 	d->rel.idx = 0;
   2964  1.1  christos 
   2965  1.1  christos       if (d->rela.hdr)
   2966  1.1  christos 	{
   2967  1.1  christos 	  d->rela.idx = section_number++;
   2968  1.1  christos 	  _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
   2969  1.1  christos 	}
   2970  1.1  christos       else
   2971  1.1  christos 	d->rela.idx = 0;
   2972  1.1  christos     }
   2973  1.1  christos 
   2974  1.1  christos   t->shstrtab_section = section_number++;
   2975  1.1  christos   _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
   2976  1.1  christos   elf_elfheader (abfd)->e_shstrndx = t->shstrtab_section;
   2977  1.1  christos 
   2978  1.1  christos   need_symtab = (bfd_get_symcount (abfd) > 0
   2979  1.1  christos 		|| (link_info == NULL
   2980  1.1  christos 		    && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
   2981  1.1  christos 			== HAS_RELOC)));
   2982  1.1  christos   if (need_symtab)
   2983  1.1  christos     {
   2984  1.1  christos       t->symtab_section = section_number++;
   2985  1.1  christos       _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
   2986  1.1  christos       if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
   2987  1.1  christos 	{
   2988  1.1  christos 	  t->symtab_shndx_section = section_number++;
   2989  1.1  christos 	  t->symtab_shndx_hdr.sh_name
   2990  1.1  christos 	    = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
   2991  1.1  christos 						  ".symtab_shndx", FALSE);
   2992  1.1  christos 	  if (t->symtab_shndx_hdr.sh_name == (unsigned int) -1)
   2993  1.1  christos 	    return FALSE;
   2994  1.1  christos 	}
   2995  1.1  christos       t->strtab_section = section_number++;
   2996  1.1  christos       _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
   2997  1.1  christos     }
   2998  1.1  christos 
   2999  1.1  christos   _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
   3000  1.1  christos   t->shstrtab_hdr.sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
   3001  1.1  christos 
   3002  1.1  christos   elf_numsections (abfd) = section_number;
   3003  1.1  christos   elf_elfheader (abfd)->e_shnum = section_number;
   3004  1.1  christos 
   3005  1.1  christos   /* Set up the list of section header pointers, in agreement with the
   3006  1.1  christos      indices.  */
   3007  1.1  christos   i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc2 (abfd, section_number,
   3008  1.1  christos                                                 sizeof (Elf_Internal_Shdr *));
   3009  1.1  christos   if (i_shdrp == NULL)
   3010  1.1  christos     return FALSE;
   3011  1.1  christos 
   3012  1.1  christos   i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
   3013  1.1  christos                                                  sizeof (Elf_Internal_Shdr));
   3014  1.1  christos   if (i_shdrp[0] == NULL)
   3015  1.1  christos     {
   3016  1.1  christos       bfd_release (abfd, i_shdrp);
   3017  1.1  christos       return FALSE;
   3018  1.1  christos     }
   3019  1.1  christos 
   3020  1.1  christos   elf_elfsections (abfd) = i_shdrp;
   3021  1.1  christos 
   3022  1.1  christos   i_shdrp[t->shstrtab_section] = &t->shstrtab_hdr;
   3023  1.1  christos   if (need_symtab)
   3024  1.1  christos     {
   3025  1.1  christos       i_shdrp[t->symtab_section] = &t->symtab_hdr;
   3026  1.1  christos       if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
   3027  1.1  christos 	{
   3028  1.1  christos 	  i_shdrp[t->symtab_shndx_section] = &t->symtab_shndx_hdr;
   3029  1.1  christos 	  t->symtab_shndx_hdr.sh_link = t->symtab_section;
   3030  1.1  christos 	}
   3031  1.1  christos       i_shdrp[t->strtab_section] = &t->strtab_hdr;
   3032  1.1  christos       t->symtab_hdr.sh_link = t->strtab_section;
   3033  1.1  christos     }
   3034  1.1  christos 
   3035  1.1  christos   for (sec = abfd->sections; sec; sec = sec->next)
   3036  1.1  christos     {
   3037  1.1  christos       asection *s;
   3038  1.1  christos       const char *name;
   3039  1.1  christos 
   3040  1.1  christos       d = elf_section_data (sec);
   3041  1.1  christos 
   3042  1.1  christos       i_shdrp[d->this_idx] = &d->this_hdr;
   3043  1.1  christos       if (d->rel.idx != 0)
   3044  1.1  christos 	i_shdrp[d->rel.idx] = d->rel.hdr;
   3045  1.1  christos       if (d->rela.idx != 0)
   3046  1.1  christos 	i_shdrp[d->rela.idx] = d->rela.hdr;
   3047  1.1  christos 
   3048  1.1  christos       /* Fill in the sh_link and sh_info fields while we're at it.  */
   3049  1.1  christos 
   3050  1.1  christos       /* sh_link of a reloc section is the section index of the symbol
   3051  1.1  christos 	 table.  sh_info is the section index of the section to which
   3052  1.1  christos 	 the relocation entries apply.  */
   3053  1.1  christos       if (d->rel.idx != 0)
   3054  1.1  christos 	{
   3055  1.1  christos 	  d->rel.hdr->sh_link = t->symtab_section;
   3056  1.1  christos 	  d->rel.hdr->sh_info = d->this_idx;
   3057  1.1  christos 	}
   3058  1.1  christos       if (d->rela.idx != 0)
   3059  1.1  christos 	{
   3060  1.1  christos 	  d->rela.hdr->sh_link = t->symtab_section;
   3061  1.1  christos 	  d->rela.hdr->sh_info = d->this_idx;
   3062  1.1  christos 	}
   3063  1.1  christos 
   3064  1.1  christos       /* We need to set up sh_link for SHF_LINK_ORDER.  */
   3065  1.1  christos       if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
   3066  1.1  christos 	{
   3067  1.1  christos 	  s = elf_linked_to_section (sec);
   3068  1.1  christos 	  if (s)
   3069  1.1  christos 	    {
   3070  1.1  christos 	      /* elf_linked_to_section points to the input section.  */
   3071  1.1  christos 	      if (link_info != NULL)
   3072  1.1  christos 		{
   3073  1.1  christos 		  /* Check discarded linkonce section.  */
   3074  1.1  christos 		  if (elf_discarded_section (s))
   3075  1.1  christos 		    {
   3076  1.1  christos 		      asection *kept;
   3077  1.1  christos 		      (*_bfd_error_handler)
   3078  1.1  christos 			(_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
   3079  1.1  christos 			 abfd, d->this_hdr.bfd_section,
   3080  1.1  christos 			 s, s->owner);
   3081  1.1  christos 		      /* Point to the kept section if it has the same
   3082  1.1  christos 			 size as the discarded one.  */
   3083  1.1  christos 		      kept = _bfd_elf_check_kept_section (s, link_info);
   3084  1.1  christos 		      if (kept == NULL)
   3085  1.1  christos 			{
   3086  1.1  christos 			  bfd_set_error (bfd_error_bad_value);
   3087  1.1  christos 			  return FALSE;
   3088  1.1  christos 			}
   3089  1.1  christos 		      s = kept;
   3090  1.1  christos 		    }
   3091  1.1  christos 
   3092  1.1  christos 		  s = s->output_section;
   3093  1.1  christos 		  BFD_ASSERT (s != NULL);
   3094  1.1  christos 		}
   3095  1.1  christos 	      else
   3096  1.1  christos 		{
   3097  1.1  christos 		  /* Handle objcopy. */
   3098  1.1  christos 		  if (s->output_section == NULL)
   3099  1.1  christos 		    {
   3100  1.1  christos 		      (*_bfd_error_handler)
   3101  1.1  christos 			(_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
   3102  1.1  christos 			 abfd, d->this_hdr.bfd_section, s, s->owner);
   3103  1.1  christos 		      bfd_set_error (bfd_error_bad_value);
   3104  1.1  christos 		      return FALSE;
   3105  1.1  christos 		    }
   3106  1.1  christos 		  s = s->output_section;
   3107  1.1  christos 		}
   3108  1.1  christos 	      d->this_hdr.sh_link = elf_section_data (s)->this_idx;
   3109  1.1  christos 	    }
   3110  1.1  christos 	  else
   3111  1.1  christos 	    {
   3112  1.1  christos 	      /* PR 290:
   3113  1.1  christos 		 The Intel C compiler generates SHT_IA_64_UNWIND with
   3114  1.1  christos 		 SHF_LINK_ORDER.  But it doesn't set the sh_link or
   3115  1.1  christos 		 sh_info fields.  Hence we could get the situation
   3116  1.1  christos 		 where s is NULL.  */
   3117  1.1  christos 	      const struct elf_backend_data *bed
   3118  1.1  christos 		= get_elf_backend_data (abfd);
   3119  1.1  christos 	      if (bed->link_order_error_handler)
   3120  1.1  christos 		bed->link_order_error_handler
   3121  1.1  christos 		  (_("%B: warning: sh_link not set for section `%A'"),
   3122  1.1  christos 		   abfd, sec);
   3123  1.1  christos 	    }
   3124  1.1  christos 	}
   3125  1.1  christos 
   3126  1.1  christos       switch (d->this_hdr.sh_type)
   3127  1.1  christos 	{
   3128  1.1  christos 	case SHT_REL:
   3129  1.1  christos 	case SHT_RELA:
   3130  1.1  christos 	  /* A reloc section which we are treating as a normal BFD
   3131  1.1  christos 	     section.  sh_link is the section index of the symbol
   3132  1.1  christos 	     table.  sh_info is the section index of the section to
   3133  1.1  christos 	     which the relocation entries apply.  We assume that an
   3134  1.1  christos 	     allocated reloc section uses the dynamic symbol table.
   3135  1.1  christos 	     FIXME: How can we be sure?  */
   3136  1.1  christos 	  s = bfd_get_section_by_name (abfd, ".dynsym");
   3137  1.1  christos 	  if (s != NULL)
   3138  1.1  christos 	    d->this_hdr.sh_link = elf_section_data (s)->this_idx;
   3139  1.1  christos 
   3140  1.1  christos 	  /* We look up the section the relocs apply to by name.  */
   3141  1.1  christos 	  name = sec->name;
   3142  1.1  christos 	  if (d->this_hdr.sh_type == SHT_REL)
   3143  1.1  christos 	    name += 4;
   3144  1.1  christos 	  else
   3145  1.1  christos 	    name += 5;
   3146  1.1  christos 	  s = bfd_get_section_by_name (abfd, name);
   3147  1.1  christos 	  if (s != NULL)
   3148  1.1  christos 	    d->this_hdr.sh_info = elf_section_data (s)->this_idx;
   3149  1.1  christos 	  break;
   3150  1.1  christos 
   3151  1.1  christos 	case SHT_STRTAB:
   3152  1.1  christos 	  /* We assume that a section named .stab*str is a stabs
   3153  1.1  christos 	     string section.  We look for a section with the same name
   3154  1.1  christos 	     but without the trailing ``str'', and set its sh_link
   3155  1.1  christos 	     field to point to this section.  */
   3156  1.1  christos 	  if (CONST_STRNEQ (sec->name, ".stab")
   3157  1.1  christos 	      && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
   3158  1.1  christos 	    {
   3159  1.1  christos 	      size_t len;
   3160  1.1  christos 	      char *alc;
   3161  1.1  christos 
   3162  1.1  christos 	      len = strlen (sec->name);
   3163  1.1  christos 	      alc = (char *) bfd_malloc (len - 2);
   3164  1.1  christos 	      if (alc == NULL)
   3165  1.1  christos 		return FALSE;
   3166  1.1  christos 	      memcpy (alc, sec->name, len - 3);
   3167  1.1  christos 	      alc[len - 3] = '\0';
   3168  1.1  christos 	      s = bfd_get_section_by_name (abfd, alc);
   3169  1.1  christos 	      free (alc);
   3170  1.1  christos 	      if (s != NULL)
   3171  1.1  christos 		{
   3172  1.1  christos 		  elf_section_data (s)->this_hdr.sh_link = d->this_idx;
   3173  1.1  christos 
   3174  1.1  christos 		  /* This is a .stab section.  */
   3175  1.1  christos 		  if (elf_section_data (s)->this_hdr.sh_entsize == 0)
   3176  1.1  christos 		    elf_section_data (s)->this_hdr.sh_entsize
   3177  1.1  christos 		      = 4 + 2 * bfd_get_arch_size (abfd) / 8;
   3178  1.1  christos 		}
   3179  1.1  christos 	    }
   3180  1.1  christos 	  break;
   3181  1.1  christos 
   3182  1.1  christos 	case SHT_DYNAMIC:
   3183  1.1  christos 	case SHT_DYNSYM:
   3184  1.1  christos 	case SHT_GNU_verneed:
   3185  1.1  christos 	case SHT_GNU_verdef:
   3186  1.1  christos 	  /* sh_link is the section header index of the string table
   3187  1.1  christos 	     used for the dynamic entries, or the symbol table, or the
   3188  1.1  christos 	     version strings.  */
   3189  1.1  christos 	  s = bfd_get_section_by_name (abfd, ".dynstr");
   3190  1.1  christos 	  if (s != NULL)
   3191  1.1  christos 	    d->this_hdr.sh_link = elf_section_data (s)->this_idx;
   3192  1.1  christos 	  break;
   3193  1.1  christos 
   3194  1.1  christos 	case SHT_GNU_LIBLIST:
   3195  1.1  christos 	  /* sh_link is the section header index of the prelink library
   3196  1.1  christos 	     list used for the dynamic entries, or the symbol table, or
   3197  1.1  christos 	     the version strings.  */
   3198  1.1  christos 	  s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
   3199  1.1  christos 					     ? ".dynstr" : ".gnu.libstr");
   3200  1.1  christos 	  if (s != NULL)
   3201  1.1  christos 	    d->this_hdr.sh_link = elf_section_data (s)->this_idx;
   3202  1.1  christos 	  break;
   3203  1.1  christos 
   3204  1.1  christos 	case SHT_HASH:
   3205  1.1  christos 	case SHT_GNU_HASH:
   3206  1.1  christos 	case SHT_GNU_versym:
   3207  1.1  christos 	  /* sh_link is the section header index of the symbol table
   3208  1.1  christos 	     this hash table or version table is for.  */
   3209  1.1  christos 	  s = bfd_get_section_by_name (abfd, ".dynsym");
   3210  1.1  christos 	  if (s != NULL)
   3211  1.1  christos 	    d->this_hdr.sh_link = elf_section_data (s)->this_idx;
   3212  1.1  christos 	  break;
   3213  1.1  christos 
   3214  1.1  christos 	case SHT_GROUP:
   3215  1.1  christos 	  d->this_hdr.sh_link = t->symtab_section;
   3216  1.1  christos 	}
   3217  1.1  christos     }
   3218  1.1  christos 
   3219  1.1  christos   for (secn = 1; secn < section_number; ++secn)
   3220  1.1  christos     if (i_shdrp[secn] == NULL)
   3221  1.1  christos       i_shdrp[secn] = i_shdrp[0];
   3222  1.1  christos     else
   3223  1.1  christos       i_shdrp[secn]->sh_name = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
   3224  1.1  christos 						       i_shdrp[secn]->sh_name);
   3225  1.1  christos   return TRUE;
   3226  1.1  christos }
   3227  1.1  christos 
   3228  1.1  christos /* Map symbol from it's internal number to the external number, moving
   3229  1.1  christos    all local symbols to be at the head of the list.  */
   3230  1.1  christos 
   3231  1.1  christos static bfd_boolean
   3232  1.1  christos sym_is_global (bfd *abfd, asymbol *sym)
   3233  1.1  christos {
   3234  1.1  christos   /* If the backend has a special mapping, use it.  */
   3235  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   3236  1.1  christos   if (bed->elf_backend_sym_is_global)
   3237  1.1  christos     return (*bed->elf_backend_sym_is_global) (abfd, sym);
   3238  1.1  christos 
   3239  1.1  christos   return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
   3240  1.1  christos 	  || bfd_is_und_section (bfd_get_section (sym))
   3241  1.1  christos 	  || bfd_is_com_section (bfd_get_section (sym)));
   3242  1.1  christos }
   3243  1.1  christos 
   3244  1.1  christos /* Don't output section symbols for sections that are not going to be
   3245  1.1  christos    output.  */
   3246  1.1  christos 
   3247  1.1  christos static bfd_boolean
   3248  1.1  christos ignore_section_sym (bfd *abfd, asymbol *sym)
   3249  1.1  christos {
   3250  1.1  christos   return ((sym->flags & BSF_SECTION_SYM) != 0
   3251  1.1  christos 	  && !(sym->section->owner == abfd
   3252  1.1  christos 	       || (sym->section->output_section->owner == abfd
   3253  1.1  christos 		   && sym->section->output_offset == 0)));
   3254  1.1  christos }
   3255  1.1  christos 
   3256  1.1  christos static bfd_boolean
   3257  1.1  christos elf_map_symbols (bfd *abfd)
   3258  1.1  christos {
   3259  1.1  christos   unsigned int symcount = bfd_get_symcount (abfd);
   3260  1.1  christos   asymbol **syms = bfd_get_outsymbols (abfd);
   3261  1.1  christos   asymbol **sect_syms;
   3262  1.1  christos   unsigned int num_locals = 0;
   3263  1.1  christos   unsigned int num_globals = 0;
   3264  1.1  christos   unsigned int num_locals2 = 0;
   3265  1.1  christos   unsigned int num_globals2 = 0;
   3266  1.1  christos   int max_index = 0;
   3267  1.1  christos   unsigned int idx;
   3268  1.1  christos   asection *asect;
   3269  1.1  christos   asymbol **new_syms;
   3270  1.1  christos 
   3271  1.1  christos #ifdef DEBUG
   3272  1.1  christos   fprintf (stderr, "elf_map_symbols\n");
   3273  1.1  christos   fflush (stderr);
   3274  1.1  christos #endif
   3275  1.1  christos 
   3276  1.1  christos   for (asect = abfd->sections; asect; asect = asect->next)
   3277  1.1  christos     {
   3278  1.1  christos       if (max_index < asect->index)
   3279  1.1  christos 	max_index = asect->index;
   3280  1.1  christos     }
   3281  1.1  christos 
   3282  1.1  christos   max_index++;
   3283  1.1  christos   sect_syms = (asymbol **) bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
   3284  1.1  christos   if (sect_syms == NULL)
   3285  1.1  christos     return FALSE;
   3286  1.1  christos   elf_section_syms (abfd) = sect_syms;
   3287  1.1  christos   elf_num_section_syms (abfd) = max_index;
   3288  1.1  christos 
   3289  1.1  christos   /* Init sect_syms entries for any section symbols we have already
   3290  1.1  christos      decided to output.  */
   3291  1.1  christos   for (idx = 0; idx < symcount; idx++)
   3292  1.1  christos     {
   3293  1.1  christos       asymbol *sym = syms[idx];
   3294  1.1  christos 
   3295  1.1  christos       if ((sym->flags & BSF_SECTION_SYM) != 0
   3296  1.1  christos 	  && sym->value == 0
   3297  1.1  christos 	  && !ignore_section_sym (abfd, sym))
   3298  1.1  christos 	{
   3299  1.1  christos 	  asection *sec = sym->section;
   3300  1.1  christos 
   3301  1.1  christos 	  if (sec->owner != abfd)
   3302  1.1  christos 	    sec = sec->output_section;
   3303  1.1  christos 
   3304  1.1  christos 	  sect_syms[sec->index] = syms[idx];
   3305  1.1  christos 	}
   3306  1.1  christos     }
   3307  1.1  christos 
   3308  1.1  christos   /* Classify all of the symbols.  */
   3309  1.1  christos   for (idx = 0; idx < symcount; idx++)
   3310  1.1  christos     {
   3311  1.1  christos       if (ignore_section_sym (abfd, syms[idx]))
   3312  1.1  christos 	continue;
   3313  1.1  christos       if (!sym_is_global (abfd, syms[idx]))
   3314  1.1  christos 	num_locals++;
   3315  1.1  christos       else
   3316  1.1  christos 	num_globals++;
   3317  1.1  christos     }
   3318  1.1  christos 
   3319  1.1  christos   /* We will be adding a section symbol for each normal BFD section.  Most
   3320  1.1  christos      sections will already have a section symbol in outsymbols, but
   3321  1.1  christos      eg. SHT_GROUP sections will not, and we need the section symbol mapped
   3322  1.1  christos      at least in that case.  */
   3323  1.1  christos   for (asect = abfd->sections; asect; asect = asect->next)
   3324  1.1  christos     {
   3325  1.1  christos       if (sect_syms[asect->index] == NULL)
   3326  1.1  christos 	{
   3327  1.1  christos 	  if (!sym_is_global (abfd, asect->symbol))
   3328  1.1  christos 	    num_locals++;
   3329  1.1  christos 	  else
   3330  1.1  christos 	    num_globals++;
   3331  1.1  christos 	}
   3332  1.1  christos     }
   3333  1.1  christos 
   3334  1.1  christos   /* Now sort the symbols so the local symbols are first.  */
   3335  1.1  christos   new_syms = (asymbol **) bfd_alloc2 (abfd, num_locals + num_globals,
   3336  1.1  christos                                       sizeof (asymbol *));
   3337  1.1  christos 
   3338  1.1  christos   if (new_syms == NULL)
   3339  1.1  christos     return FALSE;
   3340  1.1  christos 
   3341  1.1  christos   for (idx = 0; idx < symcount; idx++)
   3342  1.1  christos     {
   3343  1.1  christos       asymbol *sym = syms[idx];
   3344  1.1  christos       unsigned int i;
   3345  1.1  christos 
   3346  1.1  christos       if (ignore_section_sym (abfd, sym))
   3347  1.1  christos 	continue;
   3348  1.1  christos       if (!sym_is_global (abfd, sym))
   3349  1.1  christos 	i = num_locals2++;
   3350  1.1  christos       else
   3351  1.1  christos 	i = num_locals + num_globals2++;
   3352  1.1  christos       new_syms[i] = sym;
   3353  1.1  christos       sym->udata.i = i + 1;
   3354  1.1  christos     }
   3355  1.1  christos   for (asect = abfd->sections; asect; asect = asect->next)
   3356  1.1  christos     {
   3357  1.1  christos       if (sect_syms[asect->index] == NULL)
   3358  1.1  christos 	{
   3359  1.1  christos 	  asymbol *sym = asect->symbol;
   3360  1.1  christos 	  unsigned int i;
   3361  1.1  christos 
   3362  1.1  christos 	  sect_syms[asect->index] = sym;
   3363  1.1  christos 	  if (!sym_is_global (abfd, sym))
   3364  1.1  christos 	    i = num_locals2++;
   3365  1.1  christos 	  else
   3366  1.1  christos 	    i = num_locals + num_globals2++;
   3367  1.1  christos 	  new_syms[i] = sym;
   3368  1.1  christos 	  sym->udata.i = i + 1;
   3369  1.1  christos 	}
   3370  1.1  christos     }
   3371  1.1  christos 
   3372  1.1  christos   bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
   3373  1.1  christos 
   3374  1.1  christos   elf_num_locals (abfd) = num_locals;
   3375  1.1  christos   elf_num_globals (abfd) = num_globals;
   3376  1.1  christos   return TRUE;
   3377  1.1  christos }
   3378  1.1  christos 
   3379  1.1  christos /* Align to the maximum file alignment that could be required for any
   3380  1.1  christos    ELF data structure.  */
   3381  1.1  christos 
   3382  1.1  christos static inline file_ptr
   3383  1.1  christos align_file_position (file_ptr off, int align)
   3384  1.1  christos {
   3385  1.1  christos   return (off + align - 1) & ~(align - 1);
   3386  1.1  christos }
   3387  1.1  christos 
   3388  1.1  christos /* Assign a file position to a section, optionally aligning to the
   3389  1.1  christos    required section alignment.  */
   3390  1.1  christos 
   3391  1.1  christos file_ptr
   3392  1.1  christos _bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
   3393  1.1  christos 					   file_ptr offset,
   3394  1.1  christos 					   bfd_boolean align)
   3395  1.1  christos {
   3396  1.1  christos   if (align && i_shdrp->sh_addralign > 1)
   3397  1.1  christos     offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
   3398  1.1  christos   i_shdrp->sh_offset = offset;
   3399  1.1  christos   if (i_shdrp->bfd_section != NULL)
   3400  1.1  christos     i_shdrp->bfd_section->filepos = offset;
   3401  1.1  christos   if (i_shdrp->sh_type != SHT_NOBITS)
   3402  1.1  christos     offset += i_shdrp->sh_size;
   3403  1.1  christos   return offset;
   3404  1.1  christos }
   3405  1.1  christos 
   3406  1.1  christos /* Compute the file positions we are going to put the sections at, and
   3407  1.1  christos    otherwise prepare to begin writing out the ELF file.  If LINK_INFO
   3408  1.1  christos    is not NULL, this is being called by the ELF backend linker.  */
   3409  1.1  christos 
   3410  1.1  christos bfd_boolean
   3411  1.1  christos _bfd_elf_compute_section_file_positions (bfd *abfd,
   3412  1.1  christos 					 struct bfd_link_info *link_info)
   3413  1.1  christos {
   3414  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   3415  1.1  christos   struct fake_section_arg fsargs;
   3416  1.1  christos   bfd_boolean failed;
   3417  1.1  christos   struct bfd_strtab_hash *strtab = NULL;
   3418  1.1  christos   Elf_Internal_Shdr *shstrtab_hdr;
   3419  1.1  christos   bfd_boolean need_symtab;
   3420  1.1  christos 
   3421  1.1  christos   if (abfd->output_has_begun)
   3422  1.1  christos     return TRUE;
   3423  1.1  christos 
   3424  1.1  christos   /* Do any elf backend specific processing first.  */
   3425  1.1  christos   if (bed->elf_backend_begin_write_processing)
   3426  1.1  christos     (*bed->elf_backend_begin_write_processing) (abfd, link_info);
   3427  1.1  christos 
   3428  1.1  christos   if (! prep_headers (abfd))
   3429  1.1  christos     return FALSE;
   3430  1.1  christos 
   3431  1.1  christos   /* Post process the headers if necessary.  */
   3432  1.1  christos   if (bed->elf_backend_post_process_headers)
   3433  1.1  christos     (*bed->elf_backend_post_process_headers) (abfd, link_info);
   3434  1.1  christos 
   3435  1.1  christos   fsargs.failed = FALSE;
   3436  1.1  christos   fsargs.link_info = link_info;
   3437  1.1  christos   bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
   3438  1.1  christos   if (fsargs.failed)
   3439  1.1  christos     return FALSE;
   3440  1.1  christos 
   3441  1.1  christos   if (!assign_section_numbers (abfd, link_info))
   3442  1.1  christos     return FALSE;
   3443  1.1  christos 
   3444  1.1  christos   /* The backend linker builds symbol table information itself.  */
   3445  1.1  christos   need_symtab = (link_info == NULL
   3446  1.1  christos 		 && (bfd_get_symcount (abfd) > 0
   3447  1.1  christos 		     || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
   3448  1.1  christos 			 == HAS_RELOC)));
   3449  1.1  christos   if (need_symtab)
   3450  1.1  christos     {
   3451  1.1  christos       /* Non-zero if doing a relocatable link.  */
   3452  1.1  christos       int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
   3453  1.1  christos 
   3454  1.1  christos       if (! swap_out_syms (abfd, &strtab, relocatable_p))
   3455  1.1  christos 	return FALSE;
   3456  1.1  christos     }
   3457  1.1  christos 
   3458  1.1  christos   failed = FALSE;
   3459  1.1  christos   if (link_info == NULL)
   3460  1.1  christos     {
   3461  1.1  christos       bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
   3462  1.1  christos       if (failed)
   3463  1.1  christos 	return FALSE;
   3464  1.1  christos     }
   3465  1.1  christos 
   3466  1.1  christos   shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
   3467  1.1  christos   /* sh_name was set in prep_headers.  */
   3468  1.1  christos   shstrtab_hdr->sh_type = SHT_STRTAB;
   3469  1.1  christos   shstrtab_hdr->sh_flags = 0;
   3470  1.1  christos   shstrtab_hdr->sh_addr = 0;
   3471  1.1  christos   shstrtab_hdr->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
   3472  1.1  christos   shstrtab_hdr->sh_entsize = 0;
   3473  1.1  christos   shstrtab_hdr->sh_link = 0;
   3474  1.1  christos   shstrtab_hdr->sh_info = 0;
   3475  1.1  christos   /* sh_offset is set in assign_file_positions_except_relocs.  */
   3476  1.1  christos   shstrtab_hdr->sh_addralign = 1;
   3477  1.1  christos 
   3478  1.1  christos   if (!assign_file_positions_except_relocs (abfd, link_info))
   3479  1.1  christos     return FALSE;
   3480  1.1  christos 
   3481  1.1  christos   if (need_symtab)
   3482  1.1  christos     {
   3483  1.1  christos       file_ptr off;
   3484  1.1  christos       Elf_Internal_Shdr *hdr;
   3485  1.1  christos 
   3486  1.1  christos       off = elf_tdata (abfd)->next_file_pos;
   3487  1.1  christos 
   3488  1.1  christos       hdr = &elf_tdata (abfd)->symtab_hdr;
   3489  1.1  christos       off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
   3490  1.1  christos 
   3491  1.1  christos       hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
   3492  1.1  christos       if (hdr->sh_size != 0)
   3493  1.1  christos 	off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
   3494  1.1  christos 
   3495  1.1  christos       hdr = &elf_tdata (abfd)->strtab_hdr;
   3496  1.1  christos       off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
   3497  1.1  christos 
   3498  1.1  christos       elf_tdata (abfd)->next_file_pos = off;
   3499  1.1  christos 
   3500  1.1  christos       /* Now that we know where the .strtab section goes, write it
   3501  1.1  christos 	 out.  */
   3502  1.1  christos       if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
   3503  1.1  christos 	  || ! _bfd_stringtab_emit (abfd, strtab))
   3504  1.1  christos 	return FALSE;
   3505  1.1  christos       _bfd_stringtab_free (strtab);
   3506  1.1  christos     }
   3507  1.1  christos 
   3508  1.1  christos   abfd->output_has_begun = TRUE;
   3509  1.1  christos 
   3510  1.1  christos   return TRUE;
   3511  1.1  christos }
   3512  1.1  christos 
   3513  1.1  christos /* Make an initial estimate of the size of the program header.  If we
   3514  1.1  christos    get the number wrong here, we'll redo section placement.  */
   3515  1.1  christos 
   3516  1.1  christos static bfd_size_type
   3517  1.1  christos get_program_header_size (bfd *abfd, struct bfd_link_info *info)
   3518  1.1  christos {
   3519  1.1  christos   size_t segs;
   3520  1.1  christos   asection *s;
   3521  1.1  christos   const struct elf_backend_data *bed;
   3522  1.1  christos 
   3523  1.1  christos   /* Assume we will need exactly two PT_LOAD segments: one for text
   3524  1.1  christos      and one for data.  */
   3525  1.1  christos   segs = 2;
   3526  1.1  christos 
   3527  1.1  christos   s = bfd_get_section_by_name (abfd, ".interp");
   3528  1.1  christos   if (s != NULL && (s->flags & SEC_LOAD) != 0)
   3529  1.1  christos     {
   3530  1.1  christos       /* If we have a loadable interpreter section, we need a
   3531  1.1  christos 	 PT_INTERP segment.  In this case, assume we also need a
   3532  1.1  christos 	 PT_PHDR segment, although that may not be true for all
   3533  1.1  christos 	 targets.  */
   3534  1.1  christos       segs += 2;
   3535  1.1  christos     }
   3536  1.1  christos 
   3537  1.1  christos   if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
   3538  1.1  christos     {
   3539  1.1  christos       /* We need a PT_DYNAMIC segment.  */
   3540  1.1  christos       ++segs;
   3541  1.1  christos     }
   3542  1.1  christos 
   3543  1.1  christos   if (info != NULL && info->relro)
   3544  1.1  christos     {
   3545  1.1  christos       /* We need a PT_GNU_RELRO segment.  */
   3546  1.1  christos       ++segs;
   3547  1.1  christos     }
   3548  1.1  christos 
   3549  1.1  christos   if (elf_tdata (abfd)->eh_frame_hdr)
   3550  1.1  christos     {
   3551  1.1  christos       /* We need a PT_GNU_EH_FRAME segment.  */
   3552  1.1  christos       ++segs;
   3553  1.1  christos     }
   3554  1.1  christos 
   3555  1.1  christos   if (elf_tdata (abfd)->stack_flags)
   3556  1.1  christos     {
   3557  1.1  christos       /* We need a PT_GNU_STACK segment.  */
   3558  1.1  christos       ++segs;
   3559  1.1  christos     }
   3560  1.1  christos 
   3561  1.1  christos   for (s = abfd->sections; s != NULL; s = s->next)
   3562  1.1  christos     {
   3563  1.1  christos       if ((s->flags & SEC_LOAD) != 0
   3564  1.1  christos 	  && CONST_STRNEQ (s->name, ".note"))
   3565  1.1  christos 	{
   3566  1.1  christos 	  /* We need a PT_NOTE segment.  */
   3567  1.1  christos 	  ++segs;
   3568  1.1  christos 	  /* Try to create just one PT_NOTE segment
   3569  1.1  christos 	     for all adjacent loadable .note* sections.
   3570  1.1  christos 	     gABI requires that within a PT_NOTE segment
   3571  1.1  christos 	     (and also inside of each SHT_NOTE section)
   3572  1.1  christos 	     each note is padded to a multiple of 4 size,
   3573  1.1  christos 	     so we check whether the sections are correctly
   3574  1.1  christos 	     aligned.  */
   3575  1.1  christos 	  if (s->alignment_power == 2)
   3576  1.1  christos 	    while (s->next != NULL
   3577  1.1  christos 		   && s->next->alignment_power == 2
   3578  1.1  christos 		   && (s->next->flags & SEC_LOAD) != 0
   3579  1.1  christos 		   && CONST_STRNEQ (s->next->name, ".note"))
   3580  1.1  christos 	      s = s->next;
   3581  1.1  christos 	}
   3582  1.1  christos     }
   3583  1.1  christos 
   3584  1.1  christos   for (s = abfd->sections; s != NULL; s = s->next)
   3585  1.1  christos     {
   3586  1.1  christos       if (s->flags & SEC_THREAD_LOCAL)
   3587  1.1  christos 	{
   3588  1.1  christos 	  /* We need a PT_TLS segment.  */
   3589  1.1  christos 	  ++segs;
   3590  1.1  christos 	  break;
   3591  1.1  christos 	}
   3592  1.1  christos     }
   3593  1.1  christos 
   3594  1.1  christos   /* Let the backend count up any program headers it might need.  */
   3595  1.1  christos   bed = get_elf_backend_data (abfd);
   3596  1.1  christos   if (bed->elf_backend_additional_program_headers)
   3597  1.1  christos     {
   3598  1.1  christos       int a;
   3599  1.1  christos 
   3600  1.1  christos       a = (*bed->elf_backend_additional_program_headers) (abfd, info);
   3601  1.1  christos       if (a == -1)
   3602  1.1  christos 	abort ();
   3603  1.1  christos       segs += a;
   3604  1.1  christos     }
   3605  1.1  christos 
   3606  1.1  christos   return segs * bed->s->sizeof_phdr;
   3607  1.1  christos }
   3608  1.1  christos 
   3609  1.1  christos /* Find the segment that contains the output_section of section.  */
   3610  1.1  christos 
   3611  1.1  christos Elf_Internal_Phdr *
   3612  1.1  christos _bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
   3613  1.1  christos {
   3614  1.1  christos   struct elf_segment_map *m;
   3615  1.1  christos   Elf_Internal_Phdr *p;
   3616  1.1  christos 
   3617  1.1  christos   for (m = elf_tdata (abfd)->segment_map,
   3618  1.1  christos 	 p = elf_tdata (abfd)->phdr;
   3619  1.1  christos        m != NULL;
   3620  1.1  christos        m = m->next, p++)
   3621  1.1  christos     {
   3622  1.1  christos       int i;
   3623  1.1  christos 
   3624  1.1  christos       for (i = m->count - 1; i >= 0; i--)
   3625  1.1  christos 	if (m->sections[i] == section)
   3626  1.1  christos 	  return p;
   3627  1.1  christos     }
   3628  1.1  christos 
   3629  1.1  christos   return NULL;
   3630  1.1  christos }
   3631  1.1  christos 
   3632  1.1  christos /* Create a mapping from a set of sections to a program segment.  */
   3633  1.1  christos 
   3634  1.1  christos static struct elf_segment_map *
   3635  1.1  christos make_mapping (bfd *abfd,
   3636  1.1  christos 	      asection **sections,
   3637  1.1  christos 	      unsigned int from,
   3638  1.1  christos 	      unsigned int to,
   3639  1.1  christos 	      bfd_boolean phdr)
   3640  1.1  christos {
   3641  1.1  christos   struct elf_segment_map *m;
   3642  1.1  christos   unsigned int i;
   3643  1.1  christos   asection **hdrpp;
   3644  1.1  christos   bfd_size_type amt;
   3645  1.1  christos 
   3646  1.1  christos   amt = sizeof (struct elf_segment_map);
   3647  1.1  christos   amt += (to - from - 1) * sizeof (asection *);
   3648  1.1  christos   m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   3649  1.1  christos   if (m == NULL)
   3650  1.1  christos     return NULL;
   3651  1.1  christos   m->next = NULL;
   3652  1.1  christos   m->p_type = PT_LOAD;
   3653  1.1  christos   for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
   3654  1.1  christos     m->sections[i - from] = *hdrpp;
   3655  1.1  christos   m->count = to - from;
   3656  1.1  christos 
   3657  1.1  christos   if (from == 0 && phdr)
   3658  1.1  christos     {
   3659  1.1  christos       /* Include the headers in the first PT_LOAD segment.  */
   3660  1.1  christos       m->includes_filehdr = 1;
   3661  1.1  christos       m->includes_phdrs = 1;
   3662  1.1  christos     }
   3663  1.1  christos 
   3664  1.1  christos   return m;
   3665  1.1  christos }
   3666  1.1  christos 
   3667  1.1  christos /* Create the PT_DYNAMIC segment, which includes DYNSEC.  Returns NULL
   3668  1.1  christos    on failure.  */
   3669  1.1  christos 
   3670  1.1  christos struct elf_segment_map *
   3671  1.1  christos _bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
   3672  1.1  christos {
   3673  1.1  christos   struct elf_segment_map *m;
   3674  1.1  christos 
   3675  1.1  christos   m = (struct elf_segment_map *) bfd_zalloc (abfd,
   3676  1.1  christos                                              sizeof (struct elf_segment_map));
   3677  1.1  christos   if (m == NULL)
   3678  1.1  christos     return NULL;
   3679  1.1  christos   m->next = NULL;
   3680  1.1  christos   m->p_type = PT_DYNAMIC;
   3681  1.1  christos   m->count = 1;
   3682  1.1  christos   m->sections[0] = dynsec;
   3683  1.1  christos 
   3684  1.1  christos   return m;
   3685  1.1  christos }
   3686  1.1  christos 
   3687  1.1  christos /* Possibly add or remove segments from the segment map.  */
   3688  1.1  christos 
   3689  1.1  christos static bfd_boolean
   3690  1.1  christos elf_modify_segment_map (bfd *abfd,
   3691  1.1  christos 			struct bfd_link_info *info,
   3692  1.1  christos 			bfd_boolean remove_empty_load)
   3693  1.1  christos {
   3694  1.1  christos   struct elf_segment_map **m;
   3695  1.1  christos   const struct elf_backend_data *bed;
   3696  1.1  christos 
   3697  1.1  christos   /* The placement algorithm assumes that non allocated sections are
   3698  1.1  christos      not in PT_LOAD segments.  We ensure this here by removing such
   3699  1.1  christos      sections from the segment map.  We also remove excluded
   3700  1.1  christos      sections.  Finally, any PT_LOAD segment without sections is
   3701  1.1  christos      removed.  */
   3702  1.1  christos   m = &elf_tdata (abfd)->segment_map;
   3703  1.1  christos   while (*m)
   3704  1.1  christos     {
   3705  1.1  christos       unsigned int i, new_count;
   3706  1.1  christos 
   3707  1.1  christos       for (new_count = 0, i = 0; i < (*m)->count; i++)
   3708  1.1  christos 	{
   3709  1.1  christos 	  if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
   3710  1.1  christos 	      && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
   3711  1.1  christos 		  || (*m)->p_type != PT_LOAD))
   3712  1.1  christos 	    {
   3713  1.1  christos 	      (*m)->sections[new_count] = (*m)->sections[i];
   3714  1.1  christos 	      new_count++;
   3715  1.1  christos 	    }
   3716  1.1  christos 	}
   3717  1.1  christos       (*m)->count = new_count;
   3718  1.1  christos 
   3719  1.1  christos       if (remove_empty_load && (*m)->p_type == PT_LOAD && (*m)->count == 0)
   3720  1.1  christos 	*m = (*m)->next;
   3721  1.1  christos       else
   3722  1.1  christos 	m = &(*m)->next;
   3723  1.1  christos     }
   3724  1.1  christos 
   3725  1.1  christos   bed = get_elf_backend_data (abfd);
   3726  1.1  christos   if (bed->elf_backend_modify_segment_map != NULL)
   3727  1.1  christos     {
   3728  1.1  christos       if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
   3729  1.1  christos 	return FALSE;
   3730  1.1  christos     }
   3731  1.1  christos 
   3732  1.1  christos   return TRUE;
   3733  1.1  christos }
   3734  1.1  christos 
   3735  1.1  christos /* Set up a mapping from BFD sections to program segments.  */
   3736  1.1  christos 
   3737  1.1  christos bfd_boolean
   3738  1.1  christos _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
   3739  1.1  christos {
   3740  1.1  christos   unsigned int count;
   3741  1.1  christos   struct elf_segment_map *m;
   3742  1.1  christos   asection **sections = NULL;
   3743  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   3744  1.1  christos   bfd_boolean no_user_phdrs;
   3745  1.1  christos 
   3746  1.1  christos   no_user_phdrs = elf_tdata (abfd)->segment_map == NULL;
   3747  1.1  christos   if (no_user_phdrs && bfd_count_sections (abfd) != 0)
   3748  1.1  christos     {
   3749  1.1  christos       asection *s;
   3750  1.1  christos       unsigned int i;
   3751  1.1  christos       struct elf_segment_map *mfirst;
   3752  1.1  christos       struct elf_segment_map **pm;
   3753  1.1  christos       asection *last_hdr;
   3754  1.1  christos       bfd_vma last_size;
   3755  1.1  christos       unsigned int phdr_index;
   3756  1.1  christos       bfd_vma maxpagesize;
   3757  1.1  christos       asection **hdrpp;
   3758  1.1  christos       bfd_boolean phdr_in_segment = TRUE;
   3759  1.1  christos       bfd_boolean writable;
   3760  1.1  christos       int tls_count = 0;
   3761  1.1  christos       asection *first_tls = NULL;
   3762  1.1  christos       asection *dynsec, *eh_frame_hdr;
   3763  1.1  christos       bfd_size_type amt;
   3764  1.1  christos       bfd_vma addr_mask, wrap_to = 0;
   3765  1.1  christos 
   3766  1.1  christos       /* Select the allocated sections, and sort them.  */
   3767  1.1  christos 
   3768  1.1  christos       sections = (asection **) bfd_malloc2 (bfd_count_sections (abfd),
   3769  1.1  christos                                             sizeof (asection *));
   3770  1.1  christos       if (sections == NULL)
   3771  1.1  christos 	goto error_return;
   3772  1.1  christos 
   3773  1.1  christos       /* Calculate top address, avoiding undefined behaviour of shift
   3774  1.1  christos 	 left operator when shift count is equal to size of type
   3775  1.1  christos 	 being shifted.  */
   3776  1.1  christos       addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
   3777  1.1  christos       addr_mask = (addr_mask << 1) + 1;
   3778  1.1  christos 
   3779  1.1  christos       i = 0;
   3780  1.1  christos       for (s = abfd->sections; s != NULL; s = s->next)
   3781  1.1  christos 	{
   3782  1.1  christos 	  if ((s->flags & SEC_ALLOC) != 0)
   3783  1.1  christos 	    {
   3784  1.1  christos 	      sections[i] = s;
   3785  1.1  christos 	      ++i;
   3786  1.1  christos 	      /* A wrapping section potentially clashes with header.  */
   3787  1.1  christos 	      if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
   3788  1.1  christos 		wrap_to = (s->lma + s->size) & addr_mask;
   3789  1.1  christos 	    }
   3790  1.1  christos 	}
   3791  1.1  christos       BFD_ASSERT (i <= bfd_count_sections (abfd));
   3792  1.1  christos       count = i;
   3793  1.1  christos 
   3794  1.1  christos       qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
   3795  1.1  christos 
   3796  1.1  christos       /* Build the mapping.  */
   3797  1.1  christos 
   3798  1.1  christos       mfirst = NULL;
   3799  1.1  christos       pm = &mfirst;
   3800  1.1  christos 
   3801  1.1  christos       /* If we have a .interp section, then create a PT_PHDR segment for
   3802  1.1  christos 	 the program headers and a PT_INTERP segment for the .interp
   3803  1.1  christos 	 section.  */
   3804  1.1  christos       s = bfd_get_section_by_name (abfd, ".interp");
   3805  1.1  christos       if (s != NULL && (s->flags & SEC_LOAD) != 0)
   3806  1.1  christos 	{
   3807  1.1  christos 	  amt = sizeof (struct elf_segment_map);
   3808  1.1  christos 	  m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   3809  1.1  christos 	  if (m == NULL)
   3810  1.1  christos 	    goto error_return;
   3811  1.1  christos 	  m->next = NULL;
   3812  1.1  christos 	  m->p_type = PT_PHDR;
   3813  1.1  christos 	  /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not.  */
   3814  1.1  christos 	  m->p_flags = PF_R | PF_X;
   3815  1.1  christos 	  m->p_flags_valid = 1;
   3816  1.1  christos 	  m->includes_phdrs = 1;
   3817  1.1  christos 
   3818  1.1  christos 	  *pm = m;
   3819  1.1  christos 	  pm = &m->next;
   3820  1.1  christos 
   3821  1.1  christos 	  amt = sizeof (struct elf_segment_map);
   3822  1.1  christos 	  m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   3823  1.1  christos 	  if (m == NULL)
   3824  1.1  christos 	    goto error_return;
   3825  1.1  christos 	  m->next = NULL;
   3826  1.1  christos 	  m->p_type = PT_INTERP;
   3827  1.1  christos 	  m->count = 1;
   3828  1.1  christos 	  m->sections[0] = s;
   3829  1.1  christos 
   3830  1.1  christos 	  *pm = m;
   3831  1.1  christos 	  pm = &m->next;
   3832  1.1  christos 	}
   3833  1.1  christos 
   3834  1.1  christos       /* Look through the sections.  We put sections in the same program
   3835  1.1  christos 	 segment when the start of the second section can be placed within
   3836  1.1  christos 	 a few bytes of the end of the first section.  */
   3837  1.1  christos       last_hdr = NULL;
   3838  1.1  christos       last_size = 0;
   3839  1.1  christos       phdr_index = 0;
   3840  1.1  christos       maxpagesize = bed->maxpagesize;
   3841  1.1  christos       writable = FALSE;
   3842  1.1  christos       dynsec = bfd_get_section_by_name (abfd, ".dynamic");
   3843  1.1  christos       if (dynsec != NULL
   3844  1.1  christos 	  && (dynsec->flags & SEC_LOAD) == 0)
   3845  1.1  christos 	dynsec = NULL;
   3846  1.1  christos 
   3847  1.1  christos       /* Deal with -Ttext or something similar such that the first section
   3848  1.1  christos 	 is not adjacent to the program headers.  This is an
   3849  1.1  christos 	 approximation, since at this point we don't know exactly how many
   3850  1.1  christos 	 program headers we will need.  */
   3851  1.1  christos       if (count > 0)
   3852  1.1  christos 	{
   3853  1.1  christos 	  bfd_size_type phdr_size = elf_tdata (abfd)->program_header_size;
   3854  1.1  christos 
   3855  1.1  christos 	  if (phdr_size == (bfd_size_type) -1)
   3856  1.1  christos 	    phdr_size = get_program_header_size (abfd, info);
   3857  1.1  christos 	  if ((abfd->flags & D_PAGED) == 0
   3858  1.1  christos 	      || (sections[0]->lma & addr_mask) < phdr_size
   3859  1.1  christos 	      || ((sections[0]->lma & addr_mask) % maxpagesize
   3860  1.1  christos 		  < phdr_size % maxpagesize)
   3861  1.1  christos 	      || (sections[0]->lma & addr_mask & -maxpagesize) < wrap_to)
   3862  1.1  christos 	    phdr_in_segment = FALSE;
   3863  1.1  christos 	}
   3864  1.1  christos 
   3865  1.1  christos       for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
   3866  1.1  christos 	{
   3867  1.1  christos 	  asection *hdr;
   3868  1.1  christos 	  bfd_boolean new_segment;
   3869  1.1  christos 
   3870  1.1  christos 	  hdr = *hdrpp;
   3871  1.1  christos 
   3872  1.1  christos 	  /* See if this section and the last one will fit in the same
   3873  1.1  christos 	     segment.  */
   3874  1.1  christos 
   3875  1.1  christos 	  if (last_hdr == NULL)
   3876  1.1  christos 	    {
   3877  1.1  christos 	      /* If we don't have a segment yet, then we don't need a new
   3878  1.1  christos 		 one (we build the last one after this loop).  */
   3879  1.1  christos 	      new_segment = FALSE;
   3880  1.1  christos 	    }
   3881  1.1  christos 	  else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
   3882  1.1  christos 	    {
   3883  1.1  christos 	      /* If this section has a different relation between the
   3884  1.1  christos 		 virtual address and the load address, then we need a new
   3885  1.1  christos 		 segment.  */
   3886  1.1  christos 	      new_segment = TRUE;
   3887  1.1  christos 	    }
   3888  1.1  christos 	  else if (hdr->lma < last_hdr->lma + last_size
   3889  1.1  christos 		   || last_hdr->lma + last_size < last_hdr->lma)
   3890  1.1  christos 	    {
   3891  1.1  christos 	      /* If this section has a load address that makes it overlap
   3892  1.1  christos 		 the previous section, then we need a new segment.  */
   3893  1.1  christos 	      new_segment = TRUE;
   3894  1.1  christos 	    }
   3895  1.1  christos 	  /* In the next test we have to be careful when last_hdr->lma is close
   3896  1.1  christos 	     to the end of the address space.  If the aligned address wraps
   3897  1.1  christos 	     around to the start of the address space, then there are no more
   3898  1.1  christos 	     pages left in memory and it is OK to assume that the current
   3899  1.1  christos 	     section can be included in the current segment.  */
   3900  1.1  christos 	  else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
   3901  1.1  christos 		    > last_hdr->lma)
   3902  1.1  christos 		   && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
   3903  1.1  christos 		       <= hdr->lma))
   3904  1.1  christos 	    {
   3905  1.1  christos 	      /* If putting this section in this segment would force us to
   3906  1.1  christos 		 skip a page in the segment, then we need a new segment.  */
   3907  1.1  christos 	      new_segment = TRUE;
   3908  1.1  christos 	    }
   3909  1.1  christos 	  else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
   3910  1.1  christos 		   && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
   3911  1.1  christos 	    {
   3912  1.1  christos 	      /* We don't want to put a loadable section after a
   3913  1.1  christos 		 nonloadable section in the same segment.
   3914  1.1  christos 		 Consider .tbss sections as loadable for this purpose.  */
   3915  1.1  christos 	      new_segment = TRUE;
   3916  1.1  christos 	    }
   3917  1.1  christos 	  else if ((abfd->flags & D_PAGED) == 0)
   3918  1.1  christos 	    {
   3919  1.1  christos 	      /* If the file is not demand paged, which means that we
   3920  1.1  christos 		 don't require the sections to be correctly aligned in the
   3921  1.1  christos 		 file, then there is no other reason for a new segment.  */
   3922  1.1  christos 	      new_segment = FALSE;
   3923  1.1  christos 	    }
   3924  1.1  christos 	  else if (! writable
   3925  1.1  christos 		   && (hdr->flags & SEC_READONLY) == 0
   3926  1.1  christos 		   && (((last_hdr->lma + last_size - 1) & -maxpagesize)
   3927  1.1  christos 		       != (hdr->lma & -maxpagesize)))
   3928  1.1  christos 	    {
   3929  1.1  christos 	      /* We don't want to put a writable section in a read only
   3930  1.1  christos 		 segment, unless they are on the same page in memory
   3931  1.1  christos 		 anyhow.  We already know that the last section does not
   3932  1.1  christos 		 bring us past the current section on the page, so the
   3933  1.1  christos 		 only case in which the new section is not on the same
   3934  1.1  christos 		 page as the previous section is when the previous section
   3935  1.1  christos 		 ends precisely on a page boundary.  */
   3936  1.1  christos 	      new_segment = TRUE;
   3937  1.1  christos 	    }
   3938  1.1  christos 	  else
   3939  1.1  christos 	    {
   3940  1.1  christos 	      /* Otherwise, we can use the same segment.  */
   3941  1.1  christos 	      new_segment = FALSE;
   3942  1.1  christos 	    }
   3943  1.1  christos 
   3944  1.1  christos 	  /* Allow interested parties a chance to override our decision.  */
   3945  1.1  christos 	  if (last_hdr != NULL
   3946  1.1  christos 	      && info != NULL
   3947  1.1  christos 	      && info->callbacks->override_segment_assignment != NULL)
   3948  1.1  christos 	    new_segment
   3949  1.1  christos 	      = info->callbacks->override_segment_assignment (info, abfd, hdr,
   3950  1.1  christos 							      last_hdr,
   3951  1.1  christos 							      new_segment);
   3952  1.1  christos 
   3953  1.1  christos 	  if (! new_segment)
   3954  1.1  christos 	    {
   3955  1.1  christos 	      if ((hdr->flags & SEC_READONLY) == 0)
   3956  1.1  christos 		writable = TRUE;
   3957  1.1  christos 	      last_hdr = hdr;
   3958  1.1  christos 	      /* .tbss sections effectively have zero size.  */
   3959  1.1  christos 	      if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
   3960  1.1  christos 		  != SEC_THREAD_LOCAL)
   3961  1.1  christos 		last_size = hdr->size;
   3962  1.1  christos 	      else
   3963  1.1  christos 		last_size = 0;
   3964  1.1  christos 	      continue;
   3965  1.1  christos 	    }
   3966  1.1  christos 
   3967  1.1  christos 	  /* We need a new program segment.  We must create a new program
   3968  1.1  christos 	     header holding all the sections from phdr_index until hdr.  */
   3969  1.1  christos 
   3970  1.1  christos 	  m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
   3971  1.1  christos 	  if (m == NULL)
   3972  1.1  christos 	    goto error_return;
   3973  1.1  christos 
   3974  1.1  christos 	  *pm = m;
   3975  1.1  christos 	  pm = &m->next;
   3976  1.1  christos 
   3977  1.1  christos 	  if ((hdr->flags & SEC_READONLY) == 0)
   3978  1.1  christos 	    writable = TRUE;
   3979  1.1  christos 	  else
   3980  1.1  christos 	    writable = FALSE;
   3981  1.1  christos 
   3982  1.1  christos 	  last_hdr = hdr;
   3983  1.1  christos 	  /* .tbss sections effectively have zero size.  */
   3984  1.1  christos 	  if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
   3985  1.1  christos 	    last_size = hdr->size;
   3986  1.1  christos 	  else
   3987  1.1  christos 	    last_size = 0;
   3988  1.1  christos 	  phdr_index = i;
   3989  1.1  christos 	  phdr_in_segment = FALSE;
   3990  1.1  christos 	}
   3991  1.1  christos 
   3992  1.1  christos       /* Create a final PT_LOAD program segment.  */
   3993  1.1  christos       if (last_hdr != NULL)
   3994  1.1  christos 	{
   3995  1.1  christos 	  m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
   3996  1.1  christos 	  if (m == NULL)
   3997  1.1  christos 	    goto error_return;
   3998  1.1  christos 
   3999  1.1  christos 	  *pm = m;
   4000  1.1  christos 	  pm = &m->next;
   4001  1.1  christos 	}
   4002  1.1  christos 
   4003  1.1  christos       /* If there is a .dynamic section, throw in a PT_DYNAMIC segment.  */
   4004  1.1  christos       if (dynsec != NULL)
   4005  1.1  christos 	{
   4006  1.1  christos 	  m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
   4007  1.1  christos 	  if (m == NULL)
   4008  1.1  christos 	    goto error_return;
   4009  1.1  christos 	  *pm = m;
   4010  1.1  christos 	  pm = &m->next;
   4011  1.1  christos 	}
   4012  1.1  christos 
   4013  1.1  christos       /* For each batch of consecutive loadable .note sections,
   4014  1.1  christos 	 add a PT_NOTE segment.  We don't use bfd_get_section_by_name,
   4015  1.1  christos 	 because if we link together nonloadable .note sections and
   4016  1.1  christos 	 loadable .note sections, we will generate two .note sections
   4017  1.1  christos 	 in the output file.  FIXME: Using names for section types is
   4018  1.1  christos 	 bogus anyhow.  */
   4019  1.1  christos       for (s = abfd->sections; s != NULL; s = s->next)
   4020  1.1  christos 	{
   4021  1.1  christos 	  if ((s->flags & SEC_LOAD) != 0
   4022  1.1  christos 	      && CONST_STRNEQ (s->name, ".note"))
   4023  1.1  christos 	    {
   4024  1.1  christos 	      asection *s2;
   4025  1.1  christos 
   4026  1.1  christos 	      count = 1;
   4027  1.1  christos 	      amt = sizeof (struct elf_segment_map);
   4028  1.1  christos 	      if (s->alignment_power == 2)
   4029  1.1  christos 		for (s2 = s; s2->next != NULL; s2 = s2->next)
   4030  1.1  christos 		  {
   4031  1.1  christos 		    if (s2->next->alignment_power == 2
   4032  1.1  christos 			&& (s2->next->flags & SEC_LOAD) != 0
   4033  1.1  christos 			&& CONST_STRNEQ (s2->next->name, ".note")
   4034  1.1  christos 			&& align_power (s2->lma + s2->size, 2)
   4035  1.1  christos 			   == s2->next->lma)
   4036  1.1  christos 		      count++;
   4037  1.1  christos 		    else
   4038  1.1  christos 		      break;
   4039  1.1  christos 		  }
   4040  1.1  christos 	      amt += (count - 1) * sizeof (asection *);
   4041  1.1  christos 	      m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   4042  1.1  christos 	      if (m == NULL)
   4043  1.1  christos 		goto error_return;
   4044  1.1  christos 	      m->next = NULL;
   4045  1.1  christos 	      m->p_type = PT_NOTE;
   4046  1.1  christos 	      m->count = count;
   4047  1.1  christos 	      while (count > 1)
   4048  1.1  christos 		{
   4049  1.1  christos 		  m->sections[m->count - count--] = s;
   4050  1.1  christos 		  BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
   4051  1.1  christos 		  s = s->next;
   4052  1.1  christos 		}
   4053  1.1  christos 	      m->sections[m->count - 1] = s;
   4054  1.1  christos 	      BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
   4055  1.1  christos 	      *pm = m;
   4056  1.1  christos 	      pm = &m->next;
   4057  1.1  christos 	    }
   4058  1.1  christos 	  if (s->flags & SEC_THREAD_LOCAL)
   4059  1.1  christos 	    {
   4060  1.1  christos 	      if (! tls_count)
   4061  1.1  christos 		first_tls = s;
   4062  1.1  christos 	      tls_count++;
   4063  1.1  christos 	    }
   4064  1.1  christos 	}
   4065  1.1  christos 
   4066  1.1  christos       /* If there are any SHF_TLS output sections, add PT_TLS segment.  */
   4067  1.1  christos       if (tls_count > 0)
   4068  1.1  christos 	{
   4069  1.1  christos 	  amt = sizeof (struct elf_segment_map);
   4070  1.1  christos 	  amt += (tls_count - 1) * sizeof (asection *);
   4071  1.1  christos 	  m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   4072  1.1  christos 	  if (m == NULL)
   4073  1.1  christos 	    goto error_return;
   4074  1.1  christos 	  m->next = NULL;
   4075  1.1  christos 	  m->p_type = PT_TLS;
   4076  1.1  christos 	  m->count = tls_count;
   4077  1.1  christos 	  /* Mandated PF_R.  */
   4078  1.1  christos 	  m->p_flags = PF_R;
   4079  1.1  christos 	  m->p_flags_valid = 1;
   4080  1.1  christos 	  for (i = 0; i < (unsigned int) tls_count; ++i)
   4081  1.1  christos 	    {
   4082  1.1  christos 	      BFD_ASSERT (first_tls->flags & SEC_THREAD_LOCAL);
   4083  1.1  christos 	      m->sections[i] = first_tls;
   4084  1.1  christos 	      first_tls = first_tls->next;
   4085  1.1  christos 	    }
   4086  1.1  christos 
   4087  1.1  christos 	  *pm = m;
   4088  1.1  christos 	  pm = &m->next;
   4089  1.1  christos 	}
   4090  1.1  christos 
   4091  1.1  christos       /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
   4092  1.1  christos 	 segment.  */
   4093  1.1  christos       eh_frame_hdr = elf_tdata (abfd)->eh_frame_hdr;
   4094  1.1  christos       if (eh_frame_hdr != NULL
   4095  1.1  christos 	  && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
   4096  1.1  christos 	{
   4097  1.1  christos 	  amt = sizeof (struct elf_segment_map);
   4098  1.1  christos 	  m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   4099  1.1  christos 	  if (m == NULL)
   4100  1.1  christos 	    goto error_return;
   4101  1.1  christos 	  m->next = NULL;
   4102  1.1  christos 	  m->p_type = PT_GNU_EH_FRAME;
   4103  1.1  christos 	  m->count = 1;
   4104  1.1  christos 	  m->sections[0] = eh_frame_hdr->output_section;
   4105  1.1  christos 
   4106  1.1  christos 	  *pm = m;
   4107  1.1  christos 	  pm = &m->next;
   4108  1.1  christos 	}
   4109  1.1  christos 
   4110  1.1  christos       if (elf_tdata (abfd)->stack_flags)
   4111  1.1  christos 	{
   4112  1.1  christos 	  amt = sizeof (struct elf_segment_map);
   4113  1.1  christos 	  m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   4114  1.1  christos 	  if (m == NULL)
   4115  1.1  christos 	    goto error_return;
   4116  1.1  christos 	  m->next = NULL;
   4117  1.1  christos 	  m->p_type = PT_GNU_STACK;
   4118  1.1  christos 	  m->p_flags = elf_tdata (abfd)->stack_flags;
   4119  1.1  christos 	  m->p_flags_valid = 1;
   4120  1.1  christos 
   4121  1.1  christos 	  *pm = m;
   4122  1.1  christos 	  pm = &m->next;
   4123  1.1  christos 	}
   4124  1.1  christos 
   4125  1.1  christos       if (info != NULL && info->relro)
   4126  1.1  christos 	{
   4127  1.1  christos 	  for (m = mfirst; m != NULL; m = m->next)
   4128  1.1  christos 	    {
   4129  1.1  christos 	      if (m->p_type == PT_LOAD)
   4130  1.1  christos 		{
   4131  1.1  christos 		  asection *last = m->sections[m->count - 1];
   4132  1.1  christos 		  bfd_vma vaddr = m->sections[0]->vma;
   4133  1.1  christos 		  bfd_vma filesz = last->vma - vaddr + last->size;
   4134  1.1  christos 
   4135  1.1  christos 		  if (vaddr < info->relro_end
   4136  1.1  christos 		      && vaddr >= info->relro_start
   4137  1.1  christos 		      && (vaddr + filesz) >= info->relro_end)
   4138  1.1  christos 		    break;
   4139  1.1  christos 		}
   4140  1.1  christos 	      }
   4141  1.1  christos 
   4142  1.1  christos 	  /* Make a PT_GNU_RELRO segment only when it isn't empty.  */
   4143  1.1  christos 	  if (m != NULL)
   4144  1.1  christos 	    {
   4145  1.1  christos 	      amt = sizeof (struct elf_segment_map);
   4146  1.1  christos 	      m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   4147  1.1  christos 	      if (m == NULL)
   4148  1.1  christos 		goto error_return;
   4149  1.1  christos 	      m->next = NULL;
   4150  1.1  christos 	      m->p_type = PT_GNU_RELRO;
   4151  1.1  christos 	      m->p_flags = PF_R;
   4152  1.1  christos 	      m->p_flags_valid = 1;
   4153  1.1  christos 
   4154  1.1  christos 	      *pm = m;
   4155  1.1  christos 	      pm = &m->next;
   4156  1.1  christos 	    }
   4157  1.1  christos 	}
   4158  1.1  christos 
   4159  1.1  christos       free (sections);
   4160  1.1  christos       elf_tdata (abfd)->segment_map = mfirst;
   4161  1.1  christos     }
   4162  1.1  christos 
   4163  1.1  christos   if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
   4164  1.1  christos     return FALSE;
   4165  1.1  christos 
   4166  1.1  christos   for (count = 0, m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
   4167  1.1  christos     ++count;
   4168  1.1  christos   elf_tdata (abfd)->program_header_size = count * bed->s->sizeof_phdr;
   4169  1.1  christos 
   4170  1.1  christos   return TRUE;
   4171  1.1  christos 
   4172  1.1  christos  error_return:
   4173  1.1  christos   if (sections != NULL)
   4174  1.1  christos     free (sections);
   4175  1.1  christos   return FALSE;
   4176  1.1  christos }
   4177  1.1  christos 
   4178  1.1  christos /* Sort sections by address.  */
   4179  1.1  christos 
   4180  1.1  christos static int
   4181  1.1  christos elf_sort_sections (const void *arg1, const void *arg2)
   4182  1.1  christos {
   4183  1.1  christos   const asection *sec1 = *(const asection **) arg1;
   4184  1.1  christos   const asection *sec2 = *(const asection **) arg2;
   4185  1.1  christos   bfd_size_type size1, size2;
   4186  1.1  christos 
   4187  1.1  christos   /* Sort by LMA first, since this is the address used to
   4188  1.1  christos      place the section into a segment.  */
   4189  1.1  christos   if (sec1->lma < sec2->lma)
   4190  1.1  christos     return -1;
   4191  1.1  christos   else if (sec1->lma > sec2->lma)
   4192  1.1  christos     return 1;
   4193  1.1  christos 
   4194  1.1  christos   /* Then sort by VMA.  Normally the LMA and the VMA will be
   4195  1.1  christos      the same, and this will do nothing.  */
   4196  1.1  christos   if (sec1->vma < sec2->vma)
   4197  1.1  christos     return -1;
   4198  1.1  christos   else if (sec1->vma > sec2->vma)
   4199  1.1  christos     return 1;
   4200  1.1  christos 
   4201  1.1  christos   /* Put !SEC_LOAD sections after SEC_LOAD ones.  */
   4202  1.1  christos 
   4203  1.1  christos #define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
   4204  1.1  christos 
   4205  1.1  christos   if (TOEND (sec1))
   4206  1.1  christos     {
   4207  1.1  christos       if (TOEND (sec2))
   4208  1.1  christos 	{
   4209  1.1  christos 	  /* If the indicies are the same, do not return 0
   4210  1.1  christos 	     here, but continue to try the next comparison.  */
   4211  1.1  christos 	  if (sec1->target_index - sec2->target_index != 0)
   4212  1.1  christos 	    return sec1->target_index - sec2->target_index;
   4213  1.1  christos 	}
   4214  1.1  christos       else
   4215  1.1  christos 	return 1;
   4216  1.1  christos     }
   4217  1.1  christos   else if (TOEND (sec2))
   4218  1.1  christos     return -1;
   4219  1.1  christos 
   4220  1.1  christos #undef TOEND
   4221  1.1  christos 
   4222  1.1  christos   /* Sort by size, to put zero sized sections
   4223  1.1  christos      before others at the same address.  */
   4224  1.1  christos 
   4225  1.1  christos   size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
   4226  1.1  christos   size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
   4227  1.1  christos 
   4228  1.1  christos   if (size1 < size2)
   4229  1.1  christos     return -1;
   4230  1.1  christos   if (size1 > size2)
   4231  1.1  christos     return 1;
   4232  1.1  christos 
   4233  1.1  christos   return sec1->target_index - sec2->target_index;
   4234  1.1  christos }
   4235  1.1  christos 
   4236  1.1  christos /* Ian Lance Taylor writes:
   4237  1.1  christos 
   4238  1.1  christos    We shouldn't be using % with a negative signed number.  That's just
   4239  1.1  christos    not good.  We have to make sure either that the number is not
   4240  1.1  christos    negative, or that the number has an unsigned type.  When the types
   4241  1.1  christos    are all the same size they wind up as unsigned.  When file_ptr is a
   4242  1.1  christos    larger signed type, the arithmetic winds up as signed long long,
   4243  1.1  christos    which is wrong.
   4244  1.1  christos 
   4245  1.1  christos    What we're trying to say here is something like ``increase OFF by
   4246  1.1  christos    the least amount that will cause it to be equal to the VMA modulo
   4247  1.1  christos    the page size.''  */
   4248  1.1  christos /* In other words, something like:
   4249  1.1  christos 
   4250  1.1  christos    vma_offset = m->sections[0]->vma % bed->maxpagesize;
   4251  1.1  christos    off_offset = off % bed->maxpagesize;
   4252  1.1  christos    if (vma_offset < off_offset)
   4253  1.1  christos      adjustment = vma_offset + bed->maxpagesize - off_offset;
   4254  1.1  christos    else
   4255  1.1  christos      adjustment = vma_offset - off_offset;
   4256  1.1  christos 
   4257  1.1  christos    which can can be collapsed into the expression below.  */
   4258  1.1  christos 
   4259  1.1  christos static file_ptr
   4260  1.1  christos vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
   4261  1.1  christos {
   4262  1.1  christos   return ((vma - off) % maxpagesize);
   4263  1.1  christos }
   4264  1.1  christos 
   4265  1.1  christos static void
   4266  1.1  christos print_segment_map (const struct elf_segment_map *m)
   4267  1.1  christos {
   4268  1.1  christos   unsigned int j;
   4269  1.1  christos   const char *pt = get_segment_type (m->p_type);
   4270  1.1  christos   char buf[32];
   4271  1.1  christos 
   4272  1.1  christos   if (pt == NULL)
   4273  1.1  christos     {
   4274  1.1  christos       if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
   4275  1.1  christos 	sprintf (buf, "LOPROC+%7.7x",
   4276  1.1  christos 		 (unsigned int) (m->p_type - PT_LOPROC));
   4277  1.1  christos       else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
   4278  1.1  christos 	sprintf (buf, "LOOS+%7.7x",
   4279  1.1  christos 		 (unsigned int) (m->p_type - PT_LOOS));
   4280  1.1  christos       else
   4281  1.1  christos 	snprintf (buf, sizeof (buf), "%8.8x",
   4282  1.1  christos 		  (unsigned int) m->p_type);
   4283  1.1  christos       pt = buf;
   4284  1.1  christos     }
   4285  1.1  christos   fflush (stdout);
   4286  1.1  christos   fprintf (stderr, "%s:", pt);
   4287  1.1  christos   for (j = 0; j < m->count; j++)
   4288  1.1  christos     fprintf (stderr, " %s", m->sections [j]->name);
   4289  1.1  christos   putc ('\n',stderr);
   4290  1.1  christos   fflush (stderr);
   4291  1.1  christos }
   4292  1.1  christos 
   4293  1.1  christos static bfd_boolean
   4294  1.1  christos write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
   4295  1.1  christos {
   4296  1.1  christos   void *buf;
   4297  1.1  christos   bfd_boolean ret;
   4298  1.1  christos 
   4299  1.1  christos   if (bfd_seek (abfd, pos, SEEK_SET) != 0)
   4300  1.1  christos     return FALSE;
   4301  1.1  christos   buf = bfd_zmalloc (len);
   4302  1.1  christos   if (buf == NULL)
   4303  1.1  christos     return FALSE;
   4304  1.1  christos   ret = bfd_bwrite (buf, len, abfd) == len;
   4305  1.1  christos   free (buf);
   4306  1.1  christos   return ret;
   4307  1.1  christos }
   4308  1.1  christos 
   4309  1.1  christos /* Assign file positions to the sections based on the mapping from
   4310  1.1  christos    sections to segments.  This function also sets up some fields in
   4311  1.1  christos    the file header.  */
   4312  1.1  christos 
   4313  1.1  christos static bfd_boolean
   4314  1.1  christos assign_file_positions_for_load_sections (bfd *abfd,
   4315  1.1  christos 					 struct bfd_link_info *link_info)
   4316  1.1  christos {
   4317  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   4318  1.1  christos   struct elf_segment_map *m;
   4319  1.1  christos   Elf_Internal_Phdr *phdrs;
   4320  1.1  christos   Elf_Internal_Phdr *p;
   4321  1.1  christos   file_ptr off;
   4322  1.1  christos   bfd_size_type maxpagesize;
   4323  1.1  christos   unsigned int alloc;
   4324  1.1  christos   unsigned int i, j;
   4325  1.1  christos   bfd_vma header_pad = 0;
   4326  1.1  christos 
   4327  1.1  christos   if (link_info == NULL
   4328  1.1  christos       && !_bfd_elf_map_sections_to_segments (abfd, link_info))
   4329  1.1  christos     return FALSE;
   4330  1.1  christos 
   4331  1.1  christos   alloc = 0;
   4332  1.1  christos   for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
   4333  1.1  christos     {
   4334  1.1  christos       ++alloc;
   4335  1.1  christos       if (m->header_size)
   4336  1.1  christos 	header_pad = m->header_size;
   4337  1.1  christos     }
   4338  1.1  christos 
   4339  1.1  christos   if (alloc)
   4340  1.1  christos     {
   4341  1.1  christos       elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
   4342  1.1  christos       elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
   4343  1.1  christos     }
   4344  1.1  christos   else
   4345  1.1  christos     {
   4346  1.1  christos       /* PR binutils/12467.  */
   4347  1.1  christos       elf_elfheader (abfd)->e_phoff = 0;
   4348  1.1  christos       elf_elfheader (abfd)->e_phentsize = 0;
   4349  1.1  christos     }
   4350  1.1  christos 
   4351  1.1  christos   elf_elfheader (abfd)->e_phnum = alloc;
   4352  1.1  christos 
   4353  1.1  christos   if (elf_tdata (abfd)->program_header_size == (bfd_size_type) -1)
   4354  1.1  christos     elf_tdata (abfd)->program_header_size = alloc * bed->s->sizeof_phdr;
   4355  1.1  christos   else
   4356  1.1  christos     BFD_ASSERT (elf_tdata (abfd)->program_header_size
   4357  1.1  christos 		>= alloc * bed->s->sizeof_phdr);
   4358  1.1  christos 
   4359  1.1  christos   if (alloc == 0)
   4360  1.1  christos     {
   4361  1.1  christos       elf_tdata (abfd)->next_file_pos = bed->s->sizeof_ehdr;
   4362  1.1  christos       return TRUE;
   4363  1.1  christos     }
   4364  1.1  christos 
   4365  1.1  christos   /* We're writing the size in elf_tdata (abfd)->program_header_size,
   4366  1.1  christos      see assign_file_positions_except_relocs, so make sure we have
   4367  1.1  christos      that amount allocated, with trailing space cleared.
   4368  1.1  christos      The variable alloc contains the computed need, while elf_tdata
   4369  1.1  christos      (abfd)->program_header_size contains the size used for the
   4370  1.1  christos      layout.
   4371  1.1  christos      See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
   4372  1.1  christos      where the layout is forced to according to a larger size in the
   4373  1.1  christos      last iterations for the testcase ld-elf/header.  */
   4374  1.1  christos   BFD_ASSERT (elf_tdata (abfd)->program_header_size % bed->s->sizeof_phdr
   4375  1.1  christos 	      == 0);
   4376  1.1  christos   phdrs = (Elf_Internal_Phdr *)
   4377  1.1  christos      bfd_zalloc2 (abfd,
   4378  1.1  christos                   (elf_tdata (abfd)->program_header_size / bed->s->sizeof_phdr),
   4379  1.1  christos                   sizeof (Elf_Internal_Phdr));
   4380  1.1  christos   elf_tdata (abfd)->phdr = phdrs;
   4381  1.1  christos   if (phdrs == NULL)
   4382  1.1  christos     return FALSE;
   4383  1.1  christos 
   4384  1.1  christos   maxpagesize = 1;
   4385  1.1  christos   if ((abfd->flags & D_PAGED) != 0)
   4386  1.1  christos     maxpagesize = bed->maxpagesize;
   4387  1.1  christos 
   4388  1.1  christos   off = bed->s->sizeof_ehdr;
   4389  1.1  christos   off += alloc * bed->s->sizeof_phdr;
   4390  1.1  christos   if (header_pad < (bfd_vma) off)
   4391  1.1  christos     header_pad = 0;
   4392  1.1  christos   else
   4393  1.1  christos     header_pad -= off;
   4394  1.1  christos   off += header_pad;
   4395  1.1  christos 
   4396  1.1  christos   for (m = elf_tdata (abfd)->segment_map, p = phdrs, j = 0;
   4397  1.1  christos        m != NULL;
   4398  1.1  christos        m = m->next, p++, j++)
   4399  1.1  christos     {
   4400  1.1  christos       asection **secpp;
   4401  1.1  christos       bfd_vma off_adjust;
   4402  1.1  christos       bfd_boolean no_contents;
   4403  1.1  christos 
   4404  1.1  christos       /* If elf_segment_map is not from map_sections_to_segments, the
   4405  1.1  christos 	 sections may not be correctly ordered.  NOTE: sorting should
   4406  1.1  christos 	 not be done to the PT_NOTE section of a corefile, which may
   4407  1.1  christos 	 contain several pseudo-sections artificially created by bfd.
   4408  1.1  christos 	 Sorting these pseudo-sections breaks things badly.  */
   4409  1.1  christos       if (m->count > 1
   4410  1.1  christos 	  && !(elf_elfheader (abfd)->e_type == ET_CORE
   4411  1.1  christos 	       && m->p_type == PT_NOTE))
   4412  1.1  christos 	qsort (m->sections, (size_t) m->count, sizeof (asection *),
   4413  1.1  christos 	       elf_sort_sections);
   4414  1.1  christos 
   4415  1.1  christos       /* An ELF segment (described by Elf_Internal_Phdr) may contain a
   4416  1.1  christos 	 number of sections with contents contributing to both p_filesz
   4417  1.1  christos 	 and p_memsz, followed by a number of sections with no contents
   4418  1.1  christos 	 that just contribute to p_memsz.  In this loop, OFF tracks next
   4419  1.1  christos 	 available file offset for PT_LOAD and PT_NOTE segments.  */
   4420  1.1  christos       p->p_type = m->p_type;
   4421  1.1  christos       p->p_flags = m->p_flags;
   4422  1.1  christos 
   4423  1.1  christos       if (m->count == 0)
   4424  1.1  christos 	p->p_vaddr = 0;
   4425  1.1  christos       else
   4426  1.1  christos 	p->p_vaddr = m->sections[0]->vma - m->p_vaddr_offset;
   4427  1.1  christos 
   4428  1.1  christos       if (m->p_paddr_valid)
   4429  1.1  christos 	p->p_paddr = m->p_paddr;
   4430  1.1  christos       else if (m->count == 0)
   4431  1.1  christos 	p->p_paddr = 0;
   4432  1.1  christos       else
   4433  1.1  christos 	p->p_paddr = m->sections[0]->lma - m->p_vaddr_offset;
   4434  1.1  christos 
   4435  1.1  christos       if (p->p_type == PT_LOAD
   4436  1.1  christos 	  && (abfd->flags & D_PAGED) != 0)
   4437  1.1  christos 	{
   4438  1.1  christos 	  /* p_align in demand paged PT_LOAD segments effectively stores
   4439  1.1  christos 	     the maximum page size.  When copying an executable with
   4440  1.1  christos 	     objcopy, we set m->p_align from the input file.  Use this
   4441  1.1  christos 	     value for maxpagesize rather than bed->maxpagesize, which
   4442  1.1  christos 	     may be different.  Note that we use maxpagesize for PT_TLS
   4443  1.1  christos 	     segment alignment later in this function, so we are relying
   4444  1.1  christos 	     on at least one PT_LOAD segment appearing before a PT_TLS
   4445  1.1  christos 	     segment.  */
   4446  1.1  christos 	  if (m->p_align_valid)
   4447  1.1  christos 	    maxpagesize = m->p_align;
   4448  1.1  christos 
   4449  1.1  christos 	  p->p_align = maxpagesize;
   4450  1.1  christos 	}
   4451  1.1  christos       else if (m->p_align_valid)
   4452  1.1  christos 	p->p_align = m->p_align;
   4453  1.1  christos       else if (m->count == 0)
   4454  1.1  christos 	p->p_align = 1 << bed->s->log_file_align;
   4455  1.1  christos       else
   4456  1.1  christos 	p->p_align = 0;
   4457  1.1  christos 
   4458  1.1  christos       no_contents = FALSE;
   4459  1.1  christos       off_adjust = 0;
   4460  1.1  christos       if (p->p_type == PT_LOAD
   4461  1.1  christos 	  && m->count > 0)
   4462  1.1  christos 	{
   4463  1.1  christos 	  bfd_size_type align;
   4464  1.1  christos 	  unsigned int align_power = 0;
   4465  1.1  christos 
   4466  1.1  christos 	  if (m->p_align_valid)
   4467  1.1  christos 	    align = p->p_align;
   4468  1.1  christos 	  else
   4469  1.1  christos 	    {
   4470  1.1  christos 	      for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
   4471  1.1  christos 		{
   4472  1.1  christos 		  unsigned int secalign;
   4473  1.1  christos 
   4474  1.1  christos 		  secalign = bfd_get_section_alignment (abfd, *secpp);
   4475  1.1  christos 		  if (secalign > align_power)
   4476  1.1  christos 		    align_power = secalign;
   4477  1.1  christos 		}
   4478  1.1  christos 	      align = (bfd_size_type) 1 << align_power;
   4479  1.1  christos 	      if (align < maxpagesize)
   4480  1.1  christos 		align = maxpagesize;
   4481  1.1  christos 	    }
   4482  1.1  christos 
   4483  1.1  christos 	  for (i = 0; i < m->count; i++)
   4484  1.1  christos 	    if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
   4485  1.1  christos 	      /* If we aren't making room for this section, then
   4486  1.1  christos 		 it must be SHT_NOBITS regardless of what we've
   4487  1.1  christos 		 set via struct bfd_elf_special_section.  */
   4488  1.1  christos 	      elf_section_type (m->sections[i]) = SHT_NOBITS;
   4489  1.1  christos 
   4490  1.1  christos 	  /* Find out whether this segment contains any loadable
   4491  1.1  christos 	     sections.  */
   4492  1.1  christos 	  no_contents = TRUE;
   4493  1.1  christos 	  for (i = 0; i < m->count; i++)
   4494  1.1  christos 	    if (elf_section_type (m->sections[i]) != SHT_NOBITS)
   4495  1.1  christos 	      {
   4496  1.1  christos 		no_contents = FALSE;
   4497  1.1  christos 		break;
   4498  1.1  christos 	      }
   4499  1.1  christos 
   4500  1.1  christos 	  off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
   4501  1.1  christos 	  off += off_adjust;
   4502  1.1  christos 	  if (no_contents)
   4503  1.1  christos 	    {
   4504  1.1  christos 	      /* We shouldn't need to align the segment on disk since
   4505  1.1  christos 		 the segment doesn't need file space, but the gABI
   4506  1.1  christos 		 arguably requires the alignment and glibc ld.so
   4507  1.1  christos 		 checks it.  So to comply with the alignment
   4508  1.1  christos 		 requirement but not waste file space, we adjust
   4509  1.1  christos 		 p_offset for just this segment.  (OFF_ADJUST is
   4510  1.1  christos 		 subtracted from OFF later.)  This may put p_offset
   4511  1.1  christos 		 past the end of file, but that shouldn't matter.  */
   4512  1.1  christos 	    }
   4513  1.1  christos 	  else
   4514  1.1  christos 	    off_adjust = 0;
   4515  1.1  christos 	}
   4516  1.1  christos       /* Make sure the .dynamic section is the first section in the
   4517  1.1  christos 	 PT_DYNAMIC segment.  */
   4518  1.1  christos       else if (p->p_type == PT_DYNAMIC
   4519  1.1  christos 	       && m->count > 1
   4520  1.1  christos 	       && strcmp (m->sections[0]->name, ".dynamic") != 0)
   4521  1.1  christos 	{
   4522  1.1  christos 	  _bfd_error_handler
   4523  1.1  christos 	    (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
   4524  1.1  christos 	     abfd);
   4525  1.1  christos 	  bfd_set_error (bfd_error_bad_value);
   4526  1.1  christos 	  return FALSE;
   4527  1.1  christos 	}
   4528  1.1  christos       /* Set the note section type to SHT_NOTE.  */
   4529  1.1  christos       else if (p->p_type == PT_NOTE)
   4530  1.1  christos 	for (i = 0; i < m->count; i++)
   4531  1.1  christos 	  elf_section_type (m->sections[i]) = SHT_NOTE;
   4532  1.1  christos 
   4533  1.1  christos       p->p_offset = 0;
   4534  1.1  christos       p->p_filesz = 0;
   4535  1.1  christos       p->p_memsz = 0;
   4536  1.1  christos 
   4537  1.1  christos       if (m->includes_filehdr)
   4538  1.1  christos 	{
   4539  1.1  christos 	  if (!m->p_flags_valid)
   4540  1.1  christos 	    p->p_flags |= PF_R;
   4541  1.1  christos 	  p->p_filesz = bed->s->sizeof_ehdr;
   4542  1.1  christos 	  p->p_memsz = bed->s->sizeof_ehdr;
   4543  1.1  christos 	  if (m->count > 0)
   4544  1.1  christos 	    {
   4545  1.1  christos 	      BFD_ASSERT (p->p_type == PT_LOAD);
   4546  1.1  christos 
   4547  1.1  christos 	      if (p->p_vaddr < (bfd_vma) off)
   4548  1.1  christos 		{
   4549  1.1  christos 		  (*_bfd_error_handler)
   4550  1.1  christos 		    (_("%B: Not enough room for program headers, try linking with -N"),
   4551  1.1  christos 		     abfd);
   4552  1.1  christos 		  bfd_set_error (bfd_error_bad_value);
   4553  1.1  christos 		  return FALSE;
   4554  1.1  christos 		}
   4555  1.1  christos 
   4556  1.1  christos 	      p->p_vaddr -= off;
   4557  1.1  christos 	      if (!m->p_paddr_valid)
   4558  1.1  christos 		p->p_paddr -= off;
   4559  1.1  christos 	    }
   4560  1.1  christos 	}
   4561  1.1  christos 
   4562  1.1  christos       if (m->includes_phdrs)
   4563  1.1  christos 	{
   4564  1.1  christos 	  if (!m->p_flags_valid)
   4565  1.1  christos 	    p->p_flags |= PF_R;
   4566  1.1  christos 
   4567  1.1  christos 	  if (!m->includes_filehdr)
   4568  1.1  christos 	    {
   4569  1.1  christos 	      p->p_offset = bed->s->sizeof_ehdr;
   4570  1.1  christos 
   4571  1.1  christos 	      if (m->count > 0)
   4572  1.1  christos 		{
   4573  1.1  christos 		  BFD_ASSERT (p->p_type == PT_LOAD);
   4574  1.1  christos 		  p->p_vaddr -= off - p->p_offset;
   4575  1.1  christos 		  if (!m->p_paddr_valid)
   4576  1.1  christos 		    p->p_paddr -= off - p->p_offset;
   4577  1.1  christos 		}
   4578  1.1  christos 	    }
   4579  1.1  christos 
   4580  1.1  christos 	  p->p_filesz += alloc * bed->s->sizeof_phdr;
   4581  1.1  christos 	  p->p_memsz += alloc * bed->s->sizeof_phdr;
   4582  1.1  christos 	  if (m->count)
   4583  1.1  christos 	    {
   4584  1.1  christos 	      p->p_filesz += header_pad;
   4585  1.1  christos 	      p->p_memsz += header_pad;
   4586  1.1  christos 	    }
   4587  1.1  christos 	}
   4588  1.1  christos 
   4589  1.1  christos       if (p->p_type == PT_LOAD
   4590  1.1  christos 	  || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
   4591  1.1  christos 	{
   4592  1.1  christos 	  if (!m->includes_filehdr && !m->includes_phdrs)
   4593  1.1  christos 	    p->p_offset = off;
   4594  1.1  christos 	  else
   4595  1.1  christos 	    {
   4596  1.1  christos 	      file_ptr adjust;
   4597  1.1  christos 
   4598  1.1  christos 	      adjust = off - (p->p_offset + p->p_filesz);
   4599  1.1  christos 	      if (!no_contents)
   4600  1.1  christos 		p->p_filesz += adjust;
   4601  1.1  christos 	      p->p_memsz += adjust;
   4602  1.1  christos 	    }
   4603  1.1  christos 	}
   4604  1.1  christos 
   4605  1.1  christos       /* Set up p_filesz, p_memsz, p_align and p_flags from the section
   4606  1.1  christos 	 maps.  Set filepos for sections in PT_LOAD segments, and in
   4607  1.1  christos 	 core files, for sections in PT_NOTE segments.
   4608  1.1  christos 	 assign_file_positions_for_non_load_sections will set filepos
   4609  1.1  christos 	 for other sections and update p_filesz for other segments.  */
   4610  1.1  christos       for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
   4611  1.1  christos 	{
   4612  1.1  christos 	  asection *sec;
   4613  1.1  christos 	  bfd_size_type align;
   4614  1.1  christos 	  Elf_Internal_Shdr *this_hdr;
   4615  1.1  christos 
   4616  1.1  christos 	  sec = *secpp;
   4617  1.1  christos 	  this_hdr = &elf_section_data (sec)->this_hdr;
   4618  1.1  christos 	  align = (bfd_size_type) 1 << bfd_get_section_alignment (abfd, sec);
   4619  1.1  christos 
   4620  1.1  christos 	  if ((p->p_type == PT_LOAD
   4621  1.1  christos 	       || p->p_type == PT_TLS)
   4622  1.1  christos 	      && (this_hdr->sh_type != SHT_NOBITS
   4623  1.1  christos 		  || ((this_hdr->sh_flags & SHF_ALLOC) != 0
   4624  1.1  christos 		      && ((this_hdr->sh_flags & SHF_TLS) == 0
   4625  1.1  christos 			  || p->p_type == PT_TLS))))
   4626  1.1  christos 	    {
   4627  1.1  christos 	      bfd_vma p_start = p->p_paddr;
   4628  1.1  christos 	      bfd_vma p_end = p_start + p->p_memsz;
   4629  1.1  christos 	      bfd_vma s_start = sec->lma;
   4630  1.1  christos 	      bfd_vma adjust = s_start - p_end;
   4631  1.1  christos 
   4632  1.1  christos 	      if (adjust != 0
   4633  1.1  christos 		  && (s_start < p_end
   4634  1.1  christos 		      || p_end < p_start))
   4635  1.1  christos 		{
   4636  1.1  christos 		  (*_bfd_error_handler)
   4637  1.1  christos 		    (_("%B: section %A lma %#lx adjusted to %#lx"), abfd, sec,
   4638  1.1  christos 		     (unsigned long) s_start, (unsigned long) p_end);
   4639  1.1  christos 		  adjust = 0;
   4640  1.1  christos 		  sec->lma = p_end;
   4641  1.1  christos 		}
   4642  1.1  christos 	      p->p_memsz += adjust;
   4643  1.1  christos 
   4644  1.1  christos 	      if (this_hdr->sh_type != SHT_NOBITS)
   4645  1.1  christos 		{
   4646  1.1  christos 		  if (p->p_filesz + adjust < p->p_memsz)
   4647  1.1  christos 		    {
   4648  1.1  christos 		      /* We have a PROGBITS section following NOBITS ones.
   4649  1.1  christos 		         Allocate file space for the NOBITS section(s) and
   4650  1.1  christos 			 zero it.  */
   4651  1.1  christos 		      adjust = p->p_memsz - p->p_filesz;
   4652  1.1  christos 		      if (!write_zeros (abfd, off, adjust))
   4653  1.1  christos 			return FALSE;
   4654  1.1  christos 		    }
   4655  1.1  christos 		  off += adjust;
   4656  1.1  christos 		  p->p_filesz += adjust;
   4657  1.1  christos 		}
   4658  1.1  christos 	    }
   4659  1.1  christos 
   4660  1.1  christos 	  if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
   4661  1.1  christos 	    {
   4662  1.1  christos 	      /* The section at i == 0 is the one that actually contains
   4663  1.1  christos 		 everything.  */
   4664  1.1  christos 	      if (i == 0)
   4665  1.1  christos 		{
   4666  1.1  christos 		  this_hdr->sh_offset = sec->filepos = off;
   4667  1.1  christos 		  off += this_hdr->sh_size;
   4668  1.1  christos 		  p->p_filesz = this_hdr->sh_size;
   4669  1.1  christos 		  p->p_memsz = 0;
   4670  1.1  christos 		  p->p_align = 1;
   4671  1.1  christos 		}
   4672  1.1  christos 	      else
   4673  1.1  christos 		{
   4674  1.1  christos 		  /* The rest are fake sections that shouldn't be written.  */
   4675  1.1  christos 		  sec->filepos = 0;
   4676  1.1  christos 		  sec->size = 0;
   4677  1.1  christos 		  sec->flags = 0;
   4678  1.1  christos 		  continue;
   4679  1.1  christos 		}
   4680  1.1  christos 	    }
   4681  1.1  christos 	  else
   4682  1.1  christos 	    {
   4683  1.1  christos 	      if (p->p_type == PT_LOAD)
   4684  1.1  christos 		{
   4685  1.1  christos 		  this_hdr->sh_offset = sec->filepos = off;
   4686  1.1  christos 		  if (this_hdr->sh_type != SHT_NOBITS)
   4687  1.1  christos 		    off += this_hdr->sh_size;
   4688  1.1  christos 		}
   4689  1.1  christos 
   4690  1.1  christos 	      if (this_hdr->sh_type != SHT_NOBITS)
   4691  1.1  christos 		{
   4692  1.1  christos 		  p->p_filesz += this_hdr->sh_size;
   4693  1.1  christos 		  /* A load section without SHF_ALLOC is something like
   4694  1.1  christos 		     a note section in a PT_NOTE segment.  These take
   4695  1.1  christos 		     file space but are not loaded into memory.  */
   4696  1.1  christos 		  if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
   4697  1.1  christos 		    p->p_memsz += this_hdr->sh_size;
   4698  1.1  christos 		}
   4699  1.1  christos 	      else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
   4700  1.1  christos 		{
   4701  1.1  christos 		  if (p->p_type == PT_TLS)
   4702  1.1  christos 		    p->p_memsz += this_hdr->sh_size;
   4703  1.1  christos 
   4704  1.1  christos 		  /* .tbss is special.  It doesn't contribute to p_memsz of
   4705  1.1  christos 		     normal segments.  */
   4706  1.1  christos 		  else if ((this_hdr->sh_flags & SHF_TLS) == 0)
   4707  1.1  christos 		    p->p_memsz += this_hdr->sh_size;
   4708  1.1  christos 		}
   4709  1.1  christos 
   4710  1.1  christos 	      if (align > p->p_align
   4711  1.1  christos 		  && !m->p_align_valid
   4712  1.1  christos 		  && (p->p_type != PT_LOAD
   4713  1.1  christos 		      || (abfd->flags & D_PAGED) == 0))
   4714  1.1  christos 		p->p_align = align;
   4715  1.1  christos 	    }
   4716  1.1  christos 
   4717  1.1  christos 	  if (!m->p_flags_valid)
   4718  1.1  christos 	    {
   4719  1.1  christos 	      p->p_flags |= PF_R;
   4720  1.1  christos 	      if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
   4721  1.1  christos 		p->p_flags |= PF_X;
   4722  1.1  christos 	      if ((this_hdr->sh_flags & SHF_WRITE) != 0)
   4723  1.1  christos 		p->p_flags |= PF_W;
   4724  1.1  christos 	    }
   4725  1.1  christos 	}
   4726  1.1  christos       off -= off_adjust;
   4727  1.1  christos 
   4728  1.1  christos       /* Check that all sections are in a PT_LOAD segment.
   4729  1.1  christos 	 Don't check funky gdb generated core files.  */
   4730  1.1  christos       if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
   4731  1.1  christos 	{
   4732  1.1  christos 	  bfd_boolean check_vma = TRUE;
   4733  1.1  christos 
   4734  1.1  christos 	  for (i = 1; i < m->count; i++)
   4735  1.1  christos 	    if (m->sections[i]->vma == m->sections[i - 1]->vma
   4736  1.1  christos 		&& ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
   4737  1.1  christos 				       ->this_hdr), p) != 0
   4738  1.1  christos 		&& ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
   4739  1.1  christos 				       ->this_hdr), p) != 0)
   4740  1.1  christos 	      {
   4741  1.1  christos 		/* Looks like we have overlays packed into the segment.  */
   4742  1.1  christos 		check_vma = FALSE;
   4743  1.1  christos 		break;
   4744  1.1  christos 	      }
   4745  1.1  christos 
   4746  1.1  christos 	  for (i = 0; i < m->count; i++)
   4747  1.1  christos 	    {
   4748  1.1  christos 	      Elf_Internal_Shdr *this_hdr;
   4749  1.1  christos 	      asection *sec;
   4750  1.1  christos 
   4751  1.1  christos 	      sec = m->sections[i];
   4752  1.1  christos 	      this_hdr = &(elf_section_data(sec)->this_hdr);
   4753  1.1  christos 	      if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0))
   4754  1.1  christos 		{
   4755  1.1  christos 		  (*_bfd_error_handler)
   4756  1.1  christos 		    (_("%B: section `%A' can't be allocated in segment %d"),
   4757  1.1  christos 		     abfd, sec, j);
   4758  1.1  christos 		  print_segment_map (m);
   4759  1.1  christos 		}
   4760  1.1  christos 	    }
   4761  1.1  christos 	}
   4762  1.1  christos     }
   4763  1.1  christos 
   4764  1.1  christos   elf_tdata (abfd)->next_file_pos = off;
   4765  1.1  christos   return TRUE;
   4766  1.1  christos }
   4767  1.1  christos 
   4768  1.1  christos /* Assign file positions for the other sections.  */
   4769  1.1  christos 
   4770  1.1  christos static bfd_boolean
   4771  1.1  christos assign_file_positions_for_non_load_sections (bfd *abfd,
   4772  1.1  christos 					     struct bfd_link_info *link_info)
   4773  1.1  christos {
   4774  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   4775  1.1  christos   Elf_Internal_Shdr **i_shdrpp;
   4776  1.1  christos   Elf_Internal_Shdr **hdrpp;
   4777  1.1  christos   Elf_Internal_Phdr *phdrs;
   4778  1.1  christos   Elf_Internal_Phdr *p;
   4779  1.1  christos   struct elf_segment_map *m;
   4780  1.1  christos   bfd_vma filehdr_vaddr, filehdr_paddr;
   4781  1.1  christos   bfd_vma phdrs_vaddr, phdrs_paddr;
   4782  1.1  christos   file_ptr off;
   4783  1.1  christos   unsigned int num_sec;
   4784  1.1  christos   unsigned int i;
   4785  1.1  christos   unsigned int count;
   4786  1.1  christos 
   4787  1.1  christos   i_shdrpp = elf_elfsections (abfd);
   4788  1.1  christos   num_sec = elf_numsections (abfd);
   4789  1.1  christos   off = elf_tdata (abfd)->next_file_pos;
   4790  1.1  christos   for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
   4791  1.1  christos     {
   4792  1.1  christos       struct elf_obj_tdata *tdata = elf_tdata (abfd);
   4793  1.1  christos       Elf_Internal_Shdr *hdr;
   4794  1.1  christos 
   4795  1.1  christos       hdr = *hdrpp;
   4796  1.1  christos       if (hdr->bfd_section != NULL
   4797  1.1  christos 	  && (hdr->bfd_section->filepos != 0
   4798  1.1  christos 	      || (hdr->sh_type == SHT_NOBITS
   4799  1.1  christos 		  && hdr->contents == NULL)))
   4800  1.1  christos 	BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
   4801  1.1  christos       else if ((hdr->sh_flags & SHF_ALLOC) != 0)
   4802  1.1  christos 	{
   4803  1.1  christos 	  (*_bfd_error_handler)
   4804  1.1  christos 	    (_("%B: warning: allocated section `%s' not in segment"),
   4805  1.1  christos 	     abfd,
   4806  1.1  christos 	     (hdr->bfd_section == NULL
   4807  1.1  christos 	      ? "*unknown*"
   4808  1.1  christos 	      : hdr->bfd_section->name));
   4809  1.1  christos 	  /* We don't need to page align empty sections.  */
   4810  1.1  christos 	  if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
   4811  1.1  christos 	    off += vma_page_aligned_bias (hdr->sh_addr, off,
   4812  1.1  christos 					  bed->maxpagesize);
   4813  1.1  christos 	  else
   4814  1.1  christos 	    off += vma_page_aligned_bias (hdr->sh_addr, off,
   4815  1.1  christos 					  hdr->sh_addralign);
   4816  1.1  christos 	  off = _bfd_elf_assign_file_position_for_section (hdr, off,
   4817  1.1  christos 							   FALSE);
   4818  1.1  christos 	}
   4819  1.1  christos       else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
   4820  1.1  christos 		&& hdr->bfd_section == NULL)
   4821  1.1  christos 	       || hdr == i_shdrpp[tdata->symtab_section]
   4822  1.1  christos 	       || hdr == i_shdrpp[tdata->symtab_shndx_section]
   4823  1.1  christos 	       || hdr == i_shdrpp[tdata->strtab_section])
   4824  1.1  christos 	hdr->sh_offset = -1;
   4825  1.1  christos       else
   4826  1.1  christos 	off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
   4827  1.1  christos     }
   4828  1.1  christos 
   4829  1.1  christos   /* Now that we have set the section file positions, we can set up
   4830  1.1  christos      the file positions for the non PT_LOAD segments.  */
   4831  1.1  christos   count = 0;
   4832  1.1  christos   filehdr_vaddr = 0;
   4833  1.1  christos   filehdr_paddr = 0;
   4834  1.1  christos   phdrs_vaddr = bed->maxpagesize + bed->s->sizeof_ehdr;
   4835  1.1  christos   phdrs_paddr = 0;
   4836  1.1  christos   phdrs = elf_tdata (abfd)->phdr;
   4837  1.1  christos   for (m = elf_tdata (abfd)->segment_map, p = phdrs;
   4838  1.1  christos        m != NULL;
   4839  1.1  christos        m = m->next, p++)
   4840  1.1  christos     {
   4841  1.1  christos       ++count;
   4842  1.1  christos       if (p->p_type != PT_LOAD)
   4843  1.1  christos 	continue;
   4844  1.1  christos 
   4845  1.1  christos       if (m->includes_filehdr)
   4846  1.1  christos 	{
   4847  1.1  christos 	  filehdr_vaddr = p->p_vaddr;
   4848  1.1  christos 	  filehdr_paddr = p->p_paddr;
   4849  1.1  christos 	}
   4850  1.1  christos       if (m->includes_phdrs)
   4851  1.1  christos 	{
   4852  1.1  christos 	  phdrs_vaddr = p->p_vaddr;
   4853  1.1  christos 	  phdrs_paddr = p->p_paddr;
   4854  1.1  christos 	  if (m->includes_filehdr)
   4855  1.1  christos 	    {
   4856  1.1  christos 	      phdrs_vaddr += bed->s->sizeof_ehdr;
   4857  1.1  christos 	      phdrs_paddr += bed->s->sizeof_ehdr;
   4858  1.1  christos 	    }
   4859  1.1  christos 	}
   4860  1.1  christos     }
   4861  1.1  christos 
   4862  1.1  christos   for (m = elf_tdata (abfd)->segment_map, p = phdrs;
   4863  1.1  christos        m != NULL;
   4864  1.1  christos        m = m->next, p++)
   4865  1.1  christos     {
   4866  1.1  christos       if (p->p_type == PT_GNU_RELRO)
   4867  1.1  christos 	{
   4868  1.1  christos 	  const Elf_Internal_Phdr *lp;
   4869  1.1  christos 
   4870  1.1  christos 	  BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
   4871  1.1  christos 
   4872  1.1  christos 	  if (link_info != NULL)
   4873  1.1  christos 	    {
   4874  1.1  christos 	      /* During linking the range of the RELRO segment is passed
   4875  1.1  christos 		 in link_info.  */
   4876  1.1  christos 	      for (lp = phdrs; lp < phdrs + count; ++lp)
   4877  1.1  christos 		{
   4878  1.1  christos 		  if (lp->p_type == PT_LOAD
   4879  1.1  christos 		      && lp->p_vaddr >= link_info->relro_start
   4880  1.1  christos 		      && lp->p_vaddr < link_info->relro_end
   4881  1.1  christos 		      && lp->p_vaddr + lp->p_filesz >= link_info->relro_end)
   4882  1.1  christos 		    break;
   4883  1.1  christos 		}
   4884  1.1  christos 	    }
   4885  1.1  christos 	  else
   4886  1.1  christos 	    {
   4887  1.1  christos 	      /* Otherwise we are copying an executable or shared
   4888  1.1  christos 		 library, but we need to use the same linker logic.  */
   4889  1.1  christos 	      for (lp = phdrs; lp < phdrs + count; ++lp)
   4890  1.1  christos 		{
   4891  1.1  christos 		  if (lp->p_type == PT_LOAD
   4892  1.1  christos 		      && lp->p_paddr == p->p_paddr)
   4893  1.1  christos 		    break;
   4894  1.1  christos 		}
   4895  1.1  christos 	    }
   4896  1.1  christos 
   4897  1.1  christos 	  if (lp < phdrs + count)
   4898  1.1  christos 	    {
   4899  1.1  christos 	      p->p_vaddr = lp->p_vaddr;
   4900  1.1  christos 	      p->p_paddr = lp->p_paddr;
   4901  1.1  christos 	      p->p_offset = lp->p_offset;
   4902  1.1  christos 	      if (link_info != NULL)
   4903  1.1  christos 		p->p_filesz = link_info->relro_end - lp->p_vaddr;
   4904  1.1  christos 	      else if (m->p_size_valid)
   4905  1.1  christos 		p->p_filesz = m->p_size;
   4906  1.1  christos 	      else
   4907  1.1  christos 		abort ();
   4908  1.1  christos 	      p->p_memsz = p->p_filesz;
   4909  1.1  christos 	      p->p_align = 1;
   4910  1.1  christos 	      p->p_flags = (lp->p_flags & ~PF_W);
   4911  1.1  christos 	    }
   4912  1.1  christos 	  else
   4913  1.1  christos 	    {
   4914  1.1  christos 	      memset (p, 0, sizeof *p);
   4915  1.1  christos 	      p->p_type = PT_NULL;
   4916  1.1  christos 	    }
   4917  1.1  christos 	}
   4918  1.1  christos       else if (m->count != 0)
   4919  1.1  christos 	{
   4920  1.1  christos 	  if (p->p_type != PT_LOAD
   4921  1.1  christos 	      && (p->p_type != PT_NOTE
   4922  1.1  christos 		  || bfd_get_format (abfd) != bfd_core))
   4923  1.1  christos 	    {
   4924  1.1  christos 	      Elf_Internal_Shdr *hdr;
   4925  1.1  christos 	      asection *sect;
   4926  1.1  christos 
   4927  1.1  christos 	      BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
   4928  1.1  christos 
   4929  1.1  christos 	      sect = m->sections[m->count - 1];
   4930  1.1  christos 	      hdr = &elf_section_data (sect)->this_hdr;
   4931  1.1  christos 	      p->p_filesz = sect->filepos - m->sections[0]->filepos;
   4932  1.1  christos 	      if (hdr->sh_type != SHT_NOBITS)
   4933  1.1  christos 		p->p_filesz += hdr->sh_size;
   4934  1.1  christos 	      p->p_offset = m->sections[0]->filepos;
   4935  1.1  christos 	    }
   4936  1.1  christos 	}
   4937  1.1  christos       else if (m->includes_filehdr)
   4938  1.1  christos 	{
   4939  1.1  christos 	  p->p_vaddr = filehdr_vaddr;
   4940  1.1  christos 	  if (! m->p_paddr_valid)
   4941  1.1  christos 	    p->p_paddr = filehdr_paddr;
   4942  1.1  christos 	}
   4943  1.1  christos       else if (m->includes_phdrs)
   4944  1.1  christos 	{
   4945  1.1  christos 	  p->p_vaddr = phdrs_vaddr;
   4946  1.1  christos 	  if (! m->p_paddr_valid)
   4947  1.1  christos 	    p->p_paddr = phdrs_paddr;
   4948  1.1  christos 	}
   4949  1.1  christos     }
   4950  1.1  christos 
   4951  1.1  christos   elf_tdata (abfd)->next_file_pos = off;
   4952  1.1  christos 
   4953  1.1  christos   return TRUE;
   4954  1.1  christos }
   4955  1.1  christos 
   4956  1.1  christos /* Work out the file positions of all the sections.  This is called by
   4957  1.1  christos    _bfd_elf_compute_section_file_positions.  All the section sizes and
   4958  1.1  christos    VMAs must be known before this is called.
   4959  1.1  christos 
   4960  1.1  christos    Reloc sections come in two flavours: Those processed specially as
   4961  1.1  christos    "side-channel" data attached to a section to which they apply, and
   4962  1.1  christos    those that bfd doesn't process as relocations.  The latter sort are
   4963  1.1  christos    stored in a normal bfd section by bfd_section_from_shdr.   We don't
   4964  1.1  christos    consider the former sort here, unless they form part of the loadable
   4965  1.1  christos    image.  Reloc sections not assigned here will be handled later by
   4966  1.1  christos    assign_file_positions_for_relocs.
   4967  1.1  christos 
   4968  1.1  christos    We also don't set the positions of the .symtab and .strtab here.  */
   4969  1.1  christos 
   4970  1.1  christos static bfd_boolean
   4971  1.1  christos assign_file_positions_except_relocs (bfd *abfd,
   4972  1.1  christos 				     struct bfd_link_info *link_info)
   4973  1.1  christos {
   4974  1.1  christos   struct elf_obj_tdata *tdata = elf_tdata (abfd);
   4975  1.1  christos   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
   4976  1.1  christos   file_ptr off;
   4977  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   4978  1.1  christos 
   4979  1.1  christos   if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
   4980  1.1  christos       && bfd_get_format (abfd) != bfd_core)
   4981  1.1  christos     {
   4982  1.1  christos       Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
   4983  1.1  christos       unsigned int num_sec = elf_numsections (abfd);
   4984  1.1  christos       Elf_Internal_Shdr **hdrpp;
   4985  1.1  christos       unsigned int i;
   4986  1.1  christos 
   4987  1.1  christos       /* Start after the ELF header.  */
   4988  1.1  christos       off = i_ehdrp->e_ehsize;
   4989  1.1  christos 
   4990  1.1  christos       /* We are not creating an executable, which means that we are
   4991  1.1  christos 	 not creating a program header, and that the actual order of
   4992  1.1  christos 	 the sections in the file is unimportant.  */
   4993  1.1  christos       for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
   4994  1.1  christos 	{
   4995  1.1  christos 	  Elf_Internal_Shdr *hdr;
   4996  1.1  christos 
   4997  1.1  christos 	  hdr = *hdrpp;
   4998  1.1  christos 	  if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
   4999  1.1  christos 	       && hdr->bfd_section == NULL)
   5000  1.1  christos 	      || i == tdata->symtab_section
   5001  1.1  christos 	      || i == tdata->symtab_shndx_section
   5002  1.1  christos 	      || i == tdata->strtab_section)
   5003  1.1  christos 	    {
   5004  1.1  christos 	      hdr->sh_offset = -1;
   5005  1.1  christos 	    }
   5006  1.1  christos 	  else
   5007  1.1  christos 	    off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
   5008  1.1  christos 	}
   5009  1.1  christos     }
   5010  1.1  christos   else
   5011  1.1  christos     {
   5012  1.1  christos       unsigned int alloc;
   5013  1.1  christos 
   5014  1.1  christos       /* Assign file positions for the loaded sections based on the
   5015  1.1  christos 	 assignment of sections to segments.  */
   5016  1.1  christos       if (!assign_file_positions_for_load_sections (abfd, link_info))
   5017  1.1  christos 	return FALSE;
   5018  1.1  christos 
   5019  1.1  christos       /* And for non-load sections.  */
   5020  1.1  christos       if (!assign_file_positions_for_non_load_sections (abfd, link_info))
   5021  1.1  christos 	return FALSE;
   5022  1.1  christos 
   5023  1.1  christos       if (bed->elf_backend_modify_program_headers != NULL)
   5024  1.1  christos 	{
   5025  1.1  christos 	  if (!(*bed->elf_backend_modify_program_headers) (abfd, link_info))
   5026  1.1  christos 	    return FALSE;
   5027  1.1  christos 	}
   5028  1.1  christos 
   5029  1.1  christos       /* Write out the program headers.  */
   5030  1.1  christos       alloc = tdata->program_header_size / bed->s->sizeof_phdr;
   5031  1.1  christos       if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
   5032  1.1  christos 	  || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
   5033  1.1  christos 	return FALSE;
   5034  1.1  christos 
   5035  1.1  christos       off = tdata->next_file_pos;
   5036  1.1  christos     }
   5037  1.1  christos 
   5038  1.1  christos   /* Place the section headers.  */
   5039  1.1  christos   off = align_file_position (off, 1 << bed->s->log_file_align);
   5040  1.1  christos   i_ehdrp->e_shoff = off;
   5041  1.1  christos   off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
   5042  1.1  christos 
   5043  1.1  christos   tdata->next_file_pos = off;
   5044  1.1  christos 
   5045  1.1  christos   return TRUE;
   5046  1.1  christos }
   5047  1.1  christos 
   5048  1.1  christos static bfd_boolean
   5049  1.1  christos prep_headers (bfd *abfd)
   5050  1.1  christos {
   5051  1.1  christos   Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form.  */
   5052  1.1  christos   struct elf_strtab_hash *shstrtab;
   5053  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   5054  1.1  christos 
   5055  1.1  christos   i_ehdrp = elf_elfheader (abfd);
   5056  1.1  christos 
   5057  1.1  christos   shstrtab = _bfd_elf_strtab_init ();
   5058  1.1  christos   if (shstrtab == NULL)
   5059  1.1  christos     return FALSE;
   5060  1.1  christos 
   5061  1.1  christos   elf_shstrtab (abfd) = shstrtab;
   5062  1.1  christos 
   5063  1.1  christos   i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
   5064  1.1  christos   i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
   5065  1.1  christos   i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
   5066  1.1  christos   i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
   5067  1.1  christos 
   5068  1.1  christos   i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
   5069  1.1  christos   i_ehdrp->e_ident[EI_DATA] =
   5070  1.1  christos     bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
   5071  1.1  christos   i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
   5072  1.1  christos 
   5073  1.1  christos   if ((abfd->flags & DYNAMIC) != 0)
   5074  1.1  christos     i_ehdrp->e_type = ET_DYN;
   5075  1.1  christos   else if ((abfd->flags & EXEC_P) != 0)
   5076  1.1  christos     i_ehdrp->e_type = ET_EXEC;
   5077  1.1  christos   else if (bfd_get_format (abfd) == bfd_core)
   5078  1.1  christos     i_ehdrp->e_type = ET_CORE;
   5079  1.1  christos   else
   5080  1.1  christos     i_ehdrp->e_type = ET_REL;
   5081  1.1  christos 
   5082  1.1  christos   switch (bfd_get_arch (abfd))
   5083  1.1  christos     {
   5084  1.1  christos     case bfd_arch_unknown:
   5085  1.1  christos       i_ehdrp->e_machine = EM_NONE;
   5086  1.1  christos       break;
   5087  1.1  christos 
   5088  1.1  christos       /* There used to be a long list of cases here, each one setting
   5089  1.1  christos 	 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
   5090  1.1  christos 	 in the corresponding bfd definition.  To avoid duplication,
   5091  1.1  christos 	 the switch was removed.  Machines that need special handling
   5092  1.1  christos 	 can generally do it in elf_backend_final_write_processing(),
   5093  1.1  christos 	 unless they need the information earlier than the final write.
   5094  1.1  christos 	 Such need can generally be supplied by replacing the tests for
   5095  1.1  christos 	 e_machine with the conditions used to determine it.  */
   5096  1.1  christos     default:
   5097  1.1  christos       i_ehdrp->e_machine = bed->elf_machine_code;
   5098  1.1  christos     }
   5099  1.1  christos 
   5100  1.1  christos   i_ehdrp->e_version = bed->s->ev_current;
   5101  1.1  christos   i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
   5102  1.1  christos 
   5103  1.1  christos   /* No program header, for now.  */
   5104  1.1  christos   i_ehdrp->e_phoff = 0;
   5105  1.1  christos   i_ehdrp->e_phentsize = 0;
   5106  1.1  christos   i_ehdrp->e_phnum = 0;
   5107  1.1  christos 
   5108  1.1  christos   /* Each bfd section is section header entry.  */
   5109  1.1  christos   i_ehdrp->e_entry = bfd_get_start_address (abfd);
   5110  1.1  christos   i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
   5111  1.1  christos 
   5112  1.1  christos   /* If we're building an executable, we'll need a program header table.  */
   5113  1.1  christos   if (abfd->flags & EXEC_P)
   5114  1.1  christos     /* It all happens later.  */
   5115  1.1  christos     ;
   5116  1.1  christos   else
   5117  1.1  christos     {
   5118  1.1  christos       i_ehdrp->e_phentsize = 0;
   5119  1.1  christos       i_ehdrp->e_phoff = 0;
   5120  1.1  christos     }
   5121  1.1  christos 
   5122  1.1  christos   elf_tdata (abfd)->symtab_hdr.sh_name =
   5123  1.1  christos     (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
   5124  1.1  christos   elf_tdata (abfd)->strtab_hdr.sh_name =
   5125  1.1  christos     (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
   5126  1.1  christos   elf_tdata (abfd)->shstrtab_hdr.sh_name =
   5127  1.1  christos     (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
   5128  1.1  christos   if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
   5129  1.1  christos       || elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
   5130  1.1  christos       || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
   5131  1.1  christos     return FALSE;
   5132  1.1  christos 
   5133  1.1  christos   return TRUE;
   5134  1.1  christos }
   5135  1.1  christos 
   5136  1.1  christos /* Assign file positions for all the reloc sections which are not part
   5137  1.1  christos    of the loadable file image.  */
   5138  1.1  christos 
   5139  1.1  christos void
   5140  1.1  christos _bfd_elf_assign_file_positions_for_relocs (bfd *abfd)
   5141  1.1  christos {
   5142  1.1  christos   file_ptr off;
   5143  1.1  christos   unsigned int i, num_sec;
   5144  1.1  christos   Elf_Internal_Shdr **shdrpp;
   5145  1.1  christos 
   5146  1.1  christos   off = elf_tdata (abfd)->next_file_pos;
   5147  1.1  christos 
   5148  1.1  christos   num_sec = elf_numsections (abfd);
   5149  1.1  christos   for (i = 1, shdrpp = elf_elfsections (abfd) + 1; i < num_sec; i++, shdrpp++)
   5150  1.1  christos     {
   5151  1.1  christos       Elf_Internal_Shdr *shdrp;
   5152  1.1  christos 
   5153  1.1  christos       shdrp = *shdrpp;
   5154  1.1  christos       if ((shdrp->sh_type == SHT_REL || shdrp->sh_type == SHT_RELA)
   5155  1.1  christos 	  && shdrp->sh_offset == -1)
   5156  1.1  christos 	off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
   5157  1.1  christos     }
   5158  1.1  christos 
   5159  1.1  christos   elf_tdata (abfd)->next_file_pos = off;
   5160  1.1  christos }
   5161  1.1  christos 
   5162  1.1  christos bfd_boolean
   5163  1.1  christos _bfd_elf_write_object_contents (bfd *abfd)
   5164  1.1  christos {
   5165  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   5166  1.1  christos   Elf_Internal_Shdr **i_shdrp;
   5167  1.1  christos   bfd_boolean failed;
   5168  1.1  christos   unsigned int count, num_sec;
   5169  1.1  christos 
   5170  1.1  christos   if (! abfd->output_has_begun
   5171  1.1  christos       && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
   5172  1.1  christos     return FALSE;
   5173  1.1  christos 
   5174  1.1  christos   i_shdrp = elf_elfsections (abfd);
   5175  1.1  christos 
   5176  1.1  christos   failed = FALSE;
   5177  1.1  christos   bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
   5178  1.1  christos   if (failed)
   5179  1.1  christos     return FALSE;
   5180  1.1  christos 
   5181  1.1  christos   _bfd_elf_assign_file_positions_for_relocs (abfd);
   5182  1.1  christos 
   5183  1.1  christos   /* After writing the headers, we need to write the sections too...  */
   5184  1.1  christos   num_sec = elf_numsections (abfd);
   5185  1.1  christos   for (count = 1; count < num_sec; count++)
   5186  1.1  christos     {
   5187  1.1  christos       if (bed->elf_backend_section_processing)
   5188  1.1  christos 	(*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
   5189  1.1  christos       if (i_shdrp[count]->contents)
   5190  1.1  christos 	{
   5191  1.1  christos 	  bfd_size_type amt = i_shdrp[count]->sh_size;
   5192  1.1  christos 
   5193  1.1  christos 	  if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
   5194  1.1  christos 	      || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
   5195  1.1  christos 	    return FALSE;
   5196  1.1  christos 	}
   5197  1.1  christos     }
   5198  1.1  christos 
   5199  1.1  christos   /* Write out the section header names.  */
   5200  1.1  christos   if (elf_shstrtab (abfd) != NULL
   5201  1.1  christos       && (bfd_seek (abfd, elf_tdata (abfd)->shstrtab_hdr.sh_offset, SEEK_SET) != 0
   5202  1.1  christos 	  || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
   5203  1.1  christos     return FALSE;
   5204  1.1  christos 
   5205  1.1  christos   if (bed->elf_backend_final_write_processing)
   5206  1.1  christos     (*bed->elf_backend_final_write_processing) (abfd,
   5207  1.1  christos 						elf_tdata (abfd)->linker);
   5208  1.1  christos 
   5209  1.1  christos   if (!bed->s->write_shdrs_and_ehdr (abfd))
   5210  1.1  christos     return FALSE;
   5211  1.1  christos 
   5212  1.1  christos   /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0].  */
   5213  1.1  christos   if (elf_tdata (abfd)->after_write_object_contents)
   5214  1.1  christos     return (*elf_tdata (abfd)->after_write_object_contents) (abfd);
   5215  1.1  christos 
   5216  1.1  christos   return TRUE;
   5217  1.1  christos }
   5218  1.1  christos 
   5219  1.1  christos bfd_boolean
   5220  1.1  christos _bfd_elf_write_corefile_contents (bfd *abfd)
   5221  1.1  christos {
   5222  1.1  christos   /* Hopefully this can be done just like an object file.  */
   5223  1.1  christos   return _bfd_elf_write_object_contents (abfd);
   5224  1.1  christos }
   5225  1.1  christos 
   5226  1.1  christos /* Given a section, search the header to find them.  */
   5227  1.1  christos 
   5228  1.1  christos unsigned int
   5229  1.1  christos _bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
   5230  1.1  christos {
   5231  1.1  christos   const struct elf_backend_data *bed;
   5232  1.1  christos   unsigned int sec_index;
   5233  1.1  christos 
   5234  1.1  christos   if (elf_section_data (asect) != NULL
   5235  1.1  christos       && elf_section_data (asect)->this_idx != 0)
   5236  1.1  christos     return elf_section_data (asect)->this_idx;
   5237  1.1  christos 
   5238  1.1  christos   if (bfd_is_abs_section (asect))
   5239  1.1  christos     sec_index = SHN_ABS;
   5240  1.1  christos   else if (bfd_is_com_section (asect))
   5241  1.1  christos     sec_index = SHN_COMMON;
   5242  1.1  christos   else if (bfd_is_und_section (asect))
   5243  1.1  christos     sec_index = SHN_UNDEF;
   5244  1.1  christos   else
   5245  1.1  christos     sec_index = SHN_BAD;
   5246  1.1  christos 
   5247  1.1  christos   bed = get_elf_backend_data (abfd);
   5248  1.1  christos   if (bed->elf_backend_section_from_bfd_section)
   5249  1.1  christos     {
   5250  1.1  christos       int retval = sec_index;
   5251  1.1  christos 
   5252  1.1  christos       if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
   5253  1.1  christos 	return retval;
   5254  1.1  christos     }
   5255  1.1  christos 
   5256  1.1  christos   if (sec_index == SHN_BAD)
   5257  1.1  christos     bfd_set_error (bfd_error_nonrepresentable_section);
   5258  1.1  christos 
   5259  1.1  christos   return sec_index;
   5260  1.1  christos }
   5261  1.1  christos 
   5262  1.1  christos /* Given a BFD symbol, return the index in the ELF symbol table, or -1
   5263  1.1  christos    on error.  */
   5264  1.1  christos 
   5265  1.1  christos int
   5266  1.1  christos _bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
   5267  1.1  christos {
   5268  1.1  christos   asymbol *asym_ptr = *asym_ptr_ptr;
   5269  1.1  christos   int idx;
   5270  1.1  christos   flagword flags = asym_ptr->flags;
   5271  1.1  christos 
   5272  1.1  christos   /* When gas creates relocations against local labels, it creates its
   5273  1.1  christos      own symbol for the section, but does put the symbol into the
   5274  1.1  christos      symbol chain, so udata is 0.  When the linker is generating
   5275  1.1  christos      relocatable output, this section symbol may be for one of the
   5276  1.1  christos      input sections rather than the output section.  */
   5277  1.1  christos   if (asym_ptr->udata.i == 0
   5278  1.1  christos       && (flags & BSF_SECTION_SYM)
   5279  1.1  christos       && asym_ptr->section)
   5280  1.1  christos     {
   5281  1.1  christos       asection *sec;
   5282  1.1  christos       int indx;
   5283  1.1  christos 
   5284  1.1  christos       sec = asym_ptr->section;
   5285  1.1  christos       if (sec->owner != abfd && sec->output_section != NULL)
   5286  1.1  christos 	sec = sec->output_section;
   5287  1.1  christos       if (sec->owner == abfd
   5288  1.1  christos 	  && (indx = sec->index) < elf_num_section_syms (abfd)
   5289  1.1  christos 	  && elf_section_syms (abfd)[indx] != NULL)
   5290  1.1  christos 	asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
   5291  1.1  christos     }
   5292  1.1  christos 
   5293  1.1  christos   idx = asym_ptr->udata.i;
   5294  1.1  christos 
   5295  1.1  christos   if (idx == 0)
   5296  1.1  christos     {
   5297  1.1  christos       /* This case can occur when using --strip-symbol on a symbol
   5298  1.1  christos 	 which is used in a relocation entry.  */
   5299  1.1  christos       (*_bfd_error_handler)
   5300  1.1  christos 	(_("%B: symbol `%s' required but not present"),
   5301  1.1  christos 	 abfd, bfd_asymbol_name (asym_ptr));
   5302  1.1  christos       bfd_set_error (bfd_error_no_symbols);
   5303  1.1  christos       return -1;
   5304  1.1  christos     }
   5305  1.1  christos 
   5306  1.1  christos #if DEBUG & 4
   5307  1.1  christos   {
   5308  1.1  christos     fprintf (stderr,
   5309  1.1  christos 	     "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx\n",
   5310  1.1  christos 	     (long) asym_ptr, asym_ptr->name, idx, (long) flags);
   5311  1.1  christos     fflush (stderr);
   5312  1.1  christos   }
   5313  1.1  christos #endif
   5314  1.1  christos 
   5315  1.1  christos   return idx;
   5316  1.1  christos }
   5317  1.1  christos 
   5318  1.1  christos /* Rewrite program header information.  */
   5319  1.1  christos 
   5320  1.1  christos static bfd_boolean
   5321  1.1  christos rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
   5322  1.1  christos {
   5323  1.1  christos   Elf_Internal_Ehdr *iehdr;
   5324  1.1  christos   struct elf_segment_map *map;
   5325  1.1  christos   struct elf_segment_map *map_first;
   5326  1.1  christos   struct elf_segment_map **pointer_to_map;
   5327  1.1  christos   Elf_Internal_Phdr *segment;
   5328  1.1  christos   asection *section;
   5329  1.1  christos   unsigned int i;
   5330  1.1  christos   unsigned int num_segments;
   5331  1.1  christos   bfd_boolean phdr_included = FALSE;
   5332  1.1  christos   bfd_boolean p_paddr_valid;
   5333  1.1  christos   bfd_vma maxpagesize;
   5334  1.1  christos   struct elf_segment_map *phdr_adjust_seg = NULL;
   5335  1.1  christos   unsigned int phdr_adjust_num = 0;
   5336  1.1  christos   const struct elf_backend_data *bed;
   5337  1.1  christos 
   5338  1.1  christos   bed = get_elf_backend_data (ibfd);
   5339  1.1  christos   iehdr = elf_elfheader (ibfd);
   5340  1.1  christos 
   5341  1.1  christos   map_first = NULL;
   5342  1.1  christos   pointer_to_map = &map_first;
   5343  1.1  christos 
   5344  1.1  christos   num_segments = elf_elfheader (ibfd)->e_phnum;
   5345  1.1  christos   maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
   5346  1.1  christos 
   5347  1.1  christos   /* Returns the end address of the segment + 1.  */
   5348  1.1  christos #define SEGMENT_END(segment, start)					\
   5349  1.1  christos   (start + (segment->p_memsz > segment->p_filesz			\
   5350  1.1  christos 	    ? segment->p_memsz : segment->p_filesz))
   5351  1.1  christos 
   5352  1.1  christos #define SECTION_SIZE(section, segment)					\
   5353  1.1  christos   (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL))		\
   5354  1.1  christos     != SEC_THREAD_LOCAL || segment->p_type == PT_TLS)			\
   5355  1.1  christos    ? section->size : 0)
   5356  1.1  christos 
   5357  1.1  christos   /* Returns TRUE if the given section is contained within
   5358  1.1  christos      the given segment.  VMA addresses are compared.  */
   5359  1.1  christos #define IS_CONTAINED_BY_VMA(section, segment)				\
   5360  1.1  christos   (section->vma >= segment->p_vaddr					\
   5361  1.1  christos    && (section->vma + SECTION_SIZE (section, segment)			\
   5362  1.1  christos        <= (SEGMENT_END (segment, segment->p_vaddr))))
   5363  1.1  christos 
   5364  1.1  christos   /* Returns TRUE if the given section is contained within
   5365  1.1  christos      the given segment.  LMA addresses are compared.  */
   5366  1.1  christos #define IS_CONTAINED_BY_LMA(section, segment, base)			\
   5367  1.1  christos   (section->lma >= base							\
   5368  1.1  christos    && (section->lma + SECTION_SIZE (section, segment)			\
   5369  1.1  christos        <= SEGMENT_END (segment, base)))
   5370  1.1  christos 
   5371  1.1  christos   /* Handle PT_NOTE segment.  */
   5372  1.1  christos #define IS_NOTE(p, s)							\
   5373  1.1  christos   (p->p_type == PT_NOTE							\
   5374  1.1  christos    && elf_section_type (s) == SHT_NOTE					\
   5375  1.1  christos    && (bfd_vma) s->filepos >= p->p_offset				\
   5376  1.1  christos    && ((bfd_vma) s->filepos + s->size					\
   5377  1.1  christos        <= p->p_offset + p->p_filesz))
   5378  1.1  christos 
   5379  1.1  christos   /* Special case: corefile "NOTE" section containing regs, prpsinfo
   5380  1.1  christos      etc.  */
   5381  1.1  christos #define IS_COREFILE_NOTE(p, s)						\
   5382  1.1  christos   (IS_NOTE (p, s)							\
   5383  1.1  christos    && bfd_get_format (ibfd) == bfd_core					\
   5384  1.1  christos    && s->vma == 0							\
   5385  1.1  christos    && s->lma == 0)
   5386  1.1  christos 
   5387  1.1  christos   /* The complicated case when p_vaddr is 0 is to handle the Solaris
   5388  1.1  christos      linker, which generates a PT_INTERP section with p_vaddr and
   5389  1.1  christos      p_memsz set to 0.  */
   5390  1.1  christos #define IS_SOLARIS_PT_INTERP(p, s)					\
   5391  1.1  christos   (p->p_vaddr == 0							\
   5392  1.1  christos    && p->p_paddr == 0							\
   5393  1.1  christos    && p->p_memsz == 0							\
   5394  1.1  christos    && p->p_filesz > 0							\
   5395  1.1  christos    && (s->flags & SEC_HAS_CONTENTS) != 0				\
   5396  1.1  christos    && s->size > 0							\
   5397  1.1  christos    && (bfd_vma) s->filepos >= p->p_offset				\
   5398  1.1  christos    && ((bfd_vma) s->filepos + s->size					\
   5399  1.1  christos        <= p->p_offset + p->p_filesz))
   5400  1.1  christos 
   5401  1.1  christos   /* Decide if the given section should be included in the given segment.
   5402  1.1  christos      A section will be included if:
   5403  1.1  christos        1. It is within the address space of the segment -- we use the LMA
   5404  1.1  christos 	  if that is set for the segment and the VMA otherwise,
   5405  1.1  christos        2. It is an allocated section or a NOTE section in a PT_NOTE
   5406  1.1  christos 	  segment.
   5407  1.1  christos        3. There is an output section associated with it,
   5408  1.1  christos        4. The section has not already been allocated to a previous segment.
   5409  1.1  christos        5. PT_GNU_STACK segments do not include any sections.
   5410  1.1  christos        6. PT_TLS segment includes only SHF_TLS sections.
   5411  1.1  christos        7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
   5412  1.1  christos        8. PT_DYNAMIC should not contain empty sections at the beginning
   5413  1.1  christos 	  (with the possible exception of .dynamic).  */
   5414  1.1  christos #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed)		\
   5415  1.1  christos   ((((segment->p_paddr							\
   5416  1.1  christos       ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr)	\
   5417  1.1  christos       : IS_CONTAINED_BY_VMA (section, segment))				\
   5418  1.1  christos      && (section->flags & SEC_ALLOC) != 0)				\
   5419  1.1  christos     || IS_NOTE (segment, section))					\
   5420  1.1  christos    && segment->p_type != PT_GNU_STACK					\
   5421  1.1  christos    && (segment->p_type != PT_TLS					\
   5422  1.1  christos        || (section->flags & SEC_THREAD_LOCAL))				\
   5423  1.1  christos    && (segment->p_type == PT_LOAD					\
   5424  1.1  christos        || segment->p_type == PT_TLS					\
   5425  1.1  christos        || (section->flags & SEC_THREAD_LOCAL) == 0)			\
   5426  1.1  christos    && (segment->p_type != PT_DYNAMIC					\
   5427  1.1  christos        || SECTION_SIZE (section, segment) > 0				\
   5428  1.1  christos        || (segment->p_paddr						\
   5429  1.1  christos 	   ? segment->p_paddr != section->lma				\
   5430  1.1  christos 	   : segment->p_vaddr != section->vma)				\
   5431  1.1  christos        || (strcmp (bfd_get_section_name (ibfd, section), ".dynamic")	\
   5432  1.1  christos 	   == 0))							\
   5433  1.1  christos    && !section->segment_mark)
   5434  1.1  christos 
   5435  1.1  christos /* If the output section of a section in the input segment is NULL,
   5436  1.1  christos    it is removed from the corresponding output segment.   */
   5437  1.1  christos #define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed)		\
   5438  1.1  christos   (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed)		\
   5439  1.1  christos    && section->output_section != NULL)
   5440  1.1  christos 
   5441  1.1  christos   /* Returns TRUE iff seg1 starts after the end of seg2.  */
   5442  1.1  christos #define SEGMENT_AFTER_SEGMENT(seg1, seg2, field)			\
   5443  1.1  christos   (seg1->field >= SEGMENT_END (seg2, seg2->field))
   5444  1.1  christos 
   5445  1.1  christos   /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
   5446  1.1  christos      their VMA address ranges and their LMA address ranges overlap.
   5447  1.1  christos      It is possible to have overlapping VMA ranges without overlapping LMA
   5448  1.1  christos      ranges.  RedBoot images for example can have both .data and .bss mapped
   5449  1.1  christos      to the same VMA range, but with the .data section mapped to a different
   5450  1.1  christos      LMA.  */
   5451  1.1  christos #define SEGMENT_OVERLAPS(seg1, seg2)					\
   5452  1.1  christos   (   !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr)			\
   5453  1.1  christos 	|| SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr))			\
   5454  1.1  christos    && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr)			\
   5455  1.1  christos 	|| SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
   5456  1.1  christos 
   5457  1.1  christos   /* Initialise the segment mark field.  */
   5458  1.1  christos   for (section = ibfd->sections; section != NULL; section = section->next)
   5459  1.1  christos     section->segment_mark = FALSE;
   5460  1.1  christos 
   5461  1.1  christos   /* The Solaris linker creates program headers in which all the
   5462  1.1  christos      p_paddr fields are zero.  When we try to objcopy or strip such a
   5463  1.1  christos      file, we get confused.  Check for this case, and if we find it
   5464  1.1  christos      don't set the p_paddr_valid fields.  */
   5465  1.1  christos   p_paddr_valid = FALSE;
   5466  1.1  christos   for (i = 0, segment = elf_tdata (ibfd)->phdr;
   5467  1.1  christos        i < num_segments;
   5468  1.1  christos        i++, segment++)
   5469  1.1  christos     if (segment->p_paddr != 0)
   5470  1.1  christos       {
   5471  1.1  christos 	p_paddr_valid = TRUE;
   5472  1.1  christos 	break;
   5473  1.1  christos       }
   5474  1.1  christos 
   5475  1.1  christos   /* Scan through the segments specified in the program header
   5476  1.1  christos      of the input BFD.  For this first scan we look for overlaps
   5477  1.1  christos      in the loadable segments.  These can be created by weird
   5478  1.1  christos      parameters to objcopy.  Also, fix some solaris weirdness.  */
   5479  1.1  christos   for (i = 0, segment = elf_tdata (ibfd)->phdr;
   5480  1.1  christos        i < num_segments;
   5481  1.1  christos        i++, segment++)
   5482  1.1  christos     {
   5483  1.1  christos       unsigned int j;
   5484  1.1  christos       Elf_Internal_Phdr *segment2;
   5485  1.1  christos 
   5486  1.1  christos       if (segment->p_type == PT_INTERP)
   5487  1.1  christos 	for (section = ibfd->sections; section; section = section->next)
   5488  1.1  christos 	  if (IS_SOLARIS_PT_INTERP (segment, section))
   5489  1.1  christos 	    {
   5490  1.1  christos 	      /* Mininal change so that the normal section to segment
   5491  1.1  christos 		 assignment code will work.  */
   5492  1.1  christos 	      segment->p_vaddr = section->vma;
   5493  1.1  christos 	      break;
   5494  1.1  christos 	    }
   5495  1.1  christos 
   5496  1.1  christos       if (segment->p_type != PT_LOAD)
   5497  1.1  christos 	{
   5498  1.1  christos 	  /* Remove PT_GNU_RELRO segment.  */
   5499  1.1  christos 	  if (segment->p_type == PT_GNU_RELRO)
   5500  1.1  christos 	    segment->p_type = PT_NULL;
   5501  1.1  christos 	  continue;
   5502  1.1  christos 	}
   5503  1.1  christos 
   5504  1.1  christos       /* Determine if this segment overlaps any previous segments.  */
   5505  1.1  christos       for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
   5506  1.1  christos 	{
   5507  1.1  christos 	  bfd_signed_vma extra_length;
   5508  1.1  christos 
   5509  1.1  christos 	  if (segment2->p_type != PT_LOAD
   5510  1.1  christos 	      || !SEGMENT_OVERLAPS (segment, segment2))
   5511  1.1  christos 	    continue;
   5512  1.1  christos 
   5513  1.1  christos 	  /* Merge the two segments together.  */
   5514  1.1  christos 	  if (segment2->p_vaddr < segment->p_vaddr)
   5515  1.1  christos 	    {
   5516  1.1  christos 	      /* Extend SEGMENT2 to include SEGMENT and then delete
   5517  1.1  christos 		 SEGMENT.  */
   5518  1.1  christos 	      extra_length = (SEGMENT_END (segment, segment->p_vaddr)
   5519  1.1  christos 			      - SEGMENT_END (segment2, segment2->p_vaddr));
   5520  1.1  christos 
   5521  1.1  christos 	      if (extra_length > 0)
   5522  1.1  christos 		{
   5523  1.1  christos 		  segment2->p_memsz += extra_length;
   5524  1.1  christos 		  segment2->p_filesz += extra_length;
   5525  1.1  christos 		}
   5526  1.1  christos 
   5527  1.1  christos 	      segment->p_type = PT_NULL;
   5528  1.1  christos 
   5529  1.1  christos 	      /* Since we have deleted P we must restart the outer loop.  */
   5530  1.1  christos 	      i = 0;
   5531  1.1  christos 	      segment = elf_tdata (ibfd)->phdr;
   5532  1.1  christos 	      break;
   5533  1.1  christos 	    }
   5534  1.1  christos 	  else
   5535  1.1  christos 	    {
   5536  1.1  christos 	      /* Extend SEGMENT to include SEGMENT2 and then delete
   5537  1.1  christos 		 SEGMENT2.  */
   5538  1.1  christos 	      extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
   5539  1.1  christos 			      - SEGMENT_END (segment, segment->p_vaddr));
   5540  1.1  christos 
   5541  1.1  christos 	      if (extra_length > 0)
   5542  1.1  christos 		{
   5543  1.1  christos 		  segment->p_memsz += extra_length;
   5544  1.1  christos 		  segment->p_filesz += extra_length;
   5545  1.1  christos 		}
   5546  1.1  christos 
   5547  1.1  christos 	      segment2->p_type = PT_NULL;
   5548  1.1  christos 	    }
   5549  1.1  christos 	}
   5550  1.1  christos     }
   5551  1.1  christos 
   5552  1.1  christos   /* The second scan attempts to assign sections to segments.  */
   5553  1.1  christos   for (i = 0, segment = elf_tdata (ibfd)->phdr;
   5554  1.1  christos        i < num_segments;
   5555  1.1  christos        i++, segment++)
   5556  1.1  christos     {
   5557  1.1  christos       unsigned int section_count;
   5558  1.1  christos       asection **sections;
   5559  1.1  christos       asection *output_section;
   5560  1.1  christos       unsigned int isec;
   5561  1.1  christos       bfd_vma matching_lma;
   5562  1.1  christos       bfd_vma suggested_lma;
   5563  1.1  christos       unsigned int j;
   5564  1.1  christos       bfd_size_type amt;
   5565  1.1  christos       asection *first_section;
   5566  1.1  christos       bfd_boolean first_matching_lma;
   5567  1.1  christos       bfd_boolean first_suggested_lma;
   5568  1.1  christos 
   5569  1.1  christos       if (segment->p_type == PT_NULL)
   5570  1.1  christos 	continue;
   5571  1.1  christos 
   5572  1.1  christos       first_section = NULL;
   5573  1.1  christos       /* Compute how many sections might be placed into this segment.  */
   5574  1.1  christos       for (section = ibfd->sections, section_count = 0;
   5575  1.1  christos 	   section != NULL;
   5576  1.1  christos 	   section = section->next)
   5577  1.1  christos 	{
   5578  1.1  christos 	  /* Find the first section in the input segment, which may be
   5579  1.1  christos 	     removed from the corresponding output segment.   */
   5580  1.1  christos 	  if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
   5581  1.1  christos 	    {
   5582  1.1  christos 	      if (first_section == NULL)
   5583  1.1  christos 		first_section = section;
   5584  1.1  christos 	      if (section->output_section != NULL)
   5585  1.1  christos 		++section_count;
   5586  1.1  christos 	    }
   5587  1.1  christos 	}
   5588  1.1  christos 
   5589  1.1  christos       /* Allocate a segment map big enough to contain
   5590  1.1  christos 	 all of the sections we have selected.  */
   5591  1.1  christos       amt = sizeof (struct elf_segment_map);
   5592  1.1  christos       amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
   5593  1.1  christos       map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
   5594  1.1  christos       if (map == NULL)
   5595  1.1  christos 	return FALSE;
   5596  1.1  christos 
   5597  1.1  christos       /* Initialise the fields of the segment map.  Default to
   5598  1.1  christos 	 using the physical address of the segment in the input BFD.  */
   5599  1.1  christos       map->next = NULL;
   5600  1.1  christos       map->p_type = segment->p_type;
   5601  1.1  christos       map->p_flags = segment->p_flags;
   5602  1.1  christos       map->p_flags_valid = 1;
   5603  1.1  christos 
   5604  1.1  christos       /* If the first section in the input segment is removed, there is
   5605  1.1  christos 	 no need to preserve segment physical address in the corresponding
   5606  1.1  christos 	 output segment.  */
   5607  1.1  christos       if (!first_section || first_section->output_section != NULL)
   5608  1.1  christos 	{
   5609  1.1  christos 	  map->p_paddr = segment->p_paddr;
   5610  1.1  christos 	  map->p_paddr_valid = p_paddr_valid;
   5611  1.1  christos 	}
   5612  1.1  christos 
   5613  1.1  christos       /* Determine if this segment contains the ELF file header
   5614  1.1  christos 	 and if it contains the program headers themselves.  */
   5615  1.1  christos       map->includes_filehdr = (segment->p_offset == 0
   5616  1.1  christos 			       && segment->p_filesz >= iehdr->e_ehsize);
   5617  1.1  christos       map->includes_phdrs = 0;
   5618  1.1  christos 
   5619  1.1  christos       if (!phdr_included || segment->p_type != PT_LOAD)
   5620  1.1  christos 	{
   5621  1.1  christos 	  map->includes_phdrs =
   5622  1.1  christos 	    (segment->p_offset <= (bfd_vma) iehdr->e_phoff
   5623  1.1  christos 	     && (segment->p_offset + segment->p_filesz
   5624  1.1  christos 		 >= ((bfd_vma) iehdr->e_phoff
   5625  1.1  christos 		     + iehdr->e_phnum * iehdr->e_phentsize)));
   5626  1.1  christos 
   5627  1.1  christos 	  if (segment->p_type == PT_LOAD && map->includes_phdrs)
   5628  1.1  christos 	    phdr_included = TRUE;
   5629  1.1  christos 	}
   5630  1.1  christos 
   5631  1.1  christos       if (section_count == 0)
   5632  1.1  christos 	{
   5633  1.1  christos 	  /* Special segments, such as the PT_PHDR segment, may contain
   5634  1.1  christos 	     no sections, but ordinary, loadable segments should contain
   5635  1.1  christos 	     something.  They are allowed by the ELF spec however, so only
   5636  1.1  christos 	     a warning is produced.  */
   5637  1.1  christos 	  if (segment->p_type == PT_LOAD)
   5638  1.1  christos 	    (*_bfd_error_handler) (_("%B: warning: Empty loadable segment"
   5639  1.1  christos 				     " detected, is this intentional ?\n"),
   5640  1.1  christos 				   ibfd);
   5641  1.1  christos 
   5642  1.1  christos 	  map->count = 0;
   5643  1.1  christos 	  *pointer_to_map = map;
   5644  1.1  christos 	  pointer_to_map = &map->next;
   5645  1.1  christos 
   5646  1.1  christos 	  continue;
   5647  1.1  christos 	}
   5648  1.1  christos 
   5649  1.1  christos       /* Now scan the sections in the input BFD again and attempt
   5650  1.1  christos 	 to add their corresponding output sections to the segment map.
   5651  1.1  christos 	 The problem here is how to handle an output section which has
   5652  1.1  christos 	 been moved (ie had its LMA changed).  There are four possibilities:
   5653  1.1  christos 
   5654  1.1  christos 	 1. None of the sections have been moved.
   5655  1.1  christos 	    In this case we can continue to use the segment LMA from the
   5656  1.1  christos 	    input BFD.
   5657  1.1  christos 
   5658  1.1  christos 	 2. All of the sections have been moved by the same amount.
   5659  1.1  christos 	    In this case we can change the segment's LMA to match the LMA
   5660  1.1  christos 	    of the first section.
   5661  1.1  christos 
   5662  1.1  christos 	 3. Some of the sections have been moved, others have not.
   5663  1.1  christos 	    In this case those sections which have not been moved can be
   5664  1.1  christos 	    placed in the current segment which will have to have its size,
   5665  1.1  christos 	    and possibly its LMA changed, and a new segment or segments will
   5666  1.1  christos 	    have to be created to contain the other sections.
   5667  1.1  christos 
   5668  1.1  christos 	 4. The sections have been moved, but not by the same amount.
   5669  1.1  christos 	    In this case we can change the segment's LMA to match the LMA
   5670  1.1  christos 	    of the first section and we will have to create a new segment
   5671  1.1  christos 	    or segments to contain the other sections.
   5672  1.1  christos 
   5673  1.1  christos 	 In order to save time, we allocate an array to hold the section
   5674  1.1  christos 	 pointers that we are interested in.  As these sections get assigned
   5675  1.1  christos 	 to a segment, they are removed from this array.  */
   5676  1.1  christos 
   5677  1.1  christos       sections = (asection **) bfd_malloc2 (section_count, sizeof (asection *));
   5678  1.1  christos       if (sections == NULL)
   5679  1.1  christos 	return FALSE;
   5680  1.1  christos 
   5681  1.1  christos       /* Step One: Scan for segment vs section LMA conflicts.
   5682  1.1  christos 	 Also add the sections to the section array allocated above.
   5683  1.1  christos 	 Also add the sections to the current segment.  In the common
   5684  1.1  christos 	 case, where the sections have not been moved, this means that
   5685  1.1  christos 	 we have completely filled the segment, and there is nothing
   5686  1.1  christos 	 more to do.  */
   5687  1.1  christos       isec = 0;
   5688  1.1  christos       matching_lma = 0;
   5689  1.1  christos       suggested_lma = 0;
   5690  1.1  christos       first_matching_lma = TRUE;
   5691  1.1  christos       first_suggested_lma = TRUE;
   5692  1.1  christos 
   5693  1.1  christos       for (section = ibfd->sections;
   5694  1.1  christos 	   section != NULL;
   5695  1.1  christos 	   section = section->next)
   5696  1.1  christos 	if (section == first_section)
   5697  1.1  christos 	  break;
   5698  1.1  christos 
   5699  1.1  christos       for (j = 0; section != NULL; section = section->next)
   5700  1.1  christos 	{
   5701  1.1  christos 	  if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
   5702  1.1  christos 	    {
   5703  1.1  christos 	      output_section = section->output_section;
   5704  1.1  christos 
   5705  1.1  christos 	      sections[j++] = section;
   5706  1.1  christos 
   5707  1.1  christos 	      /* The Solaris native linker always sets p_paddr to 0.
   5708  1.1  christos 		 We try to catch that case here, and set it to the
   5709  1.1  christos 		 correct value.  Note - some backends require that
   5710  1.1  christos 		 p_paddr be left as zero.  */
   5711  1.1  christos 	      if (!p_paddr_valid
   5712  1.1  christos 		  && segment->p_vaddr != 0
   5713  1.1  christos 		  && !bed->want_p_paddr_set_to_zero
   5714  1.1  christos 		  && isec == 0
   5715  1.1  christos 		  && output_section->lma != 0
   5716  1.1  christos 		  && output_section->vma == (segment->p_vaddr
   5717  1.1  christos 					     + (map->includes_filehdr
   5718  1.1  christos 						? iehdr->e_ehsize
   5719  1.1  christos 						: 0)
   5720  1.1  christos 					     + (map->includes_phdrs
   5721  1.1  christos 						? (iehdr->e_phnum
   5722  1.1  christos 						   * iehdr->e_phentsize)
   5723  1.1  christos 						: 0)))
   5724  1.1  christos 		map->p_paddr = segment->p_vaddr;
   5725  1.1  christos 
   5726  1.1  christos 	      /* Match up the physical address of the segment with the
   5727  1.1  christos 		 LMA address of the output section.  */
   5728  1.1  christos 	      if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
   5729  1.1  christos 		  || IS_COREFILE_NOTE (segment, section)
   5730  1.1  christos 		  || (bed->want_p_paddr_set_to_zero
   5731  1.1  christos 		      && IS_CONTAINED_BY_VMA (output_section, segment)))
   5732  1.1  christos 		{
   5733  1.1  christos 		  if (first_matching_lma || output_section->lma < matching_lma)
   5734  1.1  christos 		    {
   5735  1.1  christos 		      matching_lma = output_section->lma;
   5736  1.1  christos 		      first_matching_lma = FALSE;
   5737  1.1  christos 		    }
   5738  1.1  christos 
   5739  1.1  christos 		  /* We assume that if the section fits within the segment
   5740  1.1  christos 		     then it does not overlap any other section within that
   5741  1.1  christos 		     segment.  */
   5742  1.1  christos 		  map->sections[isec++] = output_section;
   5743  1.1  christos 		}
   5744  1.1  christos 	      else if (first_suggested_lma)
   5745  1.1  christos 		{
   5746  1.1  christos 		  suggested_lma = output_section->lma;
   5747  1.1  christos 		  first_suggested_lma = FALSE;
   5748  1.1  christos 		}
   5749  1.1  christos 
   5750  1.1  christos 	      if (j == section_count)
   5751  1.1  christos 		break;
   5752  1.1  christos 	    }
   5753  1.1  christos 	}
   5754  1.1  christos 
   5755  1.1  christos       BFD_ASSERT (j == section_count);
   5756  1.1  christos 
   5757  1.1  christos       /* Step Two: Adjust the physical address of the current segment,
   5758  1.1  christos 	 if necessary.  */
   5759  1.1  christos       if (isec == section_count)
   5760  1.1  christos 	{
   5761  1.1  christos 	  /* All of the sections fitted within the segment as currently
   5762  1.1  christos 	     specified.  This is the default case.  Add the segment to
   5763  1.1  christos 	     the list of built segments and carry on to process the next
   5764  1.1  christos 	     program header in the input BFD.  */
   5765  1.1  christos 	  map->count = section_count;
   5766  1.1  christos 	  *pointer_to_map = map;
   5767  1.1  christos 	  pointer_to_map = &map->next;
   5768  1.1  christos 
   5769  1.1  christos 	  if (p_paddr_valid
   5770  1.1  christos 	      && !bed->want_p_paddr_set_to_zero
   5771  1.1  christos 	      && matching_lma != map->p_paddr
   5772  1.1  christos 	      && !map->includes_filehdr
   5773  1.1  christos 	      && !map->includes_phdrs)
   5774  1.1  christos 	    /* There is some padding before the first section in the
   5775  1.1  christos 	       segment.  So, we must account for that in the output
   5776  1.1  christos 	       segment's vma.  */
   5777  1.1  christos 	    map->p_vaddr_offset = matching_lma - map->p_paddr;
   5778  1.1  christos 
   5779  1.1  christos 	  free (sections);
   5780  1.1  christos 	  continue;
   5781  1.1  christos 	}
   5782  1.1  christos       else
   5783  1.1  christos 	{
   5784  1.1  christos 	  if (!first_matching_lma)
   5785  1.1  christos 	    {
   5786  1.1  christos 	      /* At least one section fits inside the current segment.
   5787  1.1  christos 		 Keep it, but modify its physical address to match the
   5788  1.1  christos 		 LMA of the first section that fitted.  */
   5789  1.1  christos 	      map->p_paddr = matching_lma;
   5790  1.1  christos 	    }
   5791  1.1  christos 	  else
   5792  1.1  christos 	    {
   5793  1.1  christos 	      /* None of the sections fitted inside the current segment.
   5794  1.1  christos 		 Change the current segment's physical address to match
   5795  1.1  christos 		 the LMA of the first section.  */
   5796  1.1  christos 	      map->p_paddr = suggested_lma;
   5797  1.1  christos 	    }
   5798  1.1  christos 
   5799  1.1  christos 	  /* Offset the segment physical address from the lma
   5800  1.1  christos 	     to allow for space taken up by elf headers.  */
   5801  1.1  christos 	  if (map->includes_filehdr)
   5802  1.1  christos 	    {
   5803  1.1  christos 	      if (map->p_paddr >= iehdr->e_ehsize)
   5804  1.1  christos 		map->p_paddr -= iehdr->e_ehsize;
   5805  1.1  christos 	      else
   5806  1.1  christos 		{
   5807  1.1  christos 		  map->includes_filehdr = FALSE;
   5808  1.1  christos 		  map->includes_phdrs = FALSE;
   5809  1.1  christos 		}
   5810  1.1  christos 	    }
   5811  1.1  christos 
   5812  1.1  christos 	  if (map->includes_phdrs)
   5813  1.1  christos 	    {
   5814  1.1  christos 	      if (map->p_paddr >= iehdr->e_phnum * iehdr->e_phentsize)
   5815  1.1  christos 		{
   5816  1.1  christos 		  map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
   5817  1.1  christos 
   5818  1.1  christos 		  /* iehdr->e_phnum is just an estimate of the number
   5819  1.1  christos 		     of program headers that we will need.  Make a note
   5820  1.1  christos 		     here of the number we used and the segment we chose
   5821  1.1  christos 		     to hold these headers, so that we can adjust the
   5822  1.1  christos 		     offset when we know the correct value.  */
   5823  1.1  christos 		  phdr_adjust_num = iehdr->e_phnum;
   5824  1.1  christos 		  phdr_adjust_seg = map;
   5825  1.1  christos 		}
   5826  1.1  christos 	      else
   5827  1.1  christos 		map->includes_phdrs = FALSE;
   5828  1.1  christos 	    }
   5829  1.1  christos 	}
   5830  1.1  christos 
   5831  1.1  christos       /* Step Three: Loop over the sections again, this time assigning
   5832  1.1  christos 	 those that fit to the current segment and removing them from the
   5833  1.1  christos 	 sections array; but making sure not to leave large gaps.  Once all
   5834  1.1  christos 	 possible sections have been assigned to the current segment it is
   5835  1.1  christos 	 added to the list of built segments and if sections still remain
   5836  1.1  christos 	 to be assigned, a new segment is constructed before repeating
   5837  1.1  christos 	 the loop.  */
   5838  1.1  christos       isec = 0;
   5839  1.1  christos       do
   5840  1.1  christos 	{
   5841  1.1  christos 	  map->count = 0;
   5842  1.1  christos 	  suggested_lma = 0;
   5843  1.1  christos 	  first_suggested_lma = TRUE;
   5844  1.1  christos 
   5845  1.1  christos 	  /* Fill the current segment with sections that fit.  */
   5846  1.1  christos 	  for (j = 0; j < section_count; j++)
   5847  1.1  christos 	    {
   5848  1.1  christos 	      section = sections[j];
   5849  1.1  christos 
   5850  1.1  christos 	      if (section == NULL)
   5851  1.1  christos 		continue;
   5852  1.1  christos 
   5853  1.1  christos 	      output_section = section->output_section;
   5854  1.1  christos 
   5855  1.1  christos 	      BFD_ASSERT (output_section != NULL);
   5856  1.1  christos 
   5857  1.1  christos 	      if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
   5858  1.1  christos 		  || IS_COREFILE_NOTE (segment, section))
   5859  1.1  christos 		{
   5860  1.1  christos 		  if (map->count == 0)
   5861  1.1  christos 		    {
   5862  1.1  christos 		      /* If the first section in a segment does not start at
   5863  1.1  christos 			 the beginning of the segment, then something is
   5864  1.1  christos 			 wrong.  */
   5865  1.1  christos 		      if (output_section->lma
   5866  1.1  christos 			  != (map->p_paddr
   5867  1.1  christos 			      + (map->includes_filehdr ? iehdr->e_ehsize : 0)
   5868  1.1  christos 			      + (map->includes_phdrs
   5869  1.1  christos 				 ? iehdr->e_phnum * iehdr->e_phentsize
   5870  1.1  christos 				 : 0)))
   5871  1.1  christos 			abort ();
   5872  1.1  christos 		    }
   5873  1.1  christos 		  else
   5874  1.1  christos 		    {
   5875  1.1  christos 		      asection *prev_sec;
   5876  1.1  christos 
   5877  1.1  christos 		      prev_sec = map->sections[map->count - 1];
   5878  1.1  christos 
   5879  1.1  christos 		      /* If the gap between the end of the previous section
   5880  1.1  christos 			 and the start of this section is more than
   5881  1.1  christos 			 maxpagesize then we need to start a new segment.  */
   5882  1.1  christos 		      if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
   5883  1.1  christos 				      maxpagesize)
   5884  1.1  christos 			   < BFD_ALIGN (output_section->lma, maxpagesize))
   5885  1.1  christos 			  || (prev_sec->lma + prev_sec->size
   5886  1.1  christos 			      > output_section->lma))
   5887  1.1  christos 			{
   5888  1.1  christos 			  if (first_suggested_lma)
   5889  1.1  christos 			    {
   5890  1.1  christos 			      suggested_lma = output_section->lma;
   5891  1.1  christos 			      first_suggested_lma = FALSE;
   5892  1.1  christos 			    }
   5893  1.1  christos 
   5894  1.1  christos 			  continue;
   5895  1.1  christos 			}
   5896  1.1  christos 		    }
   5897  1.1  christos 
   5898  1.1  christos 		  map->sections[map->count++] = output_section;
   5899  1.1  christos 		  ++isec;
   5900  1.1  christos 		  sections[j] = NULL;
   5901  1.1  christos 		  section->segment_mark = TRUE;
   5902  1.1  christos 		}
   5903  1.1  christos 	      else if (first_suggested_lma)
   5904  1.1  christos 		{
   5905  1.1  christos 		  suggested_lma = output_section->lma;
   5906  1.1  christos 		  first_suggested_lma = FALSE;
   5907  1.1  christos 		}
   5908  1.1  christos 	    }
   5909  1.1  christos 
   5910  1.1  christos 	  BFD_ASSERT (map->count > 0);
   5911  1.1  christos 
   5912  1.1  christos 	  /* Add the current segment to the list of built segments.  */
   5913  1.1  christos 	  *pointer_to_map = map;
   5914  1.1  christos 	  pointer_to_map = &map->next;
   5915  1.1  christos 
   5916  1.1  christos 	  if (isec < section_count)
   5917  1.1  christos 	    {
   5918  1.1  christos 	      /* We still have not allocated all of the sections to
   5919  1.1  christos 		 segments.  Create a new segment here, initialise it
   5920  1.1  christos 		 and carry on looping.  */
   5921  1.1  christos 	      amt = sizeof (struct elf_segment_map);
   5922  1.1  christos 	      amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
   5923  1.1  christos 	      map = (struct elf_segment_map *) bfd_alloc (obfd, amt);
   5924  1.1  christos 	      if (map == NULL)
   5925  1.1  christos 		{
   5926  1.1  christos 		  free (sections);
   5927  1.1  christos 		  return FALSE;
   5928  1.1  christos 		}
   5929  1.1  christos 
   5930  1.1  christos 	      /* Initialise the fields of the segment map.  Set the physical
   5931  1.1  christos 		 physical address to the LMA of the first section that has
   5932  1.1  christos 		 not yet been assigned.  */
   5933  1.1  christos 	      map->next = NULL;
   5934  1.1  christos 	      map->p_type = segment->p_type;
   5935  1.1  christos 	      map->p_flags = segment->p_flags;
   5936  1.1  christos 	      map->p_flags_valid = 1;
   5937  1.1  christos 	      map->p_paddr = suggested_lma;
   5938  1.1  christos 	      map->p_paddr_valid = p_paddr_valid;
   5939  1.1  christos 	      map->includes_filehdr = 0;
   5940  1.1  christos 	      map->includes_phdrs = 0;
   5941  1.1  christos 	    }
   5942  1.1  christos 	}
   5943  1.1  christos       while (isec < section_count);
   5944  1.1  christos 
   5945  1.1  christos       free (sections);
   5946  1.1  christos     }
   5947  1.1  christos 
   5948  1.1  christos   elf_tdata (obfd)->segment_map = map_first;
   5949  1.1  christos 
   5950  1.1  christos   /* If we had to estimate the number of program headers that were
   5951  1.1  christos      going to be needed, then check our estimate now and adjust
   5952  1.1  christos      the offset if necessary.  */
   5953  1.1  christos   if (phdr_adjust_seg != NULL)
   5954  1.1  christos     {
   5955  1.1  christos       unsigned int count;
   5956  1.1  christos 
   5957  1.1  christos       for (count = 0, map = map_first; map != NULL; map = map->next)
   5958  1.1  christos 	count++;
   5959  1.1  christos 
   5960  1.1  christos       if (count > phdr_adjust_num)
   5961  1.1  christos 	phdr_adjust_seg->p_paddr
   5962  1.1  christos 	  -= (count - phdr_adjust_num) * iehdr->e_phentsize;
   5963  1.1  christos     }
   5964  1.1  christos 
   5965  1.1  christos #undef SEGMENT_END
   5966  1.1  christos #undef SECTION_SIZE
   5967  1.1  christos #undef IS_CONTAINED_BY_VMA
   5968  1.1  christos #undef IS_CONTAINED_BY_LMA
   5969  1.1  christos #undef IS_NOTE
   5970  1.1  christos #undef IS_COREFILE_NOTE
   5971  1.1  christos #undef IS_SOLARIS_PT_INTERP
   5972  1.1  christos #undef IS_SECTION_IN_INPUT_SEGMENT
   5973  1.1  christos #undef INCLUDE_SECTION_IN_SEGMENT
   5974  1.1  christos #undef SEGMENT_AFTER_SEGMENT
   5975  1.1  christos #undef SEGMENT_OVERLAPS
   5976  1.1  christos   return TRUE;
   5977  1.1  christos }
   5978  1.1  christos 
   5979  1.1  christos /* Copy ELF program header information.  */
   5980  1.1  christos 
   5981  1.1  christos static bfd_boolean
   5982  1.1  christos copy_elf_program_header (bfd *ibfd, bfd *obfd)
   5983  1.1  christos {
   5984  1.1  christos   Elf_Internal_Ehdr *iehdr;
   5985  1.1  christos   struct elf_segment_map *map;
   5986  1.1  christos   struct elf_segment_map *map_first;
   5987  1.1  christos   struct elf_segment_map **pointer_to_map;
   5988  1.1  christos   Elf_Internal_Phdr *segment;
   5989  1.1  christos   unsigned int i;
   5990  1.1  christos   unsigned int num_segments;
   5991  1.1  christos   bfd_boolean phdr_included = FALSE;
   5992  1.1  christos   bfd_boolean p_paddr_valid;
   5993  1.1  christos 
   5994  1.1  christos   iehdr = elf_elfheader (ibfd);
   5995  1.1  christos 
   5996  1.1  christos   map_first = NULL;
   5997  1.1  christos   pointer_to_map = &map_first;
   5998  1.1  christos 
   5999  1.1  christos   /* If all the segment p_paddr fields are zero, don't set
   6000  1.1  christos      map->p_paddr_valid.  */
   6001  1.1  christos   p_paddr_valid = FALSE;
   6002  1.1  christos   num_segments = elf_elfheader (ibfd)->e_phnum;
   6003  1.1  christos   for (i = 0, segment = elf_tdata (ibfd)->phdr;
   6004  1.1  christos        i < num_segments;
   6005  1.1  christos        i++, segment++)
   6006  1.1  christos     if (segment->p_paddr != 0)
   6007  1.1  christos       {
   6008  1.1  christos 	p_paddr_valid = TRUE;
   6009  1.1  christos 	break;
   6010  1.1  christos       }
   6011  1.1  christos 
   6012  1.1  christos   for (i = 0, segment = elf_tdata (ibfd)->phdr;
   6013  1.1  christos        i < num_segments;
   6014  1.1  christos        i++, segment++)
   6015  1.1  christos     {
   6016  1.1  christos       asection *section;
   6017  1.1  christos       unsigned int section_count;
   6018  1.1  christos       bfd_size_type amt;
   6019  1.1  christos       Elf_Internal_Shdr *this_hdr;
   6020  1.1  christos       asection *first_section = NULL;
   6021  1.1  christos       asection *lowest_section;
   6022  1.1  christos 
   6023  1.1  christos       /* Compute how many sections are in this segment.  */
   6024  1.1  christos       for (section = ibfd->sections, section_count = 0;
   6025  1.1  christos 	   section != NULL;
   6026  1.1  christos 	   section = section->next)
   6027  1.1  christos 	{
   6028  1.1  christos 	  this_hdr = &(elf_section_data(section)->this_hdr);
   6029  1.1  christos 	  if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
   6030  1.1  christos 	    {
   6031  1.1  christos 	      if (first_section == NULL)
   6032  1.1  christos 		first_section = section;
   6033  1.1  christos 	      section_count++;
   6034  1.1  christos 	    }
   6035  1.1  christos 	}
   6036  1.1  christos 
   6037  1.1  christos       /* Allocate a segment map big enough to contain
   6038  1.1  christos 	 all of the sections we have selected.  */
   6039  1.1  christos       amt = sizeof (struct elf_segment_map);
   6040  1.1  christos       if (section_count != 0)
   6041  1.1  christos 	amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
   6042  1.1  christos       map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
   6043  1.1  christos       if (map == NULL)
   6044  1.1  christos 	return FALSE;
   6045  1.1  christos 
   6046  1.1  christos       /* Initialize the fields of the output segment map with the
   6047  1.1  christos 	 input segment.  */
   6048  1.1  christos       map->next = NULL;
   6049  1.1  christos       map->p_type = segment->p_type;
   6050  1.1  christos       map->p_flags = segment->p_flags;
   6051  1.1  christos       map->p_flags_valid = 1;
   6052  1.1  christos       map->p_paddr = segment->p_paddr;
   6053  1.1  christos       map->p_paddr_valid = p_paddr_valid;
   6054  1.1  christos       map->p_align = segment->p_align;
   6055  1.1  christos       map->p_align_valid = 1;
   6056  1.1  christos       map->p_vaddr_offset = 0;
   6057  1.1  christos 
   6058  1.1  christos       if (map->p_type == PT_GNU_RELRO)
   6059  1.1  christos 	{
   6060  1.1  christos 	  /* The PT_GNU_RELRO segment may contain the first a few
   6061  1.1  christos 	     bytes in the .got.plt section even if the whole .got.plt
   6062  1.1  christos 	     section isn't in the PT_GNU_RELRO segment.  We won't
   6063  1.1  christos 	     change the size of the PT_GNU_RELRO segment.  */
   6064  1.1  christos 	  map->p_size = segment->p_memsz;
   6065  1.1  christos 	  map->p_size_valid = 1;
   6066  1.1  christos 	}
   6067  1.1  christos 
   6068  1.1  christos       /* Determine if this segment contains the ELF file header
   6069  1.1  christos 	 and if it contains the program headers themselves.  */
   6070  1.1  christos       map->includes_filehdr = (segment->p_offset == 0
   6071  1.1  christos 			       && segment->p_filesz >= iehdr->e_ehsize);
   6072  1.1  christos 
   6073  1.1  christos       map->includes_phdrs = 0;
   6074  1.1  christos       if (! phdr_included || segment->p_type != PT_LOAD)
   6075  1.1  christos 	{
   6076  1.1  christos 	  map->includes_phdrs =
   6077  1.1  christos 	    (segment->p_offset <= (bfd_vma) iehdr->e_phoff
   6078  1.1  christos 	     && (segment->p_offset + segment->p_filesz
   6079  1.1  christos 		 >= ((bfd_vma) iehdr->e_phoff
   6080  1.1  christos 		     + iehdr->e_phnum * iehdr->e_phentsize)));
   6081  1.1  christos 
   6082  1.1  christos 	  if (segment->p_type == PT_LOAD && map->includes_phdrs)
   6083  1.1  christos 	    phdr_included = TRUE;
   6084  1.1  christos 	}
   6085  1.1  christos 
   6086  1.1  christos       lowest_section = first_section;
   6087  1.1  christos       if (section_count != 0)
   6088  1.1  christos 	{
   6089  1.1  christos 	  unsigned int isec = 0;
   6090  1.1  christos 
   6091  1.1  christos 	  for (section = first_section;
   6092  1.1  christos 	       section != NULL;
   6093  1.1  christos 	       section = section->next)
   6094  1.1  christos 	    {
   6095  1.1  christos 	      this_hdr = &(elf_section_data(section)->this_hdr);
   6096  1.1  christos 	      if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
   6097  1.1  christos 		{
   6098  1.1  christos 		  map->sections[isec++] = section->output_section;
   6099  1.1  christos 		  if (section->lma < lowest_section->lma)
   6100  1.1  christos 		    lowest_section = section;
   6101  1.1  christos 		  if ((section->flags & SEC_ALLOC) != 0)
   6102  1.1  christos 		    {
   6103  1.1  christos 		      bfd_vma seg_off;
   6104  1.1  christos 
   6105  1.1  christos 		      /* Section lmas are set up from PT_LOAD header
   6106  1.1  christos 			 p_paddr in _bfd_elf_make_section_from_shdr.
   6107  1.1  christos 			 If this header has a p_paddr that disagrees
   6108  1.1  christos 			 with the section lma, flag the p_paddr as
   6109  1.1  christos 			 invalid.  */
   6110  1.1  christos 		      if ((section->flags & SEC_LOAD) != 0)
   6111  1.1  christos 			seg_off = this_hdr->sh_offset - segment->p_offset;
   6112  1.1  christos 		      else
   6113  1.1  christos 			seg_off = this_hdr->sh_addr - segment->p_vaddr;
   6114  1.1  christos 		      if (section->lma - segment->p_paddr != seg_off)
   6115  1.1  christos 			map->p_paddr_valid = FALSE;
   6116  1.1  christos 		    }
   6117  1.1  christos 		  if (isec == section_count)
   6118  1.1  christos 		    break;
   6119  1.1  christos 		}
   6120  1.1  christos 	    }
   6121  1.1  christos 	}
   6122  1.1  christos 
   6123  1.1  christos       if (map->includes_filehdr && lowest_section != NULL)
   6124  1.1  christos 	/* We need to keep the space used by the headers fixed.  */
   6125  1.1  christos 	map->header_size = lowest_section->vma - segment->p_vaddr;
   6126  1.1  christos 
   6127  1.1  christos       if (!map->includes_phdrs
   6128  1.1  christos 	  && !map->includes_filehdr
   6129  1.1  christos 	  && map->p_paddr_valid)
   6130  1.1  christos 	/* There is some other padding before the first section.  */
   6131  1.1  christos 	map->p_vaddr_offset = ((lowest_section ? lowest_section->lma : 0)
   6132  1.1  christos 			       - segment->p_paddr);
   6133  1.1  christos 
   6134  1.1  christos       map->count = section_count;
   6135  1.1  christos       *pointer_to_map = map;
   6136  1.1  christos       pointer_to_map = &map->next;
   6137  1.1  christos     }
   6138  1.1  christos 
   6139  1.1  christos   elf_tdata (obfd)->segment_map = map_first;
   6140  1.1  christos   return TRUE;
   6141  1.1  christos }
   6142  1.1  christos 
   6143  1.1  christos /* Copy private BFD data.  This copies or rewrites ELF program header
   6144  1.1  christos    information.  */
   6145  1.1  christos 
   6146  1.1  christos static bfd_boolean
   6147  1.1  christos copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   6148  1.1  christos {
   6149  1.1  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   6150  1.1  christos       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   6151  1.1  christos     return TRUE;
   6152  1.1  christos 
   6153  1.1  christos   if (elf_tdata (ibfd)->phdr == NULL)
   6154  1.1  christos     return TRUE;
   6155  1.1  christos 
   6156  1.1  christos   if (ibfd->xvec == obfd->xvec)
   6157  1.1  christos     {
   6158  1.1  christos       /* Check to see if any sections in the input BFD
   6159  1.1  christos 	 covered by ELF program header have changed.  */
   6160  1.1  christos       Elf_Internal_Phdr *segment;
   6161  1.1  christos       asection *section, *osec;
   6162  1.1  christos       unsigned int i, num_segments;
   6163  1.1  christos       Elf_Internal_Shdr *this_hdr;
   6164  1.1  christos       const struct elf_backend_data *bed;
   6165  1.1  christos 
   6166  1.1  christos       bed = get_elf_backend_data (ibfd);
   6167  1.1  christos 
   6168  1.1  christos       /* Regenerate the segment map if p_paddr is set to 0.  */
   6169  1.1  christos       if (bed->want_p_paddr_set_to_zero)
   6170  1.1  christos 	goto rewrite;
   6171  1.1  christos 
   6172  1.1  christos       /* Initialize the segment mark field.  */
   6173  1.1  christos       for (section = obfd->sections; section != NULL;
   6174  1.1  christos 	   section = section->next)
   6175  1.1  christos 	section->segment_mark = FALSE;
   6176  1.1  christos 
   6177  1.1  christos       num_segments = elf_elfheader (ibfd)->e_phnum;
   6178  1.1  christos       for (i = 0, segment = elf_tdata (ibfd)->phdr;
   6179  1.1  christos 	   i < num_segments;
   6180  1.1  christos 	   i++, segment++)
   6181  1.1  christos 	{
   6182  1.1  christos 	  /* PR binutils/3535.  The Solaris linker always sets the p_paddr
   6183  1.1  christos 	     and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
   6184  1.1  christos 	     which severly confuses things, so always regenerate the segment
   6185  1.1  christos 	     map in this case.  */
   6186  1.1  christos 	  if (segment->p_paddr == 0
   6187  1.1  christos 	      && segment->p_memsz == 0
   6188  1.1  christos 	      && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
   6189  1.1  christos 	    goto rewrite;
   6190  1.1  christos 
   6191  1.1  christos 	  for (section = ibfd->sections;
   6192  1.1  christos 	       section != NULL; section = section->next)
   6193  1.1  christos 	    {
   6194  1.1  christos 	      /* We mark the output section so that we know it comes
   6195  1.1  christos 		 from the input BFD.  */
   6196  1.1  christos 	      osec = section->output_section;
   6197  1.1  christos 	      if (osec)
   6198  1.1  christos 		osec->segment_mark = TRUE;
   6199  1.1  christos 
   6200  1.1  christos 	      /* Check if this section is covered by the segment.  */
   6201  1.1  christos 	      this_hdr = &(elf_section_data(section)->this_hdr);
   6202  1.1  christos 	      if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
   6203  1.1  christos 		{
   6204  1.1  christos 		  /* FIXME: Check if its output section is changed or
   6205  1.1  christos 		     removed.  What else do we need to check?  */
   6206  1.1  christos 		  if (osec == NULL
   6207  1.1  christos 		      || section->flags != osec->flags
   6208  1.1  christos 		      || section->lma != osec->lma
   6209  1.1  christos 		      || section->vma != osec->vma
   6210  1.1  christos 		      || section->size != osec->size
   6211  1.1  christos 		      || section->rawsize != osec->rawsize
   6212  1.1  christos 		      || section->alignment_power != osec->alignment_power)
   6213  1.1  christos 		    goto rewrite;
   6214  1.1  christos 		}
   6215  1.1  christos 	    }
   6216  1.1  christos 	}
   6217  1.1  christos 
   6218  1.1  christos       /* Check to see if any output section do not come from the
   6219  1.1  christos 	 input BFD.  */
   6220  1.1  christos       for (section = obfd->sections; section != NULL;
   6221  1.1  christos 	   section = section->next)
   6222  1.1  christos 	{
   6223  1.1  christos 	  if (section->segment_mark == FALSE)
   6224  1.1  christos 	    goto rewrite;
   6225  1.1  christos 	  else
   6226  1.1  christos 	    section->segment_mark = FALSE;
   6227  1.1  christos 	}
   6228  1.1  christos 
   6229  1.1  christos       return copy_elf_program_header (ibfd, obfd);
   6230  1.1  christos     }
   6231  1.1  christos 
   6232  1.1  christos rewrite:
   6233  1.1  christos   return rewrite_elf_program_header (ibfd, obfd);
   6234  1.1  christos }
   6235  1.1  christos 
   6236  1.1  christos /* Initialize private output section information from input section.  */
   6237  1.1  christos 
   6238  1.1  christos bfd_boolean
   6239  1.1  christos _bfd_elf_init_private_section_data (bfd *ibfd,
   6240  1.1  christos 				    asection *isec,
   6241  1.1  christos 				    bfd *obfd,
   6242  1.1  christos 				    asection *osec,
   6243  1.1  christos 				    struct bfd_link_info *link_info)
   6244  1.1  christos 
   6245  1.1  christos {
   6246  1.1  christos   Elf_Internal_Shdr *ihdr, *ohdr;
   6247  1.1  christos   bfd_boolean final_link = link_info != NULL && !link_info->relocatable;
   6248  1.1  christos 
   6249  1.1  christos   if (ibfd->xvec->flavour != bfd_target_elf_flavour
   6250  1.1  christos       || obfd->xvec->flavour != bfd_target_elf_flavour)
   6251  1.1  christos     return TRUE;
   6252  1.1  christos 
   6253  1.1  christos   /* For objcopy and relocatable link, don't copy the output ELF
   6254  1.1  christos      section type from input if the output BFD section flags have been
   6255  1.1  christos      set to something different.  For a final link allow some flags
   6256  1.1  christos      that the linker clears to differ.  */
   6257  1.1  christos   if (elf_section_type (osec) == SHT_NULL
   6258  1.1  christos       && (osec->flags == isec->flags
   6259  1.1  christos 	  || (final_link
   6260  1.1  christos 	      && ((osec->flags ^ isec->flags)
   6261  1.1  christos 		  & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
   6262  1.1  christos     elf_section_type (osec) = elf_section_type (isec);
   6263  1.1  christos 
   6264  1.1  christos   /* FIXME: Is this correct for all OS/PROC specific flags?  */
   6265  1.1  christos   elf_section_flags (osec) |= (elf_section_flags (isec)
   6266  1.1  christos 			       & (SHF_MASKOS | SHF_MASKPROC));
   6267  1.1  christos 
   6268  1.1  christos   /* Set things up for objcopy and relocatable link.  The output
   6269  1.1  christos      SHT_GROUP section will have its elf_next_in_group pointing back
   6270  1.1  christos      to the input group members.  Ignore linker created group section.
   6271  1.1  christos      See elfNN_ia64_object_p in elfxx-ia64.c.  */
   6272  1.1  christos   if (!final_link)
   6273  1.1  christos     {
   6274  1.1  christos       if (elf_sec_group (isec) == NULL
   6275  1.1  christos 	  || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0)
   6276  1.1  christos 	{
   6277  1.1  christos 	  if (elf_section_flags (isec) & SHF_GROUP)
   6278  1.1  christos 	    elf_section_flags (osec) |= SHF_GROUP;
   6279  1.1  christos 	  elf_next_in_group (osec) = elf_next_in_group (isec);
   6280  1.1  christos 	  elf_section_data (osec)->group = elf_section_data (isec)->group;
   6281  1.1  christos 	}
   6282  1.1  christos     }
   6283  1.1  christos 
   6284  1.1  christos   ihdr = &elf_section_data (isec)->this_hdr;
   6285  1.1  christos 
   6286  1.1  christos   /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
   6287  1.1  christos      don't use the output section of the linked-to section since it
   6288  1.1  christos      may be NULL at this point.  */
   6289  1.1  christos   if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
   6290  1.1  christos     {
   6291  1.1  christos       ohdr = &elf_section_data (osec)->this_hdr;
   6292  1.1  christos       ohdr->sh_flags |= SHF_LINK_ORDER;
   6293  1.1  christos       elf_linked_to_section (osec) = elf_linked_to_section (isec);
   6294  1.1  christos     }
   6295  1.1  christos 
   6296  1.1  christos   osec->use_rela_p = isec->use_rela_p;
   6297  1.1  christos 
   6298  1.1  christos   return TRUE;
   6299  1.1  christos }
   6300  1.1  christos 
   6301  1.1  christos /* Copy private section information.  This copies over the entsize
   6302  1.1  christos    field, and sometimes the info field.  */
   6303  1.1  christos 
   6304  1.1  christos bfd_boolean
   6305  1.1  christos _bfd_elf_copy_private_section_data (bfd *ibfd,
   6306  1.1  christos 				    asection *isec,
   6307  1.1  christos 				    bfd *obfd,
   6308  1.1  christos 				    asection *osec)
   6309  1.1  christos {
   6310  1.1  christos   Elf_Internal_Shdr *ihdr, *ohdr;
   6311  1.1  christos 
   6312  1.1  christos   if (ibfd->xvec->flavour != bfd_target_elf_flavour
   6313  1.1  christos       || obfd->xvec->flavour != bfd_target_elf_flavour)
   6314  1.1  christos     return TRUE;
   6315  1.1  christos 
   6316  1.1  christos   ihdr = &elf_section_data (isec)->this_hdr;
   6317  1.1  christos   ohdr = &elf_section_data (osec)->this_hdr;
   6318  1.1  christos 
   6319  1.1  christos   ohdr->sh_entsize = ihdr->sh_entsize;
   6320  1.1  christos 
   6321  1.1  christos   if (ihdr->sh_type == SHT_SYMTAB
   6322  1.1  christos       || ihdr->sh_type == SHT_DYNSYM
   6323  1.1  christos       || ihdr->sh_type == SHT_GNU_verneed
   6324  1.1  christos       || ihdr->sh_type == SHT_GNU_verdef)
   6325  1.1  christos     ohdr->sh_info = ihdr->sh_info;
   6326  1.1  christos 
   6327  1.1  christos   return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
   6328  1.1  christos 					     NULL);
   6329  1.1  christos }
   6330  1.1  christos 
   6331  1.1  christos /* Look at all the SHT_GROUP sections in IBFD, making any adjustments
   6332  1.1  christos    necessary if we are removing either the SHT_GROUP section or any of
   6333  1.1  christos    the group member sections.  DISCARDED is the value that a section's
   6334  1.1  christos    output_section has if the section will be discarded, NULL when this
   6335  1.1  christos    function is called from objcopy, bfd_abs_section_ptr when called
   6336  1.1  christos    from the linker.  */
   6337  1.1  christos 
   6338  1.1  christos bfd_boolean
   6339  1.1  christos _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
   6340  1.1  christos {
   6341  1.1  christos   asection *isec;
   6342  1.1  christos 
   6343  1.1  christos   for (isec = ibfd->sections; isec != NULL; isec = isec->next)
   6344  1.1  christos     if (elf_section_type (isec) == SHT_GROUP)
   6345  1.1  christos       {
   6346  1.1  christos 	asection *first = elf_next_in_group (isec);
   6347  1.1  christos 	asection *s = first;
   6348  1.1  christos 	bfd_size_type removed = 0;
   6349  1.1  christos 
   6350  1.1  christos 	while (s != NULL)
   6351  1.1  christos 	  {
   6352  1.1  christos 	    /* If this member section is being output but the
   6353  1.1  christos 	       SHT_GROUP section is not, then clear the group info
   6354  1.1  christos 	       set up by _bfd_elf_copy_private_section_data.  */
   6355  1.1  christos 	    if (s->output_section != discarded
   6356  1.1  christos 		&& isec->output_section == discarded)
   6357  1.1  christos 	      {
   6358  1.1  christos 		elf_section_flags (s->output_section) &= ~SHF_GROUP;
   6359  1.1  christos 		elf_group_name (s->output_section) = NULL;
   6360  1.1  christos 	      }
   6361  1.1  christos 	    /* Conversely, if the member section is not being output
   6362  1.1  christos 	       but the SHT_GROUP section is, then adjust its size.  */
   6363  1.1  christos 	    else if (s->output_section == discarded
   6364  1.1  christos 		     && isec->output_section != discarded)
   6365  1.1  christos 	      removed += 4;
   6366  1.1  christos 	    s = elf_next_in_group (s);
   6367  1.1  christos 	    if (s == first)
   6368  1.1  christos 	      break;
   6369  1.1  christos 	  }
   6370  1.1  christos 	if (removed != 0)
   6371  1.1  christos 	  {
   6372  1.1  christos 	    if (discarded != NULL)
   6373  1.1  christos 	      {
   6374  1.1  christos 		/* If we've been called for ld -r, then we need to
   6375  1.1  christos 		   adjust the input section size.  This function may
   6376  1.1  christos 		   be called multiple times, so save the original
   6377  1.1  christos 		   size.  */
   6378  1.1  christos 		if (isec->rawsize == 0)
   6379  1.1  christos 		  isec->rawsize = isec->size;
   6380  1.1  christos 		isec->size = isec->rawsize - removed;
   6381  1.1  christos 	      }
   6382  1.1  christos 	    else
   6383  1.1  christos 	      {
   6384  1.1  christos 		/* Adjust the output section size when called from
   6385  1.1  christos 		   objcopy. */
   6386  1.1  christos 		isec->output_section->size -= removed;
   6387  1.1  christos 	      }
   6388  1.1  christos 	  }
   6389  1.1  christos       }
   6390  1.1  christos 
   6391  1.1  christos   return TRUE;
   6392  1.1  christos }
   6393  1.1  christos 
   6394  1.1  christos /* Copy private header information.  */
   6395  1.1  christos 
   6396  1.1  christos bfd_boolean
   6397  1.1  christos _bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
   6398  1.1  christos {
   6399  1.1  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   6400  1.1  christos       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   6401  1.1  christos     return TRUE;
   6402  1.1  christos 
   6403  1.1  christos   /* Copy over private BFD data if it has not already been copied.
   6404  1.1  christos      This must be done here, rather than in the copy_private_bfd_data
   6405  1.1  christos      entry point, because the latter is called after the section
   6406  1.1  christos      contents have been set, which means that the program headers have
   6407  1.1  christos      already been worked out.  */
   6408  1.1  christos   if (elf_tdata (obfd)->segment_map == NULL && elf_tdata (ibfd)->phdr != NULL)
   6409  1.1  christos     {
   6410  1.1  christos       if (! copy_private_bfd_data (ibfd, obfd))
   6411  1.1  christos 	return FALSE;
   6412  1.1  christos     }
   6413  1.1  christos 
   6414  1.1  christos   return _bfd_elf_fixup_group_sections (ibfd, NULL);
   6415  1.1  christos }
   6416  1.1  christos 
   6417  1.1  christos /* Copy private symbol information.  If this symbol is in a section
   6418  1.1  christos    which we did not map into a BFD section, try to map the section
   6419  1.1  christos    index correctly.  We use special macro definitions for the mapped
   6420  1.1  christos    section indices; these definitions are interpreted by the
   6421  1.1  christos    swap_out_syms function.  */
   6422  1.1  christos 
   6423  1.1  christos #define MAP_ONESYMTAB (SHN_HIOS + 1)
   6424  1.1  christos #define MAP_DYNSYMTAB (SHN_HIOS + 2)
   6425  1.1  christos #define MAP_STRTAB    (SHN_HIOS + 3)
   6426  1.1  christos #define MAP_SHSTRTAB  (SHN_HIOS + 4)
   6427  1.1  christos #define MAP_SYM_SHNDX (SHN_HIOS + 5)
   6428  1.1  christos 
   6429  1.1  christos bfd_boolean
   6430  1.1  christos _bfd_elf_copy_private_symbol_data (bfd *ibfd,
   6431  1.1  christos 				   asymbol *isymarg,
   6432  1.1  christos 				   bfd *obfd,
   6433  1.1  christos 				   asymbol *osymarg)
   6434  1.1  christos {
   6435  1.1  christos   elf_symbol_type *isym, *osym;
   6436  1.1  christos 
   6437  1.1  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   6438  1.1  christos       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   6439  1.1  christos     return TRUE;
   6440  1.1  christos 
   6441  1.1  christos   isym = elf_symbol_from (ibfd, isymarg);
   6442  1.1  christos   osym = elf_symbol_from (obfd, osymarg);
   6443  1.1  christos 
   6444  1.1  christos   if (isym != NULL
   6445  1.1  christos       && isym->internal_elf_sym.st_shndx != 0
   6446  1.1  christos       && osym != NULL
   6447  1.1  christos       && bfd_is_abs_section (isym->symbol.section))
   6448  1.1  christos     {
   6449  1.1  christos       unsigned int shndx;
   6450  1.1  christos 
   6451  1.1  christos       shndx = isym->internal_elf_sym.st_shndx;
   6452  1.1  christos       if (shndx == elf_onesymtab (ibfd))
   6453  1.1  christos 	shndx = MAP_ONESYMTAB;
   6454  1.1  christos       else if (shndx == elf_dynsymtab (ibfd))
   6455  1.1  christos 	shndx = MAP_DYNSYMTAB;
   6456  1.1  christos       else if (shndx == elf_tdata (ibfd)->strtab_section)
   6457  1.1  christos 	shndx = MAP_STRTAB;
   6458  1.1  christos       else if (shndx == elf_tdata (ibfd)->shstrtab_section)
   6459  1.1  christos 	shndx = MAP_SHSTRTAB;
   6460  1.1  christos       else if (shndx == elf_tdata (ibfd)->symtab_shndx_section)
   6461  1.1  christos 	shndx = MAP_SYM_SHNDX;
   6462  1.1  christos       osym->internal_elf_sym.st_shndx = shndx;
   6463  1.1  christos     }
   6464  1.1  christos 
   6465  1.1  christos   return TRUE;
   6466  1.1  christos }
   6467  1.1  christos 
   6468  1.1  christos /* Swap out the symbols.  */
   6469  1.1  christos 
   6470  1.1  christos static bfd_boolean
   6471  1.1  christos swap_out_syms (bfd *abfd,
   6472  1.1  christos 	       struct bfd_strtab_hash **sttp,
   6473  1.1  christos 	       int relocatable_p)
   6474  1.1  christos {
   6475  1.1  christos   const struct elf_backend_data *bed;
   6476  1.1  christos   int symcount;
   6477  1.1  christos   asymbol **syms;
   6478  1.1  christos   struct bfd_strtab_hash *stt;
   6479  1.1  christos   Elf_Internal_Shdr *symtab_hdr;
   6480  1.1  christos   Elf_Internal_Shdr *symtab_shndx_hdr;
   6481  1.1  christos   Elf_Internal_Shdr *symstrtab_hdr;
   6482  1.1  christos   bfd_byte *outbound_syms;
   6483  1.1  christos   bfd_byte *outbound_shndx;
   6484  1.1  christos   int idx;
   6485  1.1  christos   bfd_size_type amt;
   6486  1.1  christos   bfd_boolean name_local_sections;
   6487  1.1  christos 
   6488  1.1  christos   if (!elf_map_symbols (abfd))
   6489  1.1  christos     return FALSE;
   6490  1.1  christos 
   6491  1.1  christos   /* Dump out the symtabs.  */
   6492  1.1  christos   stt = _bfd_elf_stringtab_init ();
   6493  1.1  christos   if (stt == NULL)
   6494  1.1  christos     return FALSE;
   6495  1.1  christos 
   6496  1.1  christos   bed = get_elf_backend_data (abfd);
   6497  1.1  christos   symcount = bfd_get_symcount (abfd);
   6498  1.1  christos   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   6499  1.1  christos   symtab_hdr->sh_type = SHT_SYMTAB;
   6500  1.1  christos   symtab_hdr->sh_entsize = bed->s->sizeof_sym;
   6501  1.1  christos   symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
   6502  1.1  christos   symtab_hdr->sh_info = elf_num_locals (abfd) + 1;
   6503  1.1  christos   symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
   6504  1.1  christos 
   6505  1.1  christos   symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
   6506  1.1  christos   symstrtab_hdr->sh_type = SHT_STRTAB;
   6507  1.1  christos 
   6508  1.1  christos   outbound_syms = (bfd_byte *) bfd_alloc2 (abfd, 1 + symcount,
   6509  1.1  christos                                            bed->s->sizeof_sym);
   6510  1.1  christos   if (outbound_syms == NULL)
   6511  1.1  christos     {
   6512  1.1  christos       _bfd_stringtab_free (stt);
   6513  1.1  christos       return FALSE;
   6514  1.1  christos     }
   6515  1.1  christos   symtab_hdr->contents = outbound_syms;
   6516  1.1  christos 
   6517  1.1  christos   outbound_shndx = NULL;
   6518  1.1  christos   symtab_shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
   6519  1.1  christos   if (symtab_shndx_hdr->sh_name != 0)
   6520  1.1  christos     {
   6521  1.1  christos       amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
   6522  1.1  christos       outbound_shndx =  (bfd_byte *)
   6523  1.1  christos           bfd_zalloc2 (abfd, 1 + symcount, sizeof (Elf_External_Sym_Shndx));
   6524  1.1  christos       if (outbound_shndx == NULL)
   6525  1.1  christos 	{
   6526  1.1  christos 	  _bfd_stringtab_free (stt);
   6527  1.1  christos 	  return FALSE;
   6528  1.1  christos 	}
   6529  1.1  christos 
   6530  1.1  christos       symtab_shndx_hdr->contents = outbound_shndx;
   6531  1.1  christos       symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
   6532  1.1  christos       symtab_shndx_hdr->sh_size = amt;
   6533  1.1  christos       symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
   6534  1.1  christos       symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
   6535  1.1  christos     }
   6536  1.1  christos 
   6537  1.1  christos   /* Now generate the data (for "contents").  */
   6538  1.1  christos   {
   6539  1.1  christos     /* Fill in zeroth symbol and swap it out.  */
   6540  1.1  christos     Elf_Internal_Sym sym;
   6541  1.1  christos     sym.st_name = 0;
   6542  1.1  christos     sym.st_value = 0;
   6543  1.1  christos     sym.st_size = 0;
   6544  1.1  christos     sym.st_info = 0;
   6545  1.1  christos     sym.st_other = 0;
   6546  1.1  christos     sym.st_shndx = SHN_UNDEF;
   6547  1.1  christos     sym.st_target_internal = 0;
   6548  1.1  christos     bed->s->swap_symbol_out (abfd, &sym, outbound_syms, outbound_shndx);
   6549  1.1  christos     outbound_syms += bed->s->sizeof_sym;
   6550  1.1  christos     if (outbound_shndx != NULL)
   6551  1.1  christos       outbound_shndx += sizeof (Elf_External_Sym_Shndx);
   6552  1.1  christos   }
   6553  1.1  christos 
   6554  1.1  christos   name_local_sections
   6555  1.1  christos     = (bed->elf_backend_name_local_section_symbols
   6556  1.1  christos        && bed->elf_backend_name_local_section_symbols (abfd));
   6557  1.1  christos 
   6558  1.1  christos   syms = bfd_get_outsymbols (abfd);
   6559  1.1  christos   for (idx = 0; idx < symcount; idx++)
   6560  1.1  christos     {
   6561  1.1  christos       Elf_Internal_Sym sym;
   6562  1.1  christos       bfd_vma value = syms[idx]->value;
   6563  1.1  christos       elf_symbol_type *type_ptr;
   6564  1.1  christos       flagword flags = syms[idx]->flags;
   6565  1.1  christos       int type;
   6566  1.1  christos 
   6567  1.1  christos       if (!name_local_sections
   6568  1.1  christos 	  && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
   6569  1.1  christos 	{
   6570  1.1  christos 	  /* Local section symbols have no name.  */
   6571  1.1  christos 	  sym.st_name = 0;
   6572  1.1  christos 	}
   6573  1.1  christos       else
   6574  1.1  christos 	{
   6575  1.1  christos 	  sym.st_name = (unsigned long) _bfd_stringtab_add (stt,
   6576  1.1  christos 							    syms[idx]->name,
   6577  1.1  christos 							    TRUE, FALSE);
   6578  1.1  christos 	  if (sym.st_name == (unsigned long) -1)
   6579  1.1  christos 	    {
   6580  1.1  christos 	      _bfd_stringtab_free (stt);
   6581  1.1  christos 	      return FALSE;
   6582  1.1  christos 	    }
   6583  1.1  christos 	}
   6584  1.1  christos 
   6585  1.1  christos       type_ptr = elf_symbol_from (abfd, syms[idx]);
   6586  1.1  christos 
   6587  1.1  christos       if ((flags & BSF_SECTION_SYM) == 0
   6588  1.1  christos 	  && bfd_is_com_section (syms[idx]->section))
   6589  1.1  christos 	{
   6590  1.1  christos 	  /* ELF common symbols put the alignment into the `value' field,
   6591  1.1  christos 	     and the size into the `size' field.  This is backwards from
   6592  1.1  christos 	     how BFD handles it, so reverse it here.  */
   6593  1.1  christos 	  sym.st_size = value;
   6594  1.1  christos 	  if (type_ptr == NULL
   6595  1.1  christos 	      || type_ptr->internal_elf_sym.st_value == 0)
   6596  1.1  christos 	    sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
   6597  1.1  christos 	  else
   6598  1.1  christos 	    sym.st_value = type_ptr->internal_elf_sym.st_value;
   6599  1.1  christos 	  sym.st_shndx = _bfd_elf_section_from_bfd_section
   6600  1.1  christos 	    (abfd, syms[idx]->section);
   6601  1.1  christos 	}
   6602  1.1  christos       else
   6603  1.1  christos 	{
   6604  1.1  christos 	  asection *sec = syms[idx]->section;
   6605  1.1  christos 	  unsigned int shndx;
   6606  1.1  christos 
   6607  1.1  christos 	  if (sec->output_section)
   6608  1.1  christos 	    {
   6609  1.1  christos 	      value += sec->output_offset;
   6610  1.1  christos 	      sec = sec->output_section;
   6611  1.1  christos 	    }
   6612  1.1  christos 
   6613  1.1  christos 	  /* Don't add in the section vma for relocatable output.  */
   6614  1.1  christos 	  if (! relocatable_p)
   6615  1.1  christos 	    value += sec->vma;
   6616  1.1  christos 	  sym.st_value = value;
   6617  1.1  christos 	  sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
   6618  1.1  christos 
   6619  1.1  christos 	  if (bfd_is_abs_section (sec)
   6620  1.1  christos 	      && type_ptr != NULL
   6621  1.1  christos 	      && type_ptr->internal_elf_sym.st_shndx != 0)
   6622  1.1  christos 	    {
   6623  1.1  christos 	      /* This symbol is in a real ELF section which we did
   6624  1.1  christos 		 not create as a BFD section.  Undo the mapping done
   6625  1.1  christos 		 by copy_private_symbol_data.  */
   6626  1.1  christos 	      shndx = type_ptr->internal_elf_sym.st_shndx;
   6627  1.1  christos 	      switch (shndx)
   6628  1.1  christos 		{
   6629  1.1  christos 		case MAP_ONESYMTAB:
   6630  1.1  christos 		  shndx = elf_onesymtab (abfd);
   6631  1.1  christos 		  break;
   6632  1.1  christos 		case MAP_DYNSYMTAB:
   6633  1.1  christos 		  shndx = elf_dynsymtab (abfd);
   6634  1.1  christos 		  break;
   6635  1.1  christos 		case MAP_STRTAB:
   6636  1.1  christos 		  shndx = elf_tdata (abfd)->strtab_section;
   6637  1.1  christos 		  break;
   6638  1.1  christos 		case MAP_SHSTRTAB:
   6639  1.1  christos 		  shndx = elf_tdata (abfd)->shstrtab_section;
   6640  1.1  christos 		  break;
   6641  1.1  christos 		case MAP_SYM_SHNDX:
   6642  1.1  christos 		  shndx = elf_tdata (abfd)->symtab_shndx_section;
   6643  1.1  christos 		  break;
   6644  1.1  christos 		default:
   6645  1.1  christos 		  break;
   6646  1.1  christos 		}
   6647  1.1  christos 	    }
   6648  1.1  christos 	  else
   6649  1.1  christos 	    {
   6650  1.1  christos 	      shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   6651  1.1  christos 
   6652  1.1  christos 	      if (shndx == SHN_BAD)
   6653  1.1  christos 		{
   6654  1.1  christos 		  asection *sec2;
   6655  1.1  christos 
   6656  1.1  christos 		  /* Writing this would be a hell of a lot easier if
   6657  1.1  christos 		     we had some decent documentation on bfd, and
   6658  1.1  christos 		     knew what to expect of the library, and what to
   6659  1.1  christos 		     demand of applications.  For example, it
   6660  1.1  christos 		     appears that `objcopy' might not set the
   6661  1.1  christos 		     section of a symbol to be a section that is
   6662  1.1  christos 		     actually in the output file.  */
   6663  1.1  christos 		  sec2 = bfd_get_section_by_name (abfd, sec->name);
   6664  1.1  christos 		  if (sec2 == NULL)
   6665  1.1  christos 		    {
   6666  1.1  christos 		      _bfd_error_handler (_("\
   6667  1.1  christos Unable to find equivalent output section for symbol '%s' from section '%s'"),
   6668  1.1  christos 					  syms[idx]->name ? syms[idx]->name : "<Local sym>",
   6669  1.1  christos 					  sec->name);
   6670  1.1  christos 		      bfd_set_error (bfd_error_invalid_operation);
   6671  1.1  christos 		      _bfd_stringtab_free (stt);
   6672  1.1  christos 		      return FALSE;
   6673  1.1  christos 		    }
   6674  1.1  christos 
   6675  1.1  christos 		  shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
   6676  1.1  christos 		  BFD_ASSERT (shndx != SHN_BAD);
   6677  1.1  christos 		}
   6678  1.1  christos 	    }
   6679  1.1  christos 
   6680  1.1  christos 	  sym.st_shndx = shndx;
   6681  1.1  christos 	}
   6682  1.1  christos 
   6683  1.1  christos       if ((flags & BSF_THREAD_LOCAL) != 0)
   6684  1.1  christos 	type = STT_TLS;
   6685  1.1  christos       else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
   6686  1.1  christos 	type = STT_GNU_IFUNC;
   6687  1.1  christos       else if ((flags & BSF_FUNCTION) != 0)
   6688  1.1  christos 	type = STT_FUNC;
   6689  1.1  christos       else if ((flags & BSF_OBJECT) != 0)
   6690  1.1  christos 	type = STT_OBJECT;
   6691  1.1  christos       else if ((flags & BSF_RELC) != 0)
   6692  1.1  christos 	type = STT_RELC;
   6693  1.1  christos       else if ((flags & BSF_SRELC) != 0)
   6694  1.1  christos 	type = STT_SRELC;
   6695  1.1  christos       else
   6696  1.1  christos 	type = STT_NOTYPE;
   6697  1.1  christos 
   6698  1.1  christos       if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
   6699  1.1  christos 	type = STT_TLS;
   6700  1.1  christos 
   6701  1.1  christos       /* Processor-specific types.  */
   6702  1.1  christos       if (type_ptr != NULL
   6703  1.1  christos 	  && bed->elf_backend_get_symbol_type)
   6704  1.1  christos 	type = ((*bed->elf_backend_get_symbol_type)
   6705  1.1  christos 		(&type_ptr->internal_elf_sym, type));
   6706  1.1  christos 
   6707  1.1  christos       if (flags & BSF_SECTION_SYM)
   6708  1.1  christos 	{
   6709  1.1  christos 	  if (flags & BSF_GLOBAL)
   6710  1.1  christos 	    sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
   6711  1.1  christos 	  else
   6712  1.1  christos 	    sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
   6713  1.1  christos 	}
   6714  1.1  christos       else if (bfd_is_com_section (syms[idx]->section))
   6715  1.1  christos 	{
   6716  1.1  christos #ifdef USE_STT_COMMON
   6717  1.1  christos 	  if (type == STT_OBJECT)
   6718  1.1  christos 	    sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_COMMON);
   6719  1.1  christos 	  else
   6720  1.1  christos #endif
   6721  1.1  christos 	    sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
   6722  1.1  christos 	}
   6723  1.1  christos       else if (bfd_is_und_section (syms[idx]->section))
   6724  1.1  christos 	sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
   6725  1.1  christos 				    ? STB_WEAK
   6726  1.1  christos 				    : STB_GLOBAL),
   6727  1.1  christos 				   type);
   6728  1.1  christos       else if (flags & BSF_FILE)
   6729  1.1  christos 	sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
   6730  1.1  christos       else
   6731  1.1  christos 	{
   6732  1.1  christos 	  int bind = STB_LOCAL;
   6733  1.1  christos 
   6734  1.1  christos 	  if (flags & BSF_LOCAL)
   6735  1.1  christos 	    bind = STB_LOCAL;
   6736  1.1  christos 	  else if (flags & BSF_GNU_UNIQUE)
   6737  1.1  christos 	    bind = STB_GNU_UNIQUE;
   6738  1.1  christos 	  else if (flags & BSF_WEAK)
   6739  1.1  christos 	    bind = STB_WEAK;
   6740  1.1  christos 	  else if (flags & BSF_GLOBAL)
   6741  1.1  christos 	    bind = STB_GLOBAL;
   6742  1.1  christos 
   6743  1.1  christos 	  sym.st_info = ELF_ST_INFO (bind, type);
   6744  1.1  christos 	}
   6745  1.1  christos 
   6746  1.1  christos       if (type_ptr != NULL)
   6747  1.1  christos 	{
   6748  1.1  christos 	  sym.st_other = type_ptr->internal_elf_sym.st_other;
   6749  1.1  christos 	  sym.st_target_internal
   6750  1.1  christos 	    = type_ptr->internal_elf_sym.st_target_internal;
   6751  1.1  christos 	}
   6752  1.1  christos       else
   6753  1.1  christos 	{
   6754  1.1  christos 	  sym.st_other = 0;
   6755  1.1  christos 	  sym.st_target_internal = 0;
   6756  1.1  christos 	}
   6757  1.1  christos 
   6758  1.1  christos       bed->s->swap_symbol_out (abfd, &sym, outbound_syms, outbound_shndx);
   6759  1.1  christos       outbound_syms += bed->s->sizeof_sym;
   6760  1.1  christos       if (outbound_shndx != NULL)
   6761  1.1  christos 	outbound_shndx += sizeof (Elf_External_Sym_Shndx);
   6762  1.1  christos     }
   6763  1.1  christos 
   6764  1.1  christos   *sttp = stt;
   6765  1.1  christos   symstrtab_hdr->sh_size = _bfd_stringtab_size (stt);
   6766  1.1  christos   symstrtab_hdr->sh_type = SHT_STRTAB;
   6767  1.1  christos 
   6768  1.1  christos   symstrtab_hdr->sh_flags = 0;
   6769  1.1  christos   symstrtab_hdr->sh_addr = 0;
   6770  1.1  christos   symstrtab_hdr->sh_entsize = 0;
   6771  1.1  christos   symstrtab_hdr->sh_link = 0;
   6772  1.1  christos   symstrtab_hdr->sh_info = 0;
   6773  1.1  christos   symstrtab_hdr->sh_addralign = 1;
   6774  1.1  christos 
   6775  1.1  christos   return TRUE;
   6776  1.1  christos }
   6777  1.1  christos 
   6778  1.1  christos /* Return the number of bytes required to hold the symtab vector.
   6779  1.1  christos 
   6780  1.1  christos    Note that we base it on the count plus 1, since we will null terminate
   6781  1.1  christos    the vector allocated based on this size.  However, the ELF symbol table
   6782  1.1  christos    always has a dummy entry as symbol #0, so it ends up even.  */
   6783  1.1  christos 
   6784  1.1  christos long
   6785  1.1  christos _bfd_elf_get_symtab_upper_bound (bfd *abfd)
   6786  1.1  christos {
   6787  1.1  christos   long symcount;
   6788  1.1  christos   long symtab_size;
   6789  1.1  christos   Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
   6790  1.1  christos 
   6791  1.1  christos   symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
   6792  1.1  christos   symtab_size = (symcount + 1) * (sizeof (asymbol *));
   6793  1.1  christos   if (symcount > 0)
   6794  1.1  christos     symtab_size -= sizeof (asymbol *);
   6795  1.1  christos 
   6796  1.1  christos   return symtab_size;
   6797  1.1  christos }
   6798  1.1  christos 
   6799  1.1  christos long
   6800  1.1  christos _bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
   6801  1.1  christos {
   6802  1.1  christos   long symcount;
   6803  1.1  christos   long symtab_size;
   6804  1.1  christos   Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
   6805  1.1  christos 
   6806  1.1  christos   if (elf_dynsymtab (abfd) == 0)
   6807  1.1  christos     {
   6808  1.1  christos       bfd_set_error (bfd_error_invalid_operation);
   6809  1.1  christos       return -1;
   6810  1.1  christos     }
   6811  1.1  christos 
   6812  1.1  christos   symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
   6813  1.1  christos   symtab_size = (symcount + 1) * (sizeof (asymbol *));
   6814  1.1  christos   if (symcount > 0)
   6815  1.1  christos     symtab_size -= sizeof (asymbol *);
   6816  1.1  christos 
   6817  1.1  christos   return symtab_size;
   6818  1.1  christos }
   6819  1.1  christos 
   6820  1.1  christos long
   6821  1.1  christos _bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
   6822  1.1  christos 				sec_ptr asect)
   6823  1.1  christos {
   6824  1.1  christos   return (asect->reloc_count + 1) * sizeof (arelent *);
   6825  1.1  christos }
   6826  1.1  christos 
   6827  1.1  christos /* Canonicalize the relocs.  */
   6828  1.1  christos 
   6829  1.1  christos long
   6830  1.1  christos _bfd_elf_canonicalize_reloc (bfd *abfd,
   6831  1.1  christos 			     sec_ptr section,
   6832  1.1  christos 			     arelent **relptr,
   6833  1.1  christos 			     asymbol **symbols)
   6834  1.1  christos {
   6835  1.1  christos   arelent *tblptr;
   6836  1.1  christos   unsigned int i;
   6837  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   6838  1.1  christos 
   6839  1.1  christos   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
   6840  1.1  christos     return -1;
   6841  1.1  christos 
   6842  1.1  christos   tblptr = section->relocation;
   6843  1.1  christos   for (i = 0; i < section->reloc_count; i++)
   6844  1.1  christos     *relptr++ = tblptr++;
   6845  1.1  christos 
   6846  1.1  christos   *relptr = NULL;
   6847  1.1  christos 
   6848  1.1  christos   return section->reloc_count;
   6849  1.1  christos }
   6850  1.1  christos 
   6851  1.1  christos long
   6852  1.1  christos _bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
   6853  1.1  christos {
   6854  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   6855  1.1  christos   long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
   6856  1.1  christos 
   6857  1.1  christos   if (symcount >= 0)
   6858  1.1  christos     bfd_get_symcount (abfd) = symcount;
   6859  1.1  christos   return symcount;
   6860  1.1  christos }
   6861  1.1  christos 
   6862  1.1  christos long
   6863  1.1  christos _bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
   6864  1.1  christos 				      asymbol **allocation)
   6865  1.1  christos {
   6866  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   6867  1.1  christos   long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
   6868  1.1  christos 
   6869  1.1  christos   if (symcount >= 0)
   6870  1.1  christos     bfd_get_dynamic_symcount (abfd) = symcount;
   6871  1.1  christos   return symcount;
   6872  1.1  christos }
   6873  1.1  christos 
   6874  1.1  christos /* Return the size required for the dynamic reloc entries.  Any loadable
   6875  1.1  christos    section that was actually installed in the BFD, and has type SHT_REL
   6876  1.1  christos    or SHT_RELA, and uses the dynamic symbol table, is considered to be a
   6877  1.1  christos    dynamic reloc section.  */
   6878  1.1  christos 
   6879  1.1  christos long
   6880  1.1  christos _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
   6881  1.1  christos {
   6882  1.1  christos   long ret;
   6883  1.1  christos   asection *s;
   6884  1.1  christos 
   6885  1.1  christos   if (elf_dynsymtab (abfd) == 0)
   6886  1.1  christos     {
   6887  1.1  christos       bfd_set_error (bfd_error_invalid_operation);
   6888  1.1  christos       return -1;
   6889  1.1  christos     }
   6890  1.1  christos 
   6891  1.1  christos   ret = sizeof (arelent *);
   6892  1.1  christos   for (s = abfd->sections; s != NULL; s = s->next)
   6893  1.1  christos     if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
   6894  1.1  christos 	&& (elf_section_data (s)->this_hdr.sh_type == SHT_REL
   6895  1.1  christos 	    || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
   6896  1.1  christos       ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
   6897  1.1  christos 	      * sizeof (arelent *));
   6898  1.1  christos 
   6899  1.1  christos   return ret;
   6900  1.1  christos }
   6901  1.1  christos 
   6902  1.1  christos /* Canonicalize the dynamic relocation entries.  Note that we return the
   6903  1.1  christos    dynamic relocations as a single block, although they are actually
   6904  1.1  christos    associated with particular sections; the interface, which was
   6905  1.1  christos    designed for SunOS style shared libraries, expects that there is only
   6906  1.1  christos    one set of dynamic relocs.  Any loadable section that was actually
   6907  1.1  christos    installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
   6908  1.1  christos    dynamic symbol table, is considered to be a dynamic reloc section.  */
   6909  1.1  christos 
   6910  1.1  christos long
   6911  1.1  christos _bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
   6912  1.1  christos 				     arelent **storage,
   6913  1.1  christos 				     asymbol **syms)
   6914  1.1  christos {
   6915  1.1  christos   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
   6916  1.1  christos   asection *s;
   6917  1.1  christos   long ret;
   6918  1.1  christos 
   6919  1.1  christos   if (elf_dynsymtab (abfd) == 0)
   6920  1.1  christos     {
   6921  1.1  christos       bfd_set_error (bfd_error_invalid_operation);
   6922  1.1  christos       return -1;
   6923  1.1  christos     }
   6924  1.1  christos 
   6925  1.1  christos   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
   6926  1.1  christos   ret = 0;
   6927  1.1  christos   for (s = abfd->sections; s != NULL; s = s->next)
   6928  1.1  christos     {
   6929  1.1  christos       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
   6930  1.1  christos 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
   6931  1.1  christos 	      || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
   6932  1.1  christos 	{
   6933  1.1  christos 	  arelent *p;
   6934  1.1  christos 	  long count, i;
   6935  1.1  christos 
   6936  1.1  christos 	  if (! (*slurp_relocs) (abfd, s, syms, TRUE))
   6937  1.1  christos 	    return -1;
   6938  1.1  christos 	  count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
   6939  1.1  christos 	  p = s->relocation;
   6940  1.1  christos 	  for (i = 0; i < count; i++)
   6941  1.1  christos 	    *storage++ = p++;
   6942  1.1  christos 	  ret += count;
   6943  1.1  christos 	}
   6944  1.1  christos     }
   6945  1.1  christos 
   6946  1.1  christos   *storage = NULL;
   6947  1.1  christos 
   6948  1.1  christos   return ret;
   6949  1.1  christos }
   6950  1.1  christos 
   6951  1.1  christos /* Read in the version information.  */
   6953  1.1  christos 
   6954  1.1  christos bfd_boolean
   6955  1.1  christos _bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
   6956  1.1  christos {
   6957  1.1  christos   bfd_byte *contents = NULL;
   6958  1.1  christos   unsigned int freeidx = 0;
   6959  1.1  christos 
   6960  1.1  christos   if (elf_dynverref (abfd) != 0)
   6961  1.1  christos     {
   6962  1.1  christos       Elf_Internal_Shdr *hdr;
   6963  1.1  christos       Elf_External_Verneed *everneed;
   6964  1.1  christos       Elf_Internal_Verneed *iverneed;
   6965  1.1  christos       unsigned int i;
   6966  1.1  christos       bfd_byte *contents_end;
   6967  1.1  christos 
   6968  1.1  christos       hdr = &elf_tdata (abfd)->dynverref_hdr;
   6969  1.1  christos 
   6970  1.1  christos       elf_tdata (abfd)->verref = (Elf_Internal_Verneed *)
   6971  1.1  christos           bfd_zalloc2 (abfd, hdr->sh_info, sizeof (Elf_Internal_Verneed));
   6972  1.1  christos       if (elf_tdata (abfd)->verref == NULL)
   6973  1.1  christos 	goto error_return;
   6974  1.1  christos 
   6975  1.1  christos       elf_tdata (abfd)->cverrefs = hdr->sh_info;
   6976  1.1  christos 
   6977  1.1  christos       contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
   6978  1.1  christos       if (contents == NULL)
   6979  1.1  christos 	{
   6980  1.1  christos error_return_verref:
   6981  1.1  christos 	  elf_tdata (abfd)->verref = NULL;
   6982  1.1  christos 	  elf_tdata (abfd)->cverrefs = 0;
   6983  1.1  christos 	  goto error_return;
   6984  1.1  christos 	}
   6985  1.1  christos       if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
   6986  1.1  christos 	  || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
   6987  1.1  christos 	goto error_return_verref;
   6988  1.1  christos 
   6989  1.1  christos       if (hdr->sh_info && hdr->sh_size < sizeof (Elf_External_Verneed))
   6990  1.1  christos 	goto error_return_verref;
   6991  1.1  christos 
   6992  1.1  christos       BFD_ASSERT (sizeof (Elf_External_Verneed)
   6993  1.1  christos 		  == sizeof (Elf_External_Vernaux));
   6994  1.1  christos       contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
   6995  1.1  christos       everneed = (Elf_External_Verneed *) contents;
   6996  1.1  christos       iverneed = elf_tdata (abfd)->verref;
   6997  1.1  christos       for (i = 0; i < hdr->sh_info; i++, iverneed++)
   6998  1.1  christos 	{
   6999  1.1  christos 	  Elf_External_Vernaux *evernaux;
   7000  1.1  christos 	  Elf_Internal_Vernaux *ivernaux;
   7001  1.1  christos 	  unsigned int j;
   7002  1.1  christos 
   7003  1.1  christos 	  _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
   7004  1.1  christos 
   7005  1.1  christos 	  iverneed->vn_bfd = abfd;
   7006  1.1  christos 
   7007  1.1  christos 	  iverneed->vn_filename =
   7008  1.1  christos 	    bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
   7009  1.1  christos 					     iverneed->vn_file);
   7010  1.1  christos 	  if (iverneed->vn_filename == NULL)
   7011  1.1  christos 	    goto error_return_verref;
   7012  1.1  christos 
   7013  1.1  christos 	  if (iverneed->vn_cnt == 0)
   7014  1.1  christos 	    iverneed->vn_auxptr = NULL;
   7015  1.1  christos 	  else
   7016  1.1  christos 	    {
   7017  1.1  christos 	      iverneed->vn_auxptr = (struct elf_internal_vernaux *)
   7018  1.1  christos                   bfd_alloc2 (abfd, iverneed->vn_cnt,
   7019  1.1  christos                               sizeof (Elf_Internal_Vernaux));
   7020  1.1  christos 	      if (iverneed->vn_auxptr == NULL)
   7021  1.1  christos 		goto error_return_verref;
   7022  1.1  christos 	    }
   7023  1.1  christos 
   7024  1.1  christos 	  if (iverneed->vn_aux
   7025  1.1  christos 	      > (size_t) (contents_end - (bfd_byte *) everneed))
   7026  1.1  christos 	    goto error_return_verref;
   7027  1.1  christos 
   7028  1.1  christos 	  evernaux = ((Elf_External_Vernaux *)
   7029  1.1  christos 		      ((bfd_byte *) everneed + iverneed->vn_aux));
   7030  1.1  christos 	  ivernaux = iverneed->vn_auxptr;
   7031  1.1  christos 	  for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
   7032  1.1  christos 	    {
   7033  1.1  christos 	      _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
   7034  1.1  christos 
   7035  1.1  christos 	      ivernaux->vna_nodename =
   7036  1.1  christos 		bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
   7037  1.1  christos 						 ivernaux->vna_name);
   7038  1.1  christos 	      if (ivernaux->vna_nodename == NULL)
   7039  1.1  christos 		goto error_return_verref;
   7040  1.1  christos 
   7041  1.1  christos 	      if (j + 1 < iverneed->vn_cnt)
   7042  1.1  christos 		ivernaux->vna_nextptr = ivernaux + 1;
   7043  1.1  christos 	      else
   7044  1.1  christos 		ivernaux->vna_nextptr = NULL;
   7045  1.1  christos 
   7046  1.1  christos 	      if (ivernaux->vna_next
   7047  1.1  christos 		  > (size_t) (contents_end - (bfd_byte *) evernaux))
   7048  1.1  christos 		goto error_return_verref;
   7049  1.1  christos 
   7050  1.1  christos 	      evernaux = ((Elf_External_Vernaux *)
   7051  1.1  christos 			  ((bfd_byte *) evernaux + ivernaux->vna_next));
   7052  1.1  christos 
   7053  1.1  christos 	      if (ivernaux->vna_other > freeidx)
   7054  1.1  christos 		freeidx = ivernaux->vna_other;
   7055  1.1  christos 	    }
   7056  1.1  christos 
   7057  1.1  christos 	  if (i + 1 < hdr->sh_info)
   7058  1.1  christos 	    iverneed->vn_nextref = iverneed + 1;
   7059  1.1  christos 	  else
   7060  1.1  christos 	    iverneed->vn_nextref = NULL;
   7061  1.1  christos 
   7062  1.1  christos 	  if (iverneed->vn_next
   7063  1.1  christos 	      > (size_t) (contents_end - (bfd_byte *) everneed))
   7064  1.1  christos 	    goto error_return_verref;
   7065  1.1  christos 
   7066  1.1  christos 	  everneed = ((Elf_External_Verneed *)
   7067  1.1  christos 		      ((bfd_byte *) everneed + iverneed->vn_next));
   7068  1.1  christos 	}
   7069  1.1  christos 
   7070  1.1  christos       free (contents);
   7071  1.1  christos       contents = NULL;
   7072  1.1  christos     }
   7073  1.1  christos 
   7074  1.1  christos   if (elf_dynverdef (abfd) != 0)
   7075  1.1  christos     {
   7076  1.1  christos       Elf_Internal_Shdr *hdr;
   7077  1.1  christos       Elf_External_Verdef *everdef;
   7078  1.1  christos       Elf_Internal_Verdef *iverdef;
   7079  1.1  christos       Elf_Internal_Verdef *iverdefarr;
   7080  1.1  christos       Elf_Internal_Verdef iverdefmem;
   7081  1.1  christos       unsigned int i;
   7082  1.1  christos       unsigned int maxidx;
   7083  1.1  christos       bfd_byte *contents_end_def, *contents_end_aux;
   7084  1.1  christos 
   7085  1.1  christos       hdr = &elf_tdata (abfd)->dynverdef_hdr;
   7086  1.1  christos 
   7087  1.1  christos       contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
   7088  1.1  christos       if (contents == NULL)
   7089  1.1  christos 	goto error_return;
   7090  1.1  christos       if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
   7091  1.1  christos 	  || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
   7092  1.1  christos 	goto error_return;
   7093  1.1  christos 
   7094  1.1  christos       if (hdr->sh_info && hdr->sh_size < sizeof (Elf_External_Verdef))
   7095  1.1  christos 	goto error_return;
   7096  1.1  christos 
   7097  1.1  christos       BFD_ASSERT (sizeof (Elf_External_Verdef)
   7098  1.1  christos 		  >= sizeof (Elf_External_Verdaux));
   7099  1.1  christos       contents_end_def = contents + hdr->sh_size
   7100  1.1  christos 			 - sizeof (Elf_External_Verdef);
   7101  1.1  christos       contents_end_aux = contents + hdr->sh_size
   7102  1.1  christos 			 - sizeof (Elf_External_Verdaux);
   7103  1.1  christos 
   7104  1.1  christos       /* We know the number of entries in the section but not the maximum
   7105  1.1  christos 	 index.  Therefore we have to run through all entries and find
   7106  1.1  christos 	 the maximum.  */
   7107  1.1  christos       everdef = (Elf_External_Verdef *) contents;
   7108  1.1  christos       maxidx = 0;
   7109  1.1  christos       for (i = 0; i < hdr->sh_info; ++i)
   7110  1.1  christos 	{
   7111  1.1  christos 	  _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
   7112  1.1  christos 
   7113  1.1  christos 	  if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
   7114  1.1  christos 	    maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
   7115  1.1  christos 
   7116  1.1  christos 	  if (iverdefmem.vd_next
   7117  1.1  christos 	      > (size_t) (contents_end_def - (bfd_byte *) everdef))
   7118  1.1  christos 	    goto error_return;
   7119  1.1  christos 
   7120  1.1  christos 	  everdef = ((Elf_External_Verdef *)
   7121  1.1  christos 		     ((bfd_byte *) everdef + iverdefmem.vd_next));
   7122  1.1  christos 	}
   7123  1.1  christos 
   7124  1.1  christos       if (default_imported_symver)
   7125  1.1  christos 	{
   7126  1.1  christos 	  if (freeidx > maxidx)
   7127  1.1  christos 	    maxidx = ++freeidx;
   7128  1.1  christos 	  else
   7129  1.1  christos 	    freeidx = ++maxidx;
   7130  1.1  christos 	}
   7131  1.1  christos       elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
   7132  1.1  christos           bfd_zalloc2 (abfd, maxidx, sizeof (Elf_Internal_Verdef));
   7133  1.1  christos       if (elf_tdata (abfd)->verdef == NULL)
   7134  1.1  christos 	goto error_return;
   7135  1.1  christos 
   7136  1.1  christos       elf_tdata (abfd)->cverdefs = maxidx;
   7137  1.1  christos 
   7138  1.1  christos       everdef = (Elf_External_Verdef *) contents;
   7139  1.1  christos       iverdefarr = elf_tdata (abfd)->verdef;
   7140  1.1  christos       for (i = 0; i < hdr->sh_info; i++)
   7141  1.1  christos 	{
   7142  1.1  christos 	  Elf_External_Verdaux *everdaux;
   7143  1.1  christos 	  Elf_Internal_Verdaux *iverdaux;
   7144  1.1  christos 	  unsigned int j;
   7145  1.1  christos 
   7146  1.1  christos 	  _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
   7147  1.1  christos 
   7148  1.1  christos 	  if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
   7149  1.1  christos 	    {
   7150  1.1  christos error_return_verdef:
   7151  1.1  christos 	      elf_tdata (abfd)->verdef = NULL;
   7152  1.1  christos 	      elf_tdata (abfd)->cverdefs = 0;
   7153  1.1  christos 	      goto error_return;
   7154  1.1  christos 	    }
   7155  1.1  christos 
   7156  1.1  christos 	  iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
   7157  1.1  christos 	  memcpy (iverdef, &iverdefmem, sizeof (Elf_Internal_Verdef));
   7158  1.1  christos 
   7159  1.1  christos 	  iverdef->vd_bfd = abfd;
   7160  1.1  christos 
   7161  1.1  christos 	  if (iverdef->vd_cnt == 0)
   7162  1.1  christos 	    iverdef->vd_auxptr = NULL;
   7163  1.1  christos 	  else
   7164  1.1  christos 	    {
   7165  1.1  christos 	      iverdef->vd_auxptr = (struct elf_internal_verdaux *)
   7166  1.1  christos                   bfd_alloc2 (abfd, iverdef->vd_cnt,
   7167  1.1  christos                               sizeof (Elf_Internal_Verdaux));
   7168  1.1  christos 	      if (iverdef->vd_auxptr == NULL)
   7169  1.1  christos 		goto error_return_verdef;
   7170  1.1  christos 	    }
   7171  1.1  christos 
   7172  1.1  christos 	  if (iverdef->vd_aux
   7173  1.1  christos 	      > (size_t) (contents_end_aux - (bfd_byte *) everdef))
   7174  1.1  christos 	    goto error_return_verdef;
   7175  1.1  christos 
   7176  1.1  christos 	  everdaux = ((Elf_External_Verdaux *)
   7177  1.1  christos 		      ((bfd_byte *) everdef + iverdef->vd_aux));
   7178  1.1  christos 	  iverdaux = iverdef->vd_auxptr;
   7179  1.1  christos 	  for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
   7180  1.1  christos 	    {
   7181  1.1  christos 	      _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
   7182  1.1  christos 
   7183  1.1  christos 	      iverdaux->vda_nodename =
   7184  1.1  christos 		bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
   7185  1.1  christos 						 iverdaux->vda_name);
   7186  1.1  christos 	      if (iverdaux->vda_nodename == NULL)
   7187  1.1  christos 		goto error_return_verdef;
   7188  1.1  christos 
   7189  1.1  christos 	      if (j + 1 < iverdef->vd_cnt)
   7190  1.1  christos 		iverdaux->vda_nextptr = iverdaux + 1;
   7191  1.1  christos 	      else
   7192  1.1  christos 		iverdaux->vda_nextptr = NULL;
   7193  1.1  christos 
   7194  1.1  christos 	      if (iverdaux->vda_next
   7195  1.1  christos 		  > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
   7196  1.1  christos 		goto error_return_verdef;
   7197  1.1  christos 
   7198  1.1  christos 	      everdaux = ((Elf_External_Verdaux *)
   7199  1.1  christos 			  ((bfd_byte *) everdaux + iverdaux->vda_next));
   7200  1.1  christos 	    }
   7201  1.1  christos 
   7202  1.1  christos 	  if (iverdef->vd_cnt)
   7203  1.1  christos 	    iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
   7204  1.1  christos 
   7205  1.1  christos 	  if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
   7206  1.1  christos 	    iverdef->vd_nextdef = iverdef + 1;
   7207  1.1  christos 	  else
   7208  1.1  christos 	    iverdef->vd_nextdef = NULL;
   7209  1.1  christos 
   7210  1.1  christos 	  everdef = ((Elf_External_Verdef *)
   7211  1.1  christos 		     ((bfd_byte *) everdef + iverdef->vd_next));
   7212  1.1  christos 	}
   7213  1.1  christos 
   7214  1.1  christos       free (contents);
   7215  1.1  christos       contents = NULL;
   7216  1.1  christos     }
   7217  1.1  christos   else if (default_imported_symver)
   7218  1.1  christos     {
   7219  1.1  christos       if (freeidx < 3)
   7220  1.1  christos 	freeidx = 3;
   7221  1.1  christos       else
   7222  1.1  christos 	freeidx++;
   7223  1.1  christos 
   7224  1.1  christos       elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
   7225  1.1  christos           bfd_zalloc2 (abfd, freeidx, sizeof (Elf_Internal_Verdef));
   7226  1.1  christos       if (elf_tdata (abfd)->verdef == NULL)
   7227  1.1  christos 	goto error_return;
   7228  1.1  christos 
   7229  1.1  christos       elf_tdata (abfd)->cverdefs = freeidx;
   7230  1.1  christos     }
   7231  1.1  christos 
   7232  1.1  christos   /* Create a default version based on the soname.  */
   7233  1.1  christos   if (default_imported_symver)
   7234  1.1  christos     {
   7235  1.1  christos       Elf_Internal_Verdef *iverdef;
   7236  1.1  christos       Elf_Internal_Verdaux *iverdaux;
   7237  1.1  christos 
   7238  1.1  christos       iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];;
   7239  1.1  christos 
   7240  1.1  christos       iverdef->vd_version = VER_DEF_CURRENT;
   7241  1.1  christos       iverdef->vd_flags = 0;
   7242  1.1  christos       iverdef->vd_ndx = freeidx;
   7243  1.1  christos       iverdef->vd_cnt = 1;
   7244  1.1  christos 
   7245  1.1  christos       iverdef->vd_bfd = abfd;
   7246  1.1  christos 
   7247  1.1  christos       iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
   7248  1.1  christos       if (iverdef->vd_nodename == NULL)
   7249  1.1  christos 	goto error_return_verdef;
   7250  1.1  christos       iverdef->vd_nextdef = NULL;
   7251  1.1  christos       iverdef->vd_auxptr = (struct elf_internal_verdaux *)
   7252  1.1  christos           bfd_alloc (abfd, sizeof (Elf_Internal_Verdaux));
   7253  1.1  christos       if (iverdef->vd_auxptr == NULL)
   7254  1.1  christos 	goto error_return_verdef;
   7255  1.1  christos 
   7256  1.1  christos       iverdaux = iverdef->vd_auxptr;
   7257  1.1  christos       iverdaux->vda_nodename = iverdef->vd_nodename;
   7258  1.1  christos       iverdaux->vda_nextptr = NULL;
   7259  1.1  christos     }
   7260  1.1  christos 
   7261  1.1  christos   return TRUE;
   7262  1.1  christos 
   7263  1.1  christos  error_return:
   7264  1.1  christos   if (contents != NULL)
   7265  1.1  christos     free (contents);
   7266  1.1  christos   return FALSE;
   7267  1.1  christos }
   7268  1.1  christos 
   7269  1.1  christos asymbol *
   7271  1.1  christos _bfd_elf_make_empty_symbol (bfd *abfd)
   7272  1.1  christos {
   7273  1.1  christos   elf_symbol_type *newsym;
   7274  1.1  christos   bfd_size_type amt = sizeof (elf_symbol_type);
   7275  1.1  christos 
   7276  1.1  christos   newsym = (elf_symbol_type *) bfd_zalloc (abfd, amt);
   7277  1.1  christos   if (!newsym)
   7278  1.1  christos     return NULL;
   7279  1.1  christos   else
   7280  1.1  christos     {
   7281  1.1  christos       newsym->symbol.the_bfd = abfd;
   7282  1.1  christos       return &newsym->symbol;
   7283  1.1  christos     }
   7284  1.1  christos }
   7285  1.1  christos 
   7286  1.1  christos void
   7287  1.1  christos _bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
   7288  1.1  christos 			  asymbol *symbol,
   7289  1.1  christos 			  symbol_info *ret)
   7290  1.1  christos {
   7291  1.1  christos   bfd_symbol_info (symbol, ret);
   7292  1.1  christos }
   7293  1.1  christos 
   7294  1.1  christos /* Return whether a symbol name implies a local symbol.  Most targets
   7295  1.1  christos    use this function for the is_local_label_name entry point, but some
   7296  1.1  christos    override it.  */
   7297  1.1  christos 
   7298  1.1  christos bfd_boolean
   7299  1.1  christos _bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
   7300  1.1  christos 			      const char *name)
   7301  1.1  christos {
   7302  1.1  christos   /* Normal local symbols start with ``.L''.  */
   7303  1.1  christos   if (name[0] == '.' && name[1] == 'L')
   7304  1.1  christos     return TRUE;
   7305  1.1  christos 
   7306  1.1  christos   /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
   7307  1.1  christos      DWARF debugging symbols starting with ``..''.  */
   7308  1.1  christos   if (name[0] == '.' && name[1] == '.')
   7309  1.1  christos     return TRUE;
   7310  1.1  christos 
   7311  1.1  christos   /* gcc will sometimes generate symbols beginning with ``_.L_'' when
   7312  1.1  christos      emitting DWARF debugging output.  I suspect this is actually a
   7313  1.1  christos      small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
   7314  1.1  christos      ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
   7315  1.1  christos      underscore to be emitted on some ELF targets).  For ease of use,
   7316  1.1  christos      we treat such symbols as local.  */
   7317  1.1  christos   if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
   7318  1.1  christos     return TRUE;
   7319  1.1  christos 
   7320  1.1  christos   return FALSE;
   7321  1.1  christos }
   7322  1.1  christos 
   7323  1.1  christos alent *
   7324  1.1  christos _bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
   7325  1.1  christos 		     asymbol *symbol ATTRIBUTE_UNUSED)
   7326  1.1  christos {
   7327  1.1  christos   abort ();
   7328  1.1  christos   return NULL;
   7329  1.1  christos }
   7330  1.1  christos 
   7331  1.1  christos bfd_boolean
   7332  1.1  christos _bfd_elf_set_arch_mach (bfd *abfd,
   7333  1.1  christos 			enum bfd_architecture arch,
   7334  1.1  christos 			unsigned long machine)
   7335  1.1  christos {
   7336  1.1  christos   /* If this isn't the right architecture for this backend, and this
   7337  1.1  christos      isn't the generic backend, fail.  */
   7338  1.1  christos   if (arch != get_elf_backend_data (abfd)->arch
   7339  1.1  christos       && arch != bfd_arch_unknown
   7340  1.1  christos       && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
   7341  1.1  christos     return FALSE;
   7342  1.1  christos 
   7343  1.1  christos   return bfd_default_set_arch_mach (abfd, arch, machine);
   7344  1.1  christos }
   7345  1.1  christos 
   7346  1.1  christos /* Find the function to a particular section and offset,
   7347  1.1  christos    for error reporting.  */
   7348  1.1  christos 
   7349  1.1  christos static bfd_boolean
   7350  1.1  christos elf_find_function (bfd *abfd,
   7351  1.1  christos 		   asection *section,
   7352  1.1  christos 		   asymbol **symbols,
   7353  1.1  christos 		   bfd_vma offset,
   7354  1.1  christos 		   const char **filename_ptr,
   7355  1.1  christos 		   const char **functionname_ptr)
   7356  1.1  christos {
   7357  1.1  christos   const char *filename;
   7358  1.1  christos   asymbol *func, *file;
   7359  1.1  christos   bfd_vma low_func;
   7360  1.1  christos   asymbol **p;
   7361  1.1  christos   /* ??? Given multiple file symbols, it is impossible to reliably
   7362  1.1  christos      choose the right file name for global symbols.  File symbols are
   7363  1.1  christos      local symbols, and thus all file symbols must sort before any
   7364  1.1  christos      global symbols.  The ELF spec may be interpreted to say that a
   7365  1.1  christos      file symbol must sort before other local symbols, but currently
   7366  1.1  christos      ld -r doesn't do this.  So, for ld -r output, it is possible to
   7367  1.1  christos      make a better choice of file name for local symbols by ignoring
   7368  1.1  christos      file symbols appearing after a given local symbol.  */
   7369  1.1  christos   enum { nothing_seen, symbol_seen, file_after_symbol_seen } state;
   7370  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   7371  1.1  christos 
   7372  1.1  christos   filename = NULL;
   7373  1.1  christos   func = NULL;
   7374  1.1  christos   file = NULL;
   7375  1.1  christos   low_func = 0;
   7376  1.1  christos   state = nothing_seen;
   7377  1.1  christos 
   7378  1.1  christos   for (p = symbols; *p != NULL; p++)
   7379  1.1  christos     {
   7380  1.1  christos       elf_symbol_type *q;
   7381  1.1  christos       unsigned int type;
   7382  1.1  christos 
   7383  1.1  christos       q = (elf_symbol_type *) *p;
   7384  1.1  christos 
   7385  1.1  christos       type = ELF_ST_TYPE (q->internal_elf_sym.st_info);
   7386  1.1  christos       switch (type)
   7387  1.1  christos 	{
   7388  1.1  christos 	case STT_FILE:
   7389  1.1  christos 	  file = &q->symbol;
   7390  1.1  christos 	  if (state == symbol_seen)
   7391  1.1  christos 	    state = file_after_symbol_seen;
   7392  1.1  christos 	  continue;
   7393  1.1  christos 	default:
   7394  1.1  christos 	  if (!bed->is_function_type (type))
   7395  1.1  christos 	    break;
   7396  1.1  christos 	case STT_NOTYPE:
   7397  1.1  christos 	  if (bfd_get_section (&q->symbol) == section
   7398  1.1  christos 	      && q->symbol.value >= low_func
   7399  1.1  christos 	      && q->symbol.value <= offset)
   7400  1.1  christos 	    {
   7401  1.1  christos 	      func = (asymbol *) q;
   7402  1.1  christos 	      low_func = q->symbol.value;
   7403  1.1  christos 	      filename = NULL;
   7404  1.1  christos 	      if (file != NULL
   7405  1.1  christos 		  && (ELF_ST_BIND (q->internal_elf_sym.st_info) == STB_LOCAL
   7406  1.1  christos 		      || state != file_after_symbol_seen))
   7407  1.1  christos 		filename = bfd_asymbol_name (file);
   7408  1.1  christos 	    }
   7409  1.1  christos 	  break;
   7410  1.1  christos 	}
   7411  1.1  christos       if (state == nothing_seen)
   7412  1.1  christos 	state = symbol_seen;
   7413  1.1  christos     }
   7414  1.1  christos 
   7415  1.1  christos   if (func == NULL)
   7416  1.1  christos     return FALSE;
   7417  1.1  christos 
   7418  1.1  christos   if (filename_ptr)
   7419  1.1  christos     *filename_ptr = filename;
   7420  1.1  christos   if (functionname_ptr)
   7421  1.1  christos     *functionname_ptr = bfd_asymbol_name (func);
   7422  1.1  christos 
   7423  1.1  christos   return TRUE;
   7424  1.1  christos }
   7425  1.1  christos 
   7426  1.1  christos /* Find the nearest line to a particular section and offset,
   7427  1.1  christos    for error reporting.  */
   7428  1.1  christos 
   7429  1.1  christos bfd_boolean
   7430  1.1  christos _bfd_elf_find_nearest_line (bfd *abfd,
   7431  1.1  christos 			    asection *section,
   7432  1.1  christos 			    asymbol **symbols,
   7433  1.1  christos 			    bfd_vma offset,
   7434  1.1  christos 			    const char **filename_ptr,
   7435  1.1  christos 			    const char **functionname_ptr,
   7436  1.1  christos 			    unsigned int *line_ptr)
   7437  1.1  christos {
   7438  1.1  christos   bfd_boolean found;
   7439  1.1  christos 
   7440  1.1  christos   if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
   7441  1.1  christos 				     filename_ptr, functionname_ptr,
   7442  1.1  christos 				     line_ptr))
   7443  1.1  christos     {
   7444  1.1  christos       if (!*functionname_ptr)
   7445  1.1  christos 	elf_find_function (abfd, section, symbols, offset,
   7446  1.1  christos 			   *filename_ptr ? NULL : filename_ptr,
   7447  1.1  christos 			   functionname_ptr);
   7448  1.1  christos 
   7449  1.1  christos       return TRUE;
   7450  1.1  christos     }
   7451  1.1  christos 
   7452  1.1  christos   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
   7453  1.1  christos 				     filename_ptr, functionname_ptr,
   7454  1.1  christos 				     line_ptr, 0,
   7455  1.1  christos 				     &elf_tdata (abfd)->dwarf2_find_line_info))
   7456  1.1  christos     {
   7457  1.1  christos       if (!*functionname_ptr)
   7458  1.1  christos 	elf_find_function (abfd, section, symbols, offset,
   7459  1.1  christos 			   *filename_ptr ? NULL : filename_ptr,
   7460  1.1  christos 			   functionname_ptr);
   7461  1.1  christos 
   7462  1.1  christos       return TRUE;
   7463  1.1  christos     }
   7464  1.1  christos 
   7465  1.1  christos   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
   7466  1.1  christos 					     &found, filename_ptr,
   7467  1.1  christos 					     functionname_ptr, line_ptr,
   7468  1.1  christos 					     &elf_tdata (abfd)->line_info))
   7469  1.1  christos     return FALSE;
   7470  1.1  christos   if (found && (*functionname_ptr || *line_ptr))
   7471  1.1  christos     return TRUE;
   7472  1.1  christos 
   7473  1.1  christos   if (symbols == NULL)
   7474  1.1  christos     return FALSE;
   7475  1.1  christos 
   7476  1.1  christos   if (! elf_find_function (abfd, section, symbols, offset,
   7477  1.1  christos 			   filename_ptr, functionname_ptr))
   7478  1.1  christos     return FALSE;
   7479  1.1  christos 
   7480  1.1  christos   *line_ptr = 0;
   7481  1.1  christos   return TRUE;
   7482  1.1  christos }
   7483  1.1  christos 
   7484  1.1  christos /* Find the line for a symbol.  */
   7485  1.1  christos 
   7486  1.1  christos bfd_boolean
   7487  1.1  christos _bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
   7488  1.1  christos 		    const char **filename_ptr, unsigned int *line_ptr)
   7489  1.1  christos {
   7490  1.1  christos   return _bfd_dwarf2_find_line (abfd, symbols, symbol,
   7491  1.1  christos 				filename_ptr, line_ptr, 0,
   7492  1.1  christos 				&elf_tdata (abfd)->dwarf2_find_line_info);
   7493  1.1  christos }
   7494  1.1  christos 
   7495  1.1  christos /* After a call to bfd_find_nearest_line, successive calls to
   7496  1.1  christos    bfd_find_inliner_info can be used to get source information about
   7497  1.1  christos    each level of function inlining that terminated at the address
   7498  1.1  christos    passed to bfd_find_nearest_line.  Currently this is only supported
   7499  1.1  christos    for DWARF2 with appropriate DWARF3 extensions. */
   7500  1.1  christos 
   7501  1.1  christos bfd_boolean
   7502  1.1  christos _bfd_elf_find_inliner_info (bfd *abfd,
   7503  1.1  christos 			    const char **filename_ptr,
   7504  1.1  christos 			    const char **functionname_ptr,
   7505  1.1  christos 			    unsigned int *line_ptr)
   7506  1.1  christos {
   7507  1.1  christos   bfd_boolean found;
   7508  1.1  christos   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
   7509  1.1  christos 					 functionname_ptr, line_ptr,
   7510  1.1  christos 					 & elf_tdata (abfd)->dwarf2_find_line_info);
   7511  1.1  christos   return found;
   7512  1.1  christos }
   7513  1.1  christos 
   7514  1.1  christos int
   7515  1.1  christos _bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
   7516  1.1  christos {
   7517  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   7518  1.1  christos   int ret = bed->s->sizeof_ehdr;
   7519  1.1  christos 
   7520  1.1  christos   if (!info->relocatable)
   7521  1.1  christos     {
   7522  1.1  christos       bfd_size_type phdr_size = elf_tdata (abfd)->program_header_size;
   7523  1.1  christos 
   7524  1.1  christos       if (phdr_size == (bfd_size_type) -1)
   7525  1.1  christos 	{
   7526  1.1  christos 	  struct elf_segment_map *m;
   7527  1.1  christos 
   7528  1.1  christos 	  phdr_size = 0;
   7529  1.1  christos 	  for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
   7530  1.1  christos 	    phdr_size += bed->s->sizeof_phdr;
   7531  1.1  christos 
   7532  1.1  christos 	  if (phdr_size == 0)
   7533  1.1  christos 	    phdr_size = get_program_header_size (abfd, info);
   7534  1.1  christos 	}
   7535  1.1  christos 
   7536  1.1  christos       elf_tdata (abfd)->program_header_size = phdr_size;
   7537  1.1  christos       ret += phdr_size;
   7538  1.1  christos     }
   7539  1.1  christos 
   7540  1.1  christos   return ret;
   7541  1.1  christos }
   7542  1.1  christos 
   7543  1.1  christos bfd_boolean
   7544  1.1  christos _bfd_elf_set_section_contents (bfd *abfd,
   7545  1.1  christos 			       sec_ptr section,
   7546  1.1  christos 			       const void *location,
   7547  1.1  christos 			       file_ptr offset,
   7548  1.1  christos 			       bfd_size_type count)
   7549  1.1  christos {
   7550  1.1  christos   Elf_Internal_Shdr *hdr;
   7551  1.1  christos   bfd_signed_vma pos;
   7552  1.1  christos 
   7553  1.1  christos   if (! abfd->output_has_begun
   7554  1.1  christos       && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
   7555  1.1  christos     return FALSE;
   7556  1.1  christos 
   7557  1.1  christos   hdr = &elf_section_data (section)->this_hdr;
   7558  1.1  christos   pos = hdr->sh_offset + offset;
   7559  1.1  christos   if (bfd_seek (abfd, pos, SEEK_SET) != 0
   7560  1.1  christos       || bfd_bwrite (location, count, abfd) != count)
   7561  1.1  christos     return FALSE;
   7562  1.1  christos 
   7563  1.1  christos   return TRUE;
   7564  1.1  christos }
   7565  1.1  christos 
   7566  1.1  christos void
   7567  1.1  christos _bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
   7568  1.1  christos 			   arelent *cache_ptr ATTRIBUTE_UNUSED,
   7569  1.1  christos 			   Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
   7570  1.1  christos {
   7571  1.1  christos   abort ();
   7572  1.1  christos }
   7573  1.1  christos 
   7574  1.1  christos /* Try to convert a non-ELF reloc into an ELF one.  */
   7575  1.1  christos 
   7576  1.1  christos bfd_boolean
   7577  1.1  christos _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
   7578  1.1  christos {
   7579  1.1  christos   /* Check whether we really have an ELF howto.  */
   7580  1.1  christos 
   7581  1.1  christos   if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
   7582  1.1  christos     {
   7583  1.1  christos       bfd_reloc_code_real_type code;
   7584  1.1  christos       reloc_howto_type *howto;
   7585  1.1  christos 
   7586  1.1  christos       /* Alien reloc: Try to determine its type to replace it with an
   7587  1.1  christos 	 equivalent ELF reloc.  */
   7588  1.1  christos 
   7589  1.1  christos       if (areloc->howto->pc_relative)
   7590  1.1  christos 	{
   7591  1.1  christos 	  switch (areloc->howto->bitsize)
   7592  1.1  christos 	    {
   7593  1.1  christos 	    case 8:
   7594  1.1  christos 	      code = BFD_RELOC_8_PCREL;
   7595  1.1  christos 	      break;
   7596  1.1  christos 	    case 12:
   7597  1.1  christos 	      code = BFD_RELOC_12_PCREL;
   7598  1.1  christos 	      break;
   7599  1.1  christos 	    case 16:
   7600  1.1  christos 	      code = BFD_RELOC_16_PCREL;
   7601  1.1  christos 	      break;
   7602  1.1  christos 	    case 24:
   7603  1.1  christos 	      code = BFD_RELOC_24_PCREL;
   7604  1.1  christos 	      break;
   7605  1.1  christos 	    case 32:
   7606  1.1  christos 	      code = BFD_RELOC_32_PCREL;
   7607  1.1  christos 	      break;
   7608  1.1  christos 	    case 64:
   7609  1.1  christos 	      code = BFD_RELOC_64_PCREL;
   7610  1.1  christos 	      break;
   7611  1.1  christos 	    default:
   7612  1.1  christos 	      goto fail;
   7613  1.1  christos 	    }
   7614  1.1  christos 
   7615  1.1  christos 	  howto = bfd_reloc_type_lookup (abfd, code);
   7616  1.1  christos 
   7617  1.1  christos 	  if (areloc->howto->pcrel_offset != howto->pcrel_offset)
   7618  1.1  christos 	    {
   7619  1.1  christos 	      if (howto->pcrel_offset)
   7620  1.1  christos 		areloc->addend += areloc->address;
   7621  1.1  christos 	      else
   7622  1.1  christos 		areloc->addend -= areloc->address; /* addend is unsigned!! */
   7623  1.1  christos 	    }
   7624  1.1  christos 	}
   7625  1.1  christos       else
   7626  1.1  christos 	{
   7627  1.1  christos 	  switch (areloc->howto->bitsize)
   7628  1.1  christos 	    {
   7629  1.1  christos 	    case 8:
   7630  1.1  christos 	      code = BFD_RELOC_8;
   7631  1.1  christos 	      break;
   7632  1.1  christos 	    case 14:
   7633  1.1  christos 	      code = BFD_RELOC_14;
   7634  1.1  christos 	      break;
   7635  1.1  christos 	    case 16:
   7636  1.1  christos 	      code = BFD_RELOC_16;
   7637  1.1  christos 	      break;
   7638  1.1  christos 	    case 26:
   7639  1.1  christos 	      code = BFD_RELOC_26;
   7640  1.1  christos 	      break;
   7641  1.1  christos 	    case 32:
   7642  1.1  christos 	      code = BFD_RELOC_32;
   7643  1.1  christos 	      break;
   7644  1.1  christos 	    case 64:
   7645  1.1  christos 	      code = BFD_RELOC_64;
   7646  1.1  christos 	      break;
   7647  1.1  christos 	    default:
   7648  1.1  christos 	      goto fail;
   7649  1.1  christos 	    }
   7650  1.1  christos 
   7651  1.1  christos 	  howto = bfd_reloc_type_lookup (abfd, code);
   7652  1.1  christos 	}
   7653  1.1  christos 
   7654  1.1  christos       if (howto)
   7655  1.1  christos 	areloc->howto = howto;
   7656  1.1  christos       else
   7657  1.1  christos 	goto fail;
   7658  1.1  christos     }
   7659  1.1  christos 
   7660  1.1  christos   return TRUE;
   7661  1.1  christos 
   7662  1.1  christos  fail:
   7663  1.1  christos   (*_bfd_error_handler)
   7664  1.1  christos     (_("%B: unsupported relocation type %s"),
   7665  1.1  christos      abfd, areloc->howto->name);
   7666  1.1  christos   bfd_set_error (bfd_error_bad_value);
   7667  1.1  christos   return FALSE;
   7668  1.1  christos }
   7669  1.1  christos 
   7670  1.1  christos bfd_boolean
   7671  1.1  christos _bfd_elf_close_and_cleanup (bfd *abfd)
   7672  1.1  christos {
   7673  1.1  christos   if (bfd_get_format (abfd) == bfd_object)
   7674  1.1  christos     {
   7675  1.1  christos       if (elf_tdata (abfd) != NULL && elf_shstrtab (abfd) != NULL)
   7676  1.1  christos 	_bfd_elf_strtab_free (elf_shstrtab (abfd));
   7677  1.1  christos       _bfd_dwarf2_cleanup_debug_info (abfd);
   7678  1.1  christos     }
   7679  1.1  christos 
   7680  1.1  christos   return _bfd_generic_close_and_cleanup (abfd);
   7681  1.1  christos }
   7682  1.1  christos 
   7683  1.1  christos /* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
   7684  1.1  christos    in the relocation's offset.  Thus we cannot allow any sort of sanity
   7685  1.1  christos    range-checking to interfere.  There is nothing else to do in processing
   7686  1.1  christos    this reloc.  */
   7687  1.1  christos 
   7688  1.1  christos bfd_reloc_status_type
   7689  1.1  christos _bfd_elf_rel_vtable_reloc_fn
   7690  1.1  christos   (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
   7691  1.1  christos    struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
   7692  1.1  christos    void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
   7693  1.1  christos    bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
   7694  1.1  christos {
   7695  1.1  christos   return bfd_reloc_ok;
   7696  1.1  christos }
   7697  1.1  christos 
   7698  1.1  christos /* Elf core file support.  Much of this only works on native
   7700  1.1  christos    toolchains, since we rely on knowing the
   7701  1.1  christos    machine-dependent procfs structure in order to pick
   7702  1.1  christos    out details about the corefile.  */
   7703  1.1  christos 
   7704  1.1  christos #ifdef HAVE_SYS_PROCFS_H
   7705  1.1  christos /* Needed for new procfs interface on sparc-solaris.  */
   7706  1.1  christos # define _STRUCTURED_PROC 1
   7707  1.1  christos # include <sys/procfs.h>
   7708  1.1  christos #endif
   7709  1.1  christos 
   7710  1.1  christos /* Return a PID that identifies a "thread" for threaded cores, or the
   7711  1.1  christos    PID of the main process for non-threaded cores.  */
   7712  1.1  christos 
   7713  1.1  christos static int
   7714  1.1  christos elfcore_make_pid (bfd *abfd)
   7715  1.1  christos {
   7716  1.1  christos   int pid;
   7717  1.1  christos 
   7718  1.1  christos   pid = elf_tdata (abfd)->core_lwpid;
   7719  1.1  christos   if (pid == 0)
   7720  1.1  christos     pid = elf_tdata (abfd)->core_pid;
   7721  1.1  christos 
   7722  1.1  christos   return pid;
   7723  1.1  christos }
   7724  1.1  christos 
   7725  1.1  christos /* If there isn't a section called NAME, make one, using
   7726  1.1  christos    data from SECT.  Note, this function will generate a
   7727  1.1  christos    reference to NAME, so you shouldn't deallocate or
   7728  1.1  christos    overwrite it.  */
   7729  1.1  christos 
   7730  1.1  christos static bfd_boolean
   7731  1.1  christos elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
   7732  1.1  christos {
   7733  1.1  christos   asection *sect2;
   7734  1.1  christos 
   7735  1.1  christos   if (bfd_get_section_by_name (abfd, name) != NULL)
   7736  1.1  christos     return TRUE;
   7737  1.1  christos 
   7738  1.1  christos   sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
   7739  1.1  christos   if (sect2 == NULL)
   7740  1.1  christos     return FALSE;
   7741  1.1  christos 
   7742  1.1  christos   sect2->size = sect->size;
   7743  1.1  christos   sect2->filepos = sect->filepos;
   7744  1.1  christos   sect2->alignment_power = sect->alignment_power;
   7745  1.1  christos   return TRUE;
   7746  1.1  christos }
   7747  1.1  christos 
   7748  1.1  christos /* Create a pseudosection containing SIZE bytes at FILEPOS.  This
   7749  1.1  christos    actually creates up to two pseudosections:
   7750  1.1  christos    - For the single-threaded case, a section named NAME, unless
   7751  1.1  christos      such a section already exists.
   7752  1.1  christos    - For the multi-threaded case, a section named "NAME/PID", where
   7753  1.1  christos      PID is elfcore_make_pid (abfd).
   7754  1.1  christos    Both pseudosections have identical contents. */
   7755  1.1  christos bfd_boolean
   7756  1.1  christos _bfd_elfcore_make_pseudosection (bfd *abfd,
   7757  1.1  christos 				 char *name,
   7758  1.1  christos 				 size_t size,
   7759  1.1  christos 				 ufile_ptr filepos)
   7760  1.1  christos {
   7761  1.1  christos   char buf[100];
   7762  1.1  christos   char *threaded_name;
   7763  1.1  christos   size_t len;
   7764  1.1  christos   asection *sect;
   7765  1.1  christos 
   7766  1.1  christos   /* Build the section name.  */
   7767  1.1  christos 
   7768  1.1  christos   sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
   7769  1.1  christos   len = strlen (buf) + 1;
   7770  1.1  christos   threaded_name = (char *) bfd_alloc (abfd, len);
   7771  1.1  christos   if (threaded_name == NULL)
   7772  1.1  christos     return FALSE;
   7773  1.1  christos   memcpy (threaded_name, buf, len);
   7774  1.1  christos 
   7775  1.1  christos   sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
   7776  1.1  christos 					     SEC_HAS_CONTENTS);
   7777  1.1  christos   if (sect == NULL)
   7778  1.1  christos     return FALSE;
   7779  1.1  christos   sect->size = size;
   7780  1.1  christos   sect->filepos = filepos;
   7781  1.1  christos   sect->alignment_power = 2;
   7782  1.1  christos 
   7783  1.1  christos   return elfcore_maybe_make_sect (abfd, name, sect);
   7784  1.1  christos }
   7785  1.1  christos 
   7786  1.1  christos /* prstatus_t exists on:
   7787  1.1  christos      solaris 2.5+
   7788  1.1  christos      linux 2.[01] + glibc
   7789  1.1  christos      unixware 4.2
   7790  1.1  christos */
   7791  1.1  christos 
   7792  1.1  christos #if defined (HAVE_PRSTATUS_T)
   7793  1.1  christos 
   7794  1.1  christos static bfd_boolean
   7795  1.1  christos elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   7796  1.1  christos {
   7797  1.1  christos   size_t size;
   7798  1.1  christos   int offset;
   7799  1.1  christos 
   7800  1.1  christos   if (note->descsz == sizeof (prstatus_t))
   7801  1.1  christos     {
   7802  1.1  christos       prstatus_t prstat;
   7803  1.1  christos 
   7804  1.1  christos       size = sizeof (prstat.pr_reg);
   7805  1.1  christos       offset   = offsetof (prstatus_t, pr_reg);
   7806  1.1  christos       memcpy (&prstat, note->descdata, sizeof (prstat));
   7807  1.1  christos 
   7808  1.1  christos       /* Do not overwrite the core signal if it
   7809  1.1  christos 	 has already been set by another thread.  */
   7810  1.1  christos       if (elf_tdata (abfd)->core_signal == 0)
   7811  1.1  christos 	elf_tdata (abfd)->core_signal = prstat.pr_cursig;
   7812  1.1  christos       if (elf_tdata (abfd)->core_pid == 0)
   7813  1.1  christos 	elf_tdata (abfd)->core_pid = prstat.pr_pid;
   7814  1.1  christos 
   7815  1.1  christos       /* pr_who exists on:
   7816  1.1  christos 	 solaris 2.5+
   7817  1.1  christos 	 unixware 4.2
   7818  1.1  christos 	 pr_who doesn't exist on:
   7819  1.1  christos 	 linux 2.[01]
   7820  1.1  christos 	 */
   7821  1.1  christos #if defined (HAVE_PRSTATUS_T_PR_WHO)
   7822  1.1  christos       elf_tdata (abfd)->core_lwpid = prstat.pr_who;
   7823  1.1  christos #else
   7824  1.1  christos       elf_tdata (abfd)->core_lwpid = prstat.pr_pid;
   7825  1.1  christos #endif
   7826  1.1  christos     }
   7827  1.1  christos #if defined (HAVE_PRSTATUS32_T)
   7828  1.1  christos   else if (note->descsz == sizeof (prstatus32_t))
   7829  1.1  christos     {
   7830  1.1  christos       /* 64-bit host, 32-bit corefile */
   7831  1.1  christos       prstatus32_t prstat;
   7832  1.1  christos 
   7833  1.1  christos       size = sizeof (prstat.pr_reg);
   7834  1.1  christos       offset   = offsetof (prstatus32_t, pr_reg);
   7835  1.1  christos       memcpy (&prstat, note->descdata, sizeof (prstat));
   7836  1.1  christos 
   7837  1.1  christos       /* Do not overwrite the core signal if it
   7838  1.1  christos 	 has already been set by another thread.  */
   7839  1.1  christos       if (elf_tdata (abfd)->core_signal == 0)
   7840  1.1  christos 	elf_tdata (abfd)->core_signal = prstat.pr_cursig;
   7841  1.1  christos       if (elf_tdata (abfd)->core_pid == 0)
   7842  1.1  christos 	elf_tdata (abfd)->core_pid = prstat.pr_pid;
   7843  1.1  christos 
   7844  1.1  christos       /* pr_who exists on:
   7845  1.1  christos 	 solaris 2.5+
   7846  1.1  christos 	 unixware 4.2
   7847  1.1  christos 	 pr_who doesn't exist on:
   7848  1.1  christos 	 linux 2.[01]
   7849  1.1  christos 	 */
   7850  1.1  christos #if defined (HAVE_PRSTATUS32_T_PR_WHO)
   7851  1.1  christos       elf_tdata (abfd)->core_lwpid = prstat.pr_who;
   7852  1.1  christos #else
   7853  1.1  christos       elf_tdata (abfd)->core_lwpid = prstat.pr_pid;
   7854  1.1  christos #endif
   7855  1.1  christos     }
   7856  1.1  christos #endif /* HAVE_PRSTATUS32_T */
   7857  1.1  christos   else
   7858  1.1  christos     {
   7859  1.1  christos       /* Fail - we don't know how to handle any other
   7860  1.1  christos 	 note size (ie. data object type).  */
   7861  1.1  christos       return TRUE;
   7862  1.1  christos     }
   7863  1.1  christos 
   7864  1.1  christos   /* Make a ".reg/999" section and a ".reg" section.  */
   7865  1.1  christos   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   7866  1.1  christos 					  size, note->descpos + offset);
   7867  1.1  christos }
   7868  1.1  christos #endif /* defined (HAVE_PRSTATUS_T) */
   7869  1.1  christos 
   7870  1.1  christos /* Create a pseudosection containing the exact contents of NOTE.  */
   7871  1.1  christos static bfd_boolean
   7872  1.1  christos elfcore_make_note_pseudosection (bfd *abfd,
   7873  1.1  christos 				 char *name,
   7874  1.1  christos 				 Elf_Internal_Note *note)
   7875  1.1  christos {
   7876  1.1  christos   return _bfd_elfcore_make_pseudosection (abfd, name,
   7877  1.1  christos 					  note->descsz, note->descpos);
   7878  1.1  christos }
   7879  1.1  christos 
   7880  1.1  christos /* There isn't a consistent prfpregset_t across platforms,
   7881  1.1  christos    but it doesn't matter, because we don't have to pick this
   7882  1.1  christos    data structure apart.  */
   7883  1.1  christos 
   7884  1.1  christos static bfd_boolean
   7885  1.1  christos elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
   7886  1.1  christos {
   7887  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg2", note);
   7888  1.1  christos }
   7889  1.1  christos 
   7890  1.1  christos /* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
   7891  1.1  christos    type of NT_PRXFPREG.  Just include the whole note's contents
   7892  1.1  christos    literally.  */
   7893  1.1  christos 
   7894  1.1  christos static bfd_boolean
   7895  1.1  christos elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
   7896  1.1  christos {
   7897  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
   7898  1.1  christos }
   7899  1.1  christos 
   7900  1.1  christos /* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
   7901  1.1  christos    with a note type of NT_X86_XSTATE.  Just include the whole note's
   7902  1.1  christos    contents literally.  */
   7903  1.1  christos 
   7904  1.1  christos static bfd_boolean
   7905  1.1  christos elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
   7906  1.1  christos {
   7907  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
   7908  1.1  christos }
   7909  1.1  christos 
   7910  1.1  christos static bfd_boolean
   7911  1.1  christos elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
   7912  1.1  christos {
   7913  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
   7914  1.1  christos }
   7915  1.1  christos 
   7916  1.1  christos static bfd_boolean
   7917  1.1  christos elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
   7918  1.1  christos {
   7919  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
   7920  1.1  christos }
   7921  1.1  christos 
   7922  1.1  christos static bfd_boolean
   7923  1.1  christos elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
   7924  1.1  christos {
   7925  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
   7926  1.1  christos }
   7927  1.1  christos 
   7928  1.1  christos static bfd_boolean
   7929  1.1  christos elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
   7930  1.1  christos {
   7931  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
   7932  1.1  christos }
   7933  1.1  christos 
   7934  1.1  christos static bfd_boolean
   7935  1.1  christos elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
   7936  1.1  christos {
   7937  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
   7938  1.1  christos }
   7939  1.1  christos 
   7940  1.1  christos static bfd_boolean
   7941  1.1  christos elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
   7942  1.1  christos {
   7943  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
   7944  1.1  christos }
   7945  1.1  christos 
   7946  1.1  christos static bfd_boolean
   7947  1.1  christos elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
   7948  1.1  christos {
   7949  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
   7950  1.1  christos }
   7951  1.1  christos 
   7952  1.1  christos static bfd_boolean
   7953  1.1  christos elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
   7954  1.1  christos {
   7955  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
   7956  1.1  christos }
   7957  1.1  christos 
   7958  1.1  christos #if defined (HAVE_PRPSINFO_T)
   7959  1.1  christos typedef prpsinfo_t   elfcore_psinfo_t;
   7960  1.1  christos #if defined (HAVE_PRPSINFO32_T)		/* Sparc64 cross Sparc32 */
   7961  1.1  christos typedef prpsinfo32_t elfcore_psinfo32_t;
   7962  1.1  christos #endif
   7963  1.1  christos #endif
   7964  1.1  christos 
   7965  1.1  christos #if defined (HAVE_PSINFO_T)
   7966  1.1  christos typedef psinfo_t   elfcore_psinfo_t;
   7967  1.1  christos #if defined (HAVE_PSINFO32_T)		/* Sparc64 cross Sparc32 */
   7968  1.1  christos typedef psinfo32_t elfcore_psinfo32_t;
   7969  1.1  christos #endif
   7970  1.1  christos #endif
   7971  1.1  christos 
   7972  1.1  christos /* return a malloc'ed copy of a string at START which is at
   7973  1.1  christos    most MAX bytes long, possibly without a terminating '\0'.
   7974  1.1  christos    the copy will always have a terminating '\0'.  */
   7975  1.1  christos 
   7976  1.1  christos char *
   7977  1.1  christos _bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
   7978  1.1  christos {
   7979  1.1  christos   char *dups;
   7980  1.1  christos   char *end = (char *) memchr (start, '\0', max);
   7981  1.1  christos   size_t len;
   7982  1.1  christos 
   7983  1.1  christos   if (end == NULL)
   7984  1.1  christos     len = max;
   7985  1.1  christos   else
   7986  1.1  christos     len = end - start;
   7987  1.1  christos 
   7988  1.1  christos   dups = (char *) bfd_alloc (abfd, len + 1);
   7989  1.1  christos   if (dups == NULL)
   7990  1.1  christos     return NULL;
   7991  1.1  christos 
   7992  1.1  christos   memcpy (dups, start, len);
   7993  1.1  christos   dups[len] = '\0';
   7994  1.1  christos 
   7995  1.1  christos   return dups;
   7996  1.1  christos }
   7997  1.1  christos 
   7998  1.1  christos #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
   7999  1.1  christos static bfd_boolean
   8000  1.1  christos elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   8001  1.1  christos {
   8002  1.1  christos   if (note->descsz == sizeof (elfcore_psinfo_t))
   8003  1.1  christos     {
   8004  1.1  christos       elfcore_psinfo_t psinfo;
   8005  1.1  christos 
   8006  1.1  christos       memcpy (&psinfo, note->descdata, sizeof (psinfo));
   8007  1.1  christos 
   8008  1.1  christos       elf_tdata (abfd)->core_program
   8009  1.1  christos 	= _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
   8010  1.1  christos 				sizeof (psinfo.pr_fname));
   8011  1.1  christos 
   8012  1.1  christos       elf_tdata (abfd)->core_command
   8013  1.1  christos 	= _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
   8014  1.1  christos 				sizeof (psinfo.pr_psargs));
   8015  1.1  christos     }
   8016  1.1  christos #if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
   8017  1.1  christos   else if (note->descsz == sizeof (elfcore_psinfo32_t))
   8018  1.1  christos     {
   8019  1.1  christos       /* 64-bit host, 32-bit corefile */
   8020  1.1  christos       elfcore_psinfo32_t psinfo;
   8021  1.1  christos 
   8022  1.1  christos       memcpy (&psinfo, note->descdata, sizeof (psinfo));
   8023  1.1  christos 
   8024  1.1  christos       elf_tdata (abfd)->core_program
   8025  1.1  christos 	= _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
   8026  1.1  christos 				sizeof (psinfo.pr_fname));
   8027  1.1  christos 
   8028  1.1  christos       elf_tdata (abfd)->core_command
   8029  1.1  christos 	= _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
   8030  1.1  christos 				sizeof (psinfo.pr_psargs));
   8031  1.1  christos     }
   8032  1.1  christos #endif
   8033  1.1  christos 
   8034  1.1  christos   else
   8035  1.1  christos     {
   8036  1.1  christos       /* Fail - we don't know how to handle any other
   8037  1.1  christos 	 note size (ie. data object type).  */
   8038  1.1  christos       return TRUE;
   8039  1.1  christos     }
   8040  1.1  christos 
   8041  1.1  christos   /* Note that for some reason, a spurious space is tacked
   8042  1.1  christos      onto the end of the args in some (at least one anyway)
   8043  1.1  christos      implementations, so strip it off if it exists.  */
   8044  1.1  christos 
   8045  1.1  christos   {
   8046  1.1  christos     char *command = elf_tdata (abfd)->core_command;
   8047  1.1  christos     int n = strlen (command);
   8048  1.1  christos 
   8049  1.1  christos     if (0 < n && command[n - 1] == ' ')
   8050  1.1  christos       command[n - 1] = '\0';
   8051  1.1  christos   }
   8052  1.1  christos 
   8053  1.1  christos   return TRUE;
   8054  1.1  christos }
   8055  1.1  christos #endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
   8056  1.1  christos 
   8057  1.1  christos #if defined (HAVE_PSTATUS_T)
   8058  1.1  christos static bfd_boolean
   8059  1.1  christos elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
   8060  1.1  christos {
   8061  1.1  christos   if (note->descsz == sizeof (pstatus_t)
   8062  1.1  christos #if defined (HAVE_PXSTATUS_T)
   8063  1.1  christos       || note->descsz == sizeof (pxstatus_t)
   8064  1.1  christos #endif
   8065  1.1  christos       )
   8066  1.1  christos     {
   8067  1.1  christos       pstatus_t pstat;
   8068  1.1  christos 
   8069  1.1  christos       memcpy (&pstat, note->descdata, sizeof (pstat));
   8070  1.1  christos 
   8071  1.1  christos       elf_tdata (abfd)->core_pid = pstat.pr_pid;
   8072  1.1  christos     }
   8073  1.1  christos #if defined (HAVE_PSTATUS32_T)
   8074  1.1  christos   else if (note->descsz == sizeof (pstatus32_t))
   8075  1.1  christos     {
   8076  1.1  christos       /* 64-bit host, 32-bit corefile */
   8077  1.1  christos       pstatus32_t pstat;
   8078  1.1  christos 
   8079  1.1  christos       memcpy (&pstat, note->descdata, sizeof (pstat));
   8080  1.1  christos 
   8081  1.1  christos       elf_tdata (abfd)->core_pid = pstat.pr_pid;
   8082  1.1  christos     }
   8083  1.1  christos #endif
   8084  1.1  christos   /* Could grab some more details from the "representative"
   8085  1.1  christos      lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
   8086  1.1  christos      NT_LWPSTATUS note, presumably.  */
   8087  1.1  christos 
   8088  1.1  christos   return TRUE;
   8089  1.1  christos }
   8090  1.1  christos #endif /* defined (HAVE_PSTATUS_T) */
   8091  1.1  christos 
   8092  1.1  christos #if defined (HAVE_LWPSTATUS_T)
   8093  1.1  christos static bfd_boolean
   8094  1.1  christos elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
   8095  1.1  christos {
   8096  1.1  christos   lwpstatus_t lwpstat;
   8097  1.1  christos   char buf[100];
   8098  1.1  christos   char *name;
   8099  1.1  christos   size_t len;
   8100  1.1  christos   asection *sect;
   8101  1.1  christos 
   8102  1.1  christos   if (note->descsz != sizeof (lwpstat)
   8103  1.1  christos #if defined (HAVE_LWPXSTATUS_T)
   8104  1.1  christos       && note->descsz != sizeof (lwpxstatus_t)
   8105  1.1  christos #endif
   8106  1.1  christos       )
   8107  1.1  christos     return TRUE;
   8108  1.1  christos 
   8109  1.1  christos   memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
   8110  1.1  christos 
   8111  1.1  christos   elf_tdata (abfd)->core_lwpid = lwpstat.pr_lwpid;
   8112  1.1  christos   /* Do not overwrite the core signal if it has already been set by
   8113  1.1  christos      another thread.  */
   8114  1.1  christos   if (elf_tdata (abfd)->core_signal == 0)
   8115  1.1  christos     elf_tdata (abfd)->core_signal = lwpstat.pr_cursig;
   8116  1.1  christos 
   8117  1.1  christos   /* Make a ".reg/999" section.  */
   8118  1.1  christos 
   8119  1.1  christos   sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
   8120  1.1  christos   len = strlen (buf) + 1;
   8121  1.1  christos   name = bfd_alloc (abfd, len);
   8122  1.1  christos   if (name == NULL)
   8123  1.1  christos     return FALSE;
   8124  1.1  christos   memcpy (name, buf, len);
   8125  1.1  christos 
   8126  1.1  christos   sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8127  1.1  christos   if (sect == NULL)
   8128  1.1  christos     return FALSE;
   8129  1.1  christos 
   8130  1.1  christos #if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
   8131  1.1  christos   sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
   8132  1.1  christos   sect->filepos = note->descpos
   8133  1.1  christos     + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
   8134  1.1  christos #endif
   8135  1.1  christos 
   8136  1.1  christos #if defined (HAVE_LWPSTATUS_T_PR_REG)
   8137  1.1  christos   sect->size = sizeof (lwpstat.pr_reg);
   8138  1.1  christos   sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
   8139  1.1  christos #endif
   8140  1.1  christos 
   8141  1.1  christos   sect->alignment_power = 2;
   8142  1.1  christos 
   8143  1.1  christos   if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
   8144  1.1  christos     return FALSE;
   8145  1.1  christos 
   8146  1.1  christos   /* Make a ".reg2/999" section */
   8147  1.1  christos 
   8148  1.1  christos   sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
   8149  1.1  christos   len = strlen (buf) + 1;
   8150  1.1  christos   name = bfd_alloc (abfd, len);
   8151  1.1  christos   if (name == NULL)
   8152  1.1  christos     return FALSE;
   8153  1.1  christos   memcpy (name, buf, len);
   8154  1.1  christos 
   8155  1.1  christos   sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8156  1.1  christos   if (sect == NULL)
   8157  1.1  christos     return FALSE;
   8158  1.1  christos 
   8159  1.1  christos #if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
   8160  1.1  christos   sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
   8161  1.1  christos   sect->filepos = note->descpos
   8162  1.1  christos     + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
   8163  1.1  christos #endif
   8164  1.1  christos 
   8165  1.1  christos #if defined (HAVE_LWPSTATUS_T_PR_FPREG)
   8166  1.1  christos   sect->size = sizeof (lwpstat.pr_fpreg);
   8167  1.1  christos   sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
   8168  1.1  christos #endif
   8169  1.1  christos 
   8170  1.1  christos   sect->alignment_power = 2;
   8171  1.1  christos 
   8172  1.1  christos   return elfcore_maybe_make_sect (abfd, ".reg2", sect);
   8173  1.1  christos }
   8174  1.1  christos #endif /* defined (HAVE_LWPSTATUS_T) */
   8175  1.1  christos 
   8176  1.1  christos static bfd_boolean
   8177  1.1  christos elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
   8178  1.1  christos {
   8179  1.1  christos   char buf[30];
   8180  1.1  christos   char *name;
   8181  1.1  christos   size_t len;
   8182  1.1  christos   asection *sect;
   8183  1.1  christos   int type;
   8184  1.1  christos   int is_active_thread;
   8185  1.1  christos   bfd_vma base_addr;
   8186  1.1  christos 
   8187  1.1  christos   if (note->descsz < 728)
   8188  1.1  christos     return TRUE;
   8189  1.1  christos 
   8190  1.1  christos   if (! CONST_STRNEQ (note->namedata, "win32"))
   8191  1.1  christos     return TRUE;
   8192  1.1  christos 
   8193  1.1  christos   type = bfd_get_32 (abfd, note->descdata);
   8194  1.1  christos 
   8195  1.1  christos   switch (type)
   8196  1.1  christos     {
   8197  1.1  christos     case 1 /* NOTE_INFO_PROCESS */:
   8198  1.1  christos       /* FIXME: need to add ->core_command.  */
   8199  1.1  christos       /* process_info.pid */
   8200  1.1  christos       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 8);
   8201  1.1  christos       /* process_info.signal */
   8202  1.1  christos       elf_tdata (abfd)->core_signal = bfd_get_32 (abfd, note->descdata + 12);
   8203  1.1  christos       break;
   8204  1.1  christos 
   8205  1.1  christos     case 2 /* NOTE_INFO_THREAD */:
   8206  1.1  christos       /* Make a ".reg/999" section.  */
   8207  1.1  christos       /* thread_info.tid */
   8208  1.1  christos       sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
   8209  1.1  christos 
   8210  1.1  christos       len = strlen (buf) + 1;
   8211  1.1  christos       name = (char *) bfd_alloc (abfd, len);
   8212  1.1  christos       if (name == NULL)
   8213  1.1  christos 	return FALSE;
   8214  1.1  christos 
   8215  1.1  christos       memcpy (name, buf, len);
   8216  1.1  christos 
   8217  1.1  christos       sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8218  1.1  christos       if (sect == NULL)
   8219  1.1  christos 	return FALSE;
   8220  1.1  christos 
   8221  1.1  christos       /* sizeof (thread_info.thread_context) */
   8222  1.1  christos       sect->size = 716;
   8223  1.1  christos       /* offsetof (thread_info.thread_context) */
   8224  1.1  christos       sect->filepos = note->descpos + 12;
   8225  1.1  christos       sect->alignment_power = 2;
   8226  1.1  christos 
   8227  1.1  christos       /* thread_info.is_active_thread */
   8228  1.1  christos       is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
   8229  1.1  christos 
   8230  1.1  christos       if (is_active_thread)
   8231  1.1  christos 	if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
   8232  1.1  christos 	  return FALSE;
   8233  1.1  christos       break;
   8234  1.1  christos 
   8235  1.1  christos     case 3 /* NOTE_INFO_MODULE */:
   8236  1.1  christos       /* Make a ".module/xxxxxxxx" section.  */
   8237  1.1  christos       /* module_info.base_address */
   8238  1.1  christos       base_addr = bfd_get_32 (abfd, note->descdata + 4);
   8239  1.1  christos       sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
   8240  1.1  christos 
   8241  1.1  christos       len = strlen (buf) + 1;
   8242  1.1  christos       name = (char *) bfd_alloc (abfd, len);
   8243  1.1  christos       if (name == NULL)
   8244  1.1  christos 	return FALSE;
   8245  1.1  christos 
   8246  1.1  christos       memcpy (name, buf, len);
   8247  1.1  christos 
   8248  1.1  christos       sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8249  1.1  christos 
   8250  1.1  christos       if (sect == NULL)
   8251  1.1  christos 	return FALSE;
   8252  1.1  christos 
   8253  1.1  christos       sect->size = note->descsz;
   8254  1.1  christos       sect->filepos = note->descpos;
   8255  1.1  christos       sect->alignment_power = 2;
   8256  1.1  christos       break;
   8257  1.1  christos 
   8258  1.1  christos     default:
   8259  1.1  christos       return TRUE;
   8260  1.1  christos     }
   8261  1.1  christos 
   8262  1.1  christos   return TRUE;
   8263  1.1  christos }
   8264  1.1  christos 
   8265  1.1  christos static bfd_boolean
   8266  1.1  christos elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
   8267  1.1  christos {
   8268  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   8269  1.1  christos 
   8270  1.1  christos   switch (note->type)
   8271  1.1  christos     {
   8272  1.1  christos     default:
   8273  1.1  christos       return TRUE;
   8274  1.1  christos 
   8275  1.1  christos     case NT_PRSTATUS:
   8276  1.1  christos       if (bed->elf_backend_grok_prstatus)
   8277  1.1  christos 	if ((*bed->elf_backend_grok_prstatus) (abfd, note))
   8278  1.1  christos 	  return TRUE;
   8279  1.1  christos #if defined (HAVE_PRSTATUS_T)
   8280  1.1  christos       return elfcore_grok_prstatus (abfd, note);
   8281  1.1  christos #else
   8282  1.1  christos       return TRUE;
   8283  1.1  christos #endif
   8284  1.1  christos 
   8285  1.1  christos #if defined (HAVE_PSTATUS_T)
   8286  1.1  christos     case NT_PSTATUS:
   8287  1.1  christos       return elfcore_grok_pstatus (abfd, note);
   8288  1.1  christos #endif
   8289  1.1  christos 
   8290  1.1  christos #if defined (HAVE_LWPSTATUS_T)
   8291  1.1  christos     case NT_LWPSTATUS:
   8292  1.1  christos       return elfcore_grok_lwpstatus (abfd, note);
   8293  1.1  christos #endif
   8294  1.1  christos 
   8295  1.1  christos     case NT_FPREGSET:		/* FIXME: rename to NT_PRFPREG */
   8296  1.1  christos       return elfcore_grok_prfpreg (abfd, note);
   8297  1.1  christos 
   8298  1.1  christos     case NT_WIN32PSTATUS:
   8299  1.1  christos       return elfcore_grok_win32pstatus (abfd, note);
   8300  1.1  christos 
   8301  1.1  christos     case NT_PRXFPREG:		/* Linux SSE extension */
   8302  1.1  christos       if (note->namesz == 6
   8303  1.1  christos 	  && strcmp (note->namedata, "LINUX") == 0)
   8304  1.1  christos 	return elfcore_grok_prxfpreg (abfd, note);
   8305  1.1  christos       else
   8306  1.1  christos 	return TRUE;
   8307  1.1  christos 
   8308  1.1  christos     case NT_X86_XSTATE:		/* Linux XSAVE extension */
   8309  1.1  christos       if (note->namesz == 6
   8310  1.1  christos 	  && strcmp (note->namedata, "LINUX") == 0)
   8311  1.1  christos 	return elfcore_grok_xstatereg (abfd, note);
   8312  1.1  christos       else
   8313  1.1  christos 	return TRUE;
   8314  1.1  christos 
   8315  1.1  christos     case NT_PPC_VMX:
   8316  1.1  christos       if (note->namesz == 6
   8317  1.1  christos 	  && strcmp (note->namedata, "LINUX") == 0)
   8318  1.1  christos 	return elfcore_grok_ppc_vmx (abfd, note);
   8319  1.1  christos       else
   8320  1.1  christos 	return TRUE;
   8321  1.1  christos 
   8322  1.1  christos     case NT_PPC_VSX:
   8323  1.1  christos       if (note->namesz == 6
   8324  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8325  1.1  christos         return elfcore_grok_ppc_vsx (abfd, note);
   8326  1.1  christos       else
   8327  1.1  christos         return TRUE;
   8328  1.1  christos 
   8329  1.1  christos     case NT_S390_HIGH_GPRS:
   8330  1.1  christos       if (note->namesz == 6
   8331  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8332  1.1  christos         return elfcore_grok_s390_high_gprs (abfd, note);
   8333  1.1  christos       else
   8334  1.1  christos         return TRUE;
   8335  1.1  christos 
   8336  1.1  christos     case NT_S390_TIMER:
   8337  1.1  christos       if (note->namesz == 6
   8338  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8339  1.1  christos         return elfcore_grok_s390_timer (abfd, note);
   8340  1.1  christos       else
   8341  1.1  christos         return TRUE;
   8342  1.1  christos 
   8343  1.1  christos     case NT_S390_TODCMP:
   8344  1.1  christos       if (note->namesz == 6
   8345  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8346  1.1  christos         return elfcore_grok_s390_todcmp (abfd, note);
   8347  1.1  christos       else
   8348  1.1  christos         return TRUE;
   8349  1.1  christos 
   8350  1.1  christos     case NT_S390_TODPREG:
   8351  1.1  christos       if (note->namesz == 6
   8352  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8353  1.1  christos         return elfcore_grok_s390_todpreg (abfd, note);
   8354  1.1  christos       else
   8355  1.1  christos         return TRUE;
   8356  1.1  christos 
   8357  1.1  christos     case NT_S390_CTRS:
   8358  1.1  christos       if (note->namesz == 6
   8359  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8360  1.1  christos         return elfcore_grok_s390_ctrs (abfd, note);
   8361  1.1  christos       else
   8362  1.1  christos         return TRUE;
   8363  1.1  christos 
   8364  1.1  christos     case NT_S390_PREFIX:
   8365  1.1  christos       if (note->namesz == 6
   8366  1.1  christos           && strcmp (note->namedata, "LINUX") == 0)
   8367  1.1  christos         return elfcore_grok_s390_prefix (abfd, note);
   8368  1.1  christos       else
   8369  1.1  christos         return TRUE;
   8370  1.1  christos 
   8371  1.1  christos     case NT_PRPSINFO:
   8372  1.1  christos     case NT_PSINFO:
   8373  1.1  christos       if (bed->elf_backend_grok_psinfo)
   8374  1.1  christos 	if ((*bed->elf_backend_grok_psinfo) (abfd, note))
   8375  1.1  christos 	  return TRUE;
   8376  1.1  christos #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
   8377  1.1  christos       return elfcore_grok_psinfo (abfd, note);
   8378  1.1  christos #else
   8379  1.1  christos       return TRUE;
   8380  1.1  christos #endif
   8381  1.1  christos 
   8382  1.1  christos     case NT_AUXV:
   8383  1.1  christos       {
   8384  1.1  christos 	asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
   8385  1.1  christos 							     SEC_HAS_CONTENTS);
   8386  1.1  christos 
   8387  1.1  christos 	if (sect == NULL)
   8388  1.1  christos 	  return FALSE;
   8389  1.1  christos 	sect->size = note->descsz;
   8390  1.1  christos 	sect->filepos = note->descpos;
   8391  1.1  christos 	sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
   8392  1.1  christos 
   8393  1.1  christos 	return TRUE;
   8394  1.1  christos       }
   8395  1.1  christos     }
   8396  1.1  christos }
   8397  1.1  christos 
   8398  1.1  christos static bfd_boolean
   8399  1.1  christos elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
   8400  1.1  christos {
   8401  1.1  christos   elf_tdata (abfd)->build_id_size = note->descsz;
   8402  1.1  christos   elf_tdata (abfd)->build_id = (bfd_byte *) bfd_alloc (abfd, note->descsz);
   8403  1.1  christos   if (elf_tdata (abfd)->build_id == NULL)
   8404  1.1  christos     return FALSE;
   8405  1.1  christos 
   8406  1.1  christos   memcpy (elf_tdata (abfd)->build_id, note->descdata, note->descsz);
   8407  1.1  christos 
   8408  1.1  christos   return TRUE;
   8409  1.1  christos }
   8410  1.1  christos 
   8411  1.1  christos static bfd_boolean
   8412  1.1  christos elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
   8413  1.1  christos {
   8414  1.1  christos   switch (note->type)
   8415  1.1  christos     {
   8416  1.1  christos     default:
   8417  1.1  christos       return TRUE;
   8418  1.1  christos 
   8419  1.1  christos     case NT_GNU_BUILD_ID:
   8420  1.1  christos       return elfobj_grok_gnu_build_id (abfd, note);
   8421  1.1  christos     }
   8422  1.1  christos }
   8423  1.1  christos 
   8424  1.1  christos static bfd_boolean
   8425  1.1  christos elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
   8426  1.1  christos {
   8427  1.1  christos   char *cp;
   8428  1.1  christos 
   8429  1.1  christos   cp = strchr (note->namedata, '@');
   8430  1.1  christos   if (cp != NULL)
   8431  1.1  christos     {
   8432  1.1  christos       *lwpidp = atoi(cp + 1);
   8433  1.1  christos       return TRUE;
   8434  1.1  christos     }
   8435  1.1  christos   return FALSE;
   8436  1.1  christos }
   8437  1.1  christos 
   8438  1.1  christos static bfd_boolean
   8439  1.1  christos elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
   8440  1.1  christos {
   8441  1.1  christos   /* Signal number at offset 0x08. */
   8442  1.1  christos   elf_tdata (abfd)->core_signal
   8443  1.1  christos     = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
   8444  1.1  christos 
   8445  1.1  christos   /* Process ID at offset 0x50. */
   8446  1.1  christos   elf_tdata (abfd)->core_pid
   8447  1.1  christos     = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
   8448  1.1  christos 
   8449  1.1  christos   /* Command name at 0x7c (max 32 bytes, including nul). */
   8450  1.1  christos   elf_tdata (abfd)->core_command
   8451  1.1  christos     = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
   8452  1.1  christos 
   8453  1.1  christos   return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
   8454  1.1  christos 					  note);
   8455  1.1  christos }
   8456  1.1  christos 
   8457  1.1  christos static bfd_boolean
   8458  1.1  christos elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
   8459  1.1  christos {
   8460  1.1  christos   int lwp;
   8461  1.1  christos 
   8462  1.1  christos   if (elfcore_netbsd_get_lwpid (note, &lwp))
   8463  1.1  christos     elf_tdata (abfd)->core_lwpid = lwp;
   8464  1.1  christos 
   8465  1.1  christos   if (note->type == NT_NETBSDCORE_PROCINFO)
   8466  1.1  christos     {
   8467  1.1  christos       /* NetBSD-specific core "procinfo".  Note that we expect to
   8468  1.1  christos 	 find this note before any of the others, which is fine,
   8469  1.1  christos 	 since the kernel writes this note out first when it
   8470  1.1  christos 	 creates a core file.  */
   8471  1.1  christos 
   8472  1.1  christos       return elfcore_grok_netbsd_procinfo (abfd, note);
   8473  1.1  christos     }
   8474  1.1  christos 
   8475  1.1  christos   /* As of Jan 2002 there are no other machine-independent notes
   8476  1.1  christos      defined for NetBSD core files.  If the note type is less
   8477  1.1  christos      than the start of the machine-dependent note types, we don't
   8478  1.1  christos      understand it.  */
   8479  1.1  christos 
   8480  1.1  christos   if (note->type < NT_NETBSDCORE_FIRSTMACH)
   8481  1.1  christos     return TRUE;
   8482  1.1  christos 
   8483  1.1  christos 
   8484  1.1  christos   switch (bfd_get_arch (abfd))
   8485  1.1  christos     {
   8486  1.1  christos       /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
   8487  1.1  christos 	 PT_GETFPREGS == mach+2.  */
   8488  1.1  christos 
   8489  1.1  christos     case bfd_arch_alpha:
   8490  1.1  christos     case bfd_arch_sparc:
   8491  1.1  christos       switch (note->type)
   8492  1.1  christos 	{
   8493  1.1  christos 	case NT_NETBSDCORE_FIRSTMACH+0:
   8494  1.1  christos 	  return elfcore_make_note_pseudosection (abfd, ".reg", note);
   8495  1.1  christos 
   8496  1.1  christos 	case NT_NETBSDCORE_FIRSTMACH+2:
   8497  1.1  christos 	  return elfcore_make_note_pseudosection (abfd, ".reg2", note);
   8498  1.1  christos 
   8499  1.1  christos 	default:
   8500  1.1  christos 	  return TRUE;
   8501  1.1  christos 	}
   8502  1.1  christos 
   8503  1.1  christos       /* On all other arch's, PT_GETREGS == mach+1 and
   8504  1.1  christos 	 PT_GETFPREGS == mach+3.  */
   8505  1.1  christos 
   8506  1.1  christos     default:
   8507  1.1  christos       switch (note->type)
   8508  1.1  christos 	{
   8509  1.1  christos 	case NT_NETBSDCORE_FIRSTMACH+1:
   8510  1.1  christos 	  return elfcore_make_note_pseudosection (abfd, ".reg", note);
   8511  1.1  christos 
   8512  1.1  christos 	case NT_NETBSDCORE_FIRSTMACH+3:
   8513  1.1  christos 	  return elfcore_make_note_pseudosection (abfd, ".reg2", note);
   8514  1.1  christos 
   8515  1.1  christos 	default:
   8516  1.1  christos 	  return TRUE;
   8517  1.1  christos 	}
   8518  1.1  christos     }
   8519  1.1  christos     /* NOTREACHED */
   8520  1.1  christos }
   8521  1.1  christos 
   8522  1.1  christos static bfd_boolean
   8523  1.1  christos elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
   8524  1.1  christos {
   8525  1.1  christos   /* Signal number at offset 0x08. */
   8526  1.1  christos   elf_tdata (abfd)->core_signal
   8527  1.1  christos     = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
   8528  1.1  christos 
   8529  1.1  christos   /* Process ID at offset 0x20. */
   8530  1.1  christos   elf_tdata (abfd)->core_pid
   8531  1.1  christos     = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
   8532  1.1  christos 
   8533  1.1  christos   /* Command name at 0x48 (max 32 bytes, including nul). */
   8534  1.1  christos   elf_tdata (abfd)->core_command
   8535  1.1  christos     = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
   8536  1.1  christos 
   8537  1.1  christos   return TRUE;
   8538  1.1  christos }
   8539  1.1  christos 
   8540  1.1  christos static bfd_boolean
   8541  1.1  christos elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
   8542  1.1  christos {
   8543  1.1  christos   if (note->type == NT_OPENBSD_PROCINFO)
   8544  1.1  christos     return elfcore_grok_openbsd_procinfo (abfd, note);
   8545  1.1  christos 
   8546  1.1  christos   if (note->type == NT_OPENBSD_REGS)
   8547  1.1  christos     return elfcore_make_note_pseudosection (abfd, ".reg", note);
   8548  1.1  christos 
   8549  1.1  christos   if (note->type == NT_OPENBSD_FPREGS)
   8550  1.1  christos     return elfcore_make_note_pseudosection (abfd, ".reg2", note);
   8551  1.1  christos 
   8552  1.1  christos   if (note->type == NT_OPENBSD_XFPREGS)
   8553  1.1  christos     return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
   8554  1.1  christos 
   8555  1.1  christos   if (note->type == NT_OPENBSD_AUXV)
   8556  1.1  christos     {
   8557  1.1  christos       asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
   8558  1.1  christos 							   SEC_HAS_CONTENTS);
   8559  1.1  christos 
   8560  1.1  christos       if (sect == NULL)
   8561  1.1  christos 	return FALSE;
   8562  1.1  christos       sect->size = note->descsz;
   8563  1.1  christos       sect->filepos = note->descpos;
   8564  1.1  christos       sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
   8565  1.1  christos 
   8566  1.1  christos       return TRUE;
   8567  1.1  christos     }
   8568  1.1  christos 
   8569  1.1  christos   if (note->type == NT_OPENBSD_WCOOKIE)
   8570  1.1  christos     {
   8571  1.1  christos       asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
   8572  1.1  christos 							   SEC_HAS_CONTENTS);
   8573  1.1  christos 
   8574  1.1  christos       if (sect == NULL)
   8575  1.1  christos 	return FALSE;
   8576  1.1  christos       sect->size = note->descsz;
   8577  1.1  christos       sect->filepos = note->descpos;
   8578  1.1  christos       sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
   8579  1.1  christos 
   8580  1.1  christos       return TRUE;
   8581  1.1  christos     }
   8582  1.1  christos 
   8583  1.1  christos   return TRUE;
   8584  1.1  christos }
   8585  1.1  christos 
   8586  1.1  christos static bfd_boolean
   8587  1.1  christos elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
   8588  1.1  christos {
   8589  1.1  christos   void *ddata = note->descdata;
   8590  1.1  christos   char buf[100];
   8591  1.1  christos   char *name;
   8592  1.1  christos   asection *sect;
   8593  1.1  christos   short sig;
   8594  1.1  christos   unsigned flags;
   8595  1.1  christos 
   8596  1.1  christos   /* nto_procfs_status 'pid' field is at offset 0.  */
   8597  1.1  christos   elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
   8598  1.1  christos 
   8599  1.1  christos   /* nto_procfs_status 'tid' field is at offset 4.  Pass it back.  */
   8600  1.1  christos   *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
   8601  1.1  christos 
   8602  1.1  christos   /* nto_procfs_status 'flags' field is at offset 8.  */
   8603  1.1  christos   flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
   8604  1.1  christos 
   8605  1.1  christos   /* nto_procfs_status 'what' field is at offset 14.  */
   8606  1.1  christos   if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
   8607  1.1  christos     {
   8608  1.1  christos       elf_tdata (abfd)->core_signal = sig;
   8609  1.1  christos       elf_tdata (abfd)->core_lwpid = *tid;
   8610  1.1  christos     }
   8611  1.1  christos 
   8612  1.1  christos   /* _DEBUG_FLAG_CURTID (current thread) is 0x80.  Some cores
   8613  1.1  christos      do not come from signals so we make sure we set the current
   8614  1.1  christos      thread just in case.  */
   8615  1.1  christos   if (flags & 0x00000080)
   8616  1.1  christos     elf_tdata (abfd)->core_lwpid = *tid;
   8617  1.1  christos 
   8618  1.1  christos   /* Make a ".qnx_core_status/%d" section.  */
   8619  1.1  christos   sprintf (buf, ".qnx_core_status/%ld", *tid);
   8620  1.1  christos 
   8621  1.1  christos   name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
   8622  1.1  christos   if (name == NULL)
   8623  1.1  christos     return FALSE;
   8624  1.1  christos   strcpy (name, buf);
   8625  1.1  christos 
   8626  1.1  christos   sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8627  1.1  christos   if (sect == NULL)
   8628  1.1  christos     return FALSE;
   8629  1.1  christos 
   8630  1.1  christos   sect->size            = note->descsz;
   8631  1.1  christos   sect->filepos         = note->descpos;
   8632  1.1  christos   sect->alignment_power = 2;
   8633  1.1  christos 
   8634  1.1  christos   return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
   8635  1.1  christos }
   8636  1.1  christos 
   8637  1.1  christos static bfd_boolean
   8638  1.1  christos elfcore_grok_nto_regs (bfd *abfd,
   8639  1.1  christos 		       Elf_Internal_Note *note,
   8640  1.1  christos 		       long tid,
   8641  1.1  christos 		       char *base)
   8642  1.1  christos {
   8643  1.1  christos   char buf[100];
   8644  1.1  christos   char *name;
   8645  1.1  christos   asection *sect;
   8646  1.1  christos 
   8647  1.1  christos   /* Make a "(base)/%d" section.  */
   8648  1.1  christos   sprintf (buf, "%s/%ld", base, tid);
   8649  1.1  christos 
   8650  1.1  christos   name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
   8651  1.1  christos   if (name == NULL)
   8652  1.1  christos     return FALSE;
   8653  1.1  christos   strcpy (name, buf);
   8654  1.1  christos 
   8655  1.1  christos   sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8656  1.1  christos   if (sect == NULL)
   8657  1.1  christos     return FALSE;
   8658  1.1  christos 
   8659  1.1  christos   sect->size            = note->descsz;
   8660  1.1  christos   sect->filepos         = note->descpos;
   8661  1.1  christos   sect->alignment_power = 2;
   8662  1.1  christos 
   8663  1.1  christos   /* This is the current thread.  */
   8664  1.1  christos   if (elf_tdata (abfd)->core_lwpid == tid)
   8665  1.1  christos     return elfcore_maybe_make_sect (abfd, base, sect);
   8666  1.1  christos 
   8667  1.1  christos   return TRUE;
   8668  1.1  christos }
   8669  1.1  christos 
   8670  1.1  christos #define BFD_QNT_CORE_INFO	7
   8671  1.1  christos #define BFD_QNT_CORE_STATUS	8
   8672  1.1  christos #define BFD_QNT_CORE_GREG	9
   8673  1.1  christos #define BFD_QNT_CORE_FPREG	10
   8674  1.1  christos 
   8675  1.1  christos static bfd_boolean
   8676  1.1  christos elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
   8677  1.1  christos {
   8678  1.1  christos   /* Every GREG section has a STATUS section before it.  Store the
   8679  1.1  christos      tid from the previous call to pass down to the next gregs
   8680  1.1  christos      function.  */
   8681  1.1  christos   static long tid = 1;
   8682  1.1  christos 
   8683  1.1  christos   switch (note->type)
   8684  1.1  christos     {
   8685  1.1  christos     case BFD_QNT_CORE_INFO:
   8686  1.1  christos       return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
   8687  1.1  christos     case BFD_QNT_CORE_STATUS:
   8688  1.1  christos       return elfcore_grok_nto_status (abfd, note, &tid);
   8689  1.1  christos     case BFD_QNT_CORE_GREG:
   8690  1.1  christos       return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
   8691  1.1  christos     case BFD_QNT_CORE_FPREG:
   8692  1.1  christos       return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
   8693  1.1  christos     default:
   8694  1.1  christos       return TRUE;
   8695  1.1  christos     }
   8696  1.1  christos }
   8697  1.1  christos 
   8698  1.1  christos static bfd_boolean
   8699  1.1  christos elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
   8700  1.1  christos {
   8701  1.1  christos   char *name;
   8702  1.1  christos   asection *sect;
   8703  1.1  christos   size_t len;
   8704  1.1  christos 
   8705  1.1  christos   /* Use note name as section name.  */
   8706  1.1  christos   len = note->namesz;
   8707  1.1  christos   name = (char *) bfd_alloc (abfd, len);
   8708  1.1  christos   if (name == NULL)
   8709  1.1  christos     return FALSE;
   8710  1.1  christos   memcpy (name, note->namedata, len);
   8711  1.1  christos   name[len - 1] = '\0';
   8712  1.1  christos 
   8713  1.1  christos   sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
   8714  1.1  christos   if (sect == NULL)
   8715  1.1  christos     return FALSE;
   8716  1.1  christos 
   8717  1.1  christos   sect->size            = note->descsz;
   8718  1.1  christos   sect->filepos         = note->descpos;
   8719  1.1  christos   sect->alignment_power = 1;
   8720  1.1  christos 
   8721  1.1  christos   return TRUE;
   8722  1.1  christos }
   8723  1.1  christos 
   8724  1.1  christos /* Function: elfcore_write_note
   8725  1.1  christos 
   8726  1.1  christos    Inputs:
   8727  1.1  christos      buffer to hold note, and current size of buffer
   8728  1.1  christos      name of note
   8729  1.1  christos      type of note
   8730  1.1  christos      data for note
   8731  1.1  christos      size of data for note
   8732  1.1  christos 
   8733  1.1  christos    Writes note to end of buffer.  ELF64 notes are written exactly as
   8734  1.1  christos    for ELF32, despite the current (as of 2006) ELF gabi specifying
   8735  1.1  christos    that they ought to have 8-byte namesz and descsz field, and have
   8736  1.1  christos    8-byte alignment.  Other writers, eg. Linux kernel, do the same.
   8737  1.1  christos 
   8738  1.1  christos    Return:
   8739  1.1  christos    Pointer to realloc'd buffer, *BUFSIZ updated.  */
   8740  1.1  christos 
   8741  1.1  christos char *
   8742  1.1  christos elfcore_write_note (bfd *abfd,
   8743  1.1  christos 		    char *buf,
   8744  1.1  christos 		    int *bufsiz,
   8745  1.1  christos 		    const char *name,
   8746  1.1  christos 		    int type,
   8747  1.1  christos 		    const void *input,
   8748  1.1  christos 		    int size)
   8749  1.1  christos {
   8750  1.1  christos   Elf_External_Note *xnp;
   8751  1.1  christos   size_t namesz;
   8752  1.1  christos   size_t newspace;
   8753  1.1  christos   char *dest;
   8754  1.1  christos 
   8755  1.1  christos   namesz = 0;
   8756  1.1  christos   if (name != NULL)
   8757  1.1  christos     namesz = strlen (name) + 1;
   8758  1.1  christos 
   8759  1.1  christos   newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
   8760  1.1  christos 
   8761  1.1  christos   buf = (char *) realloc (buf, *bufsiz + newspace);
   8762  1.1  christos   if (buf == NULL)
   8763  1.1  christos     return buf;
   8764  1.1  christos   dest = buf + *bufsiz;
   8765  1.1  christos   *bufsiz += newspace;
   8766  1.1  christos   xnp = (Elf_External_Note *) dest;
   8767  1.1  christos   H_PUT_32 (abfd, namesz, xnp->namesz);
   8768  1.1  christos   H_PUT_32 (abfd, size, xnp->descsz);
   8769  1.1  christos   H_PUT_32 (abfd, type, xnp->type);
   8770  1.1  christos   dest = xnp->name;
   8771  1.1  christos   if (name != NULL)
   8772  1.1  christos     {
   8773  1.1  christos       memcpy (dest, name, namesz);
   8774  1.1  christos       dest += namesz;
   8775  1.1  christos       while (namesz & 3)
   8776  1.1  christos 	{
   8777  1.1  christos 	  *dest++ = '\0';
   8778  1.1  christos 	  ++namesz;
   8779  1.1  christos 	}
   8780  1.1  christos     }
   8781  1.1  christos   memcpy (dest, input, size);
   8782  1.1  christos   dest += size;
   8783  1.1  christos   while (size & 3)
   8784  1.1  christos     {
   8785  1.1  christos       *dest++ = '\0';
   8786  1.1  christos       ++size;
   8787  1.1  christos     }
   8788  1.1  christos   return buf;
   8789  1.1  christos }
   8790  1.1  christos 
   8791  1.1  christos #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
   8792  1.1  christos char *
   8793  1.1  christos elfcore_write_prpsinfo (bfd  *abfd,
   8794  1.1  christos 			char *buf,
   8795  1.1  christos 			int  *bufsiz,
   8796  1.1  christos 			const char *fname,
   8797  1.1  christos 			const char *psargs)
   8798  1.1  christos {
   8799  1.1  christos   const char *note_name = "CORE";
   8800  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   8801  1.1  christos 
   8802  1.1  christos   if (bed->elf_backend_write_core_note != NULL)
   8803  1.1  christos     {
   8804  1.1  christos       char *ret;
   8805  1.1  christos       ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
   8806  1.1  christos 						 NT_PRPSINFO, fname, psargs);
   8807  1.1  christos       if (ret != NULL)
   8808  1.1  christos 	return ret;
   8809  1.1  christos     }
   8810  1.1  christos 
   8811  1.1  christos #if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
   8812  1.1  christos   if (bed->s->elfclass == ELFCLASS32)
   8813  1.1  christos     {
   8814  1.1  christos #if defined (HAVE_PSINFO32_T)
   8815  1.1  christos       psinfo32_t data;
   8816  1.1  christos       int note_type = NT_PSINFO;
   8817  1.1  christos #else
   8818  1.1  christos       prpsinfo32_t data;
   8819  1.1  christos       int note_type = NT_PRPSINFO;
   8820  1.1  christos #endif
   8821  1.1  christos 
   8822  1.1  christos       memset (&data, 0, sizeof (data));
   8823  1.1  christos       strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
   8824  1.1  christos       strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
   8825  1.1  christos       return elfcore_write_note (abfd, buf, bufsiz,
   8826  1.1  christos 				 note_name, note_type, &data, sizeof (data));
   8827  1.1  christos     }
   8828  1.1  christos   else
   8829  1.1  christos #endif
   8830  1.1  christos     {
   8831  1.1  christos #if defined (HAVE_PSINFO_T)
   8832  1.1  christos       psinfo_t data;
   8833  1.1  christos       int note_type = NT_PSINFO;
   8834  1.1  christos #else
   8835  1.1  christos       prpsinfo_t data;
   8836  1.1  christos       int note_type = NT_PRPSINFO;
   8837  1.1  christos #endif
   8838  1.1  christos 
   8839  1.1  christos       memset (&data, 0, sizeof (data));
   8840  1.1  christos       strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
   8841  1.1  christos       strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
   8842  1.1  christos       return elfcore_write_note (abfd, buf, bufsiz,
   8843  1.1  christos 				 note_name, note_type, &data, sizeof (data));
   8844  1.1  christos     }
   8845  1.1  christos }
   8846  1.1  christos #endif	/* PSINFO_T or PRPSINFO_T */
   8847  1.1  christos 
   8848  1.1  christos #if defined (HAVE_PRSTATUS_T)
   8849  1.1  christos char *
   8850  1.1  christos elfcore_write_prstatus (bfd *abfd,
   8851  1.1  christos 			char *buf,
   8852  1.1  christos 			int *bufsiz,
   8853  1.1  christos 			long pid,
   8854  1.1  christos 			int cursig,
   8855  1.1  christos 			const void *gregs)
   8856  1.1  christos {
   8857  1.1  christos   const char *note_name = "CORE";
   8858  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   8859  1.1  christos 
   8860  1.1  christos   if (bed->elf_backend_write_core_note != NULL)
   8861  1.1  christos     {
   8862  1.1  christos       char *ret;
   8863  1.1  christos       ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
   8864  1.1  christos 						 NT_PRSTATUS,
   8865  1.1  christos 						 pid, cursig, gregs);
   8866  1.1  christos       if (ret != NULL)
   8867  1.1  christos 	return ret;
   8868  1.1  christos     }
   8869  1.1  christos 
   8870  1.1  christos #if defined (HAVE_PRSTATUS32_T)
   8871  1.1  christos   if (bed->s->elfclass == ELFCLASS32)
   8872  1.1  christos     {
   8873  1.1  christos       prstatus32_t prstat;
   8874  1.1  christos 
   8875  1.1  christos       memset (&prstat, 0, sizeof (prstat));
   8876  1.1  christos       prstat.pr_pid = pid;
   8877  1.1  christos       prstat.pr_cursig = cursig;
   8878  1.1  christos       memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
   8879  1.1  christos       return elfcore_write_note (abfd, buf, bufsiz, note_name,
   8880  1.1  christos 				 NT_PRSTATUS, &prstat, sizeof (prstat));
   8881  1.1  christos     }
   8882  1.1  christos   else
   8883  1.1  christos #endif
   8884  1.1  christos     {
   8885  1.1  christos       prstatus_t prstat;
   8886  1.1  christos 
   8887  1.1  christos       memset (&prstat, 0, sizeof (prstat));
   8888  1.1  christos       prstat.pr_pid = pid;
   8889  1.1  christos       prstat.pr_cursig = cursig;
   8890  1.1  christos       memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
   8891  1.1  christos       return elfcore_write_note (abfd, buf, bufsiz, note_name,
   8892  1.1  christos 				 NT_PRSTATUS, &prstat, sizeof (prstat));
   8893  1.1  christos     }
   8894  1.1  christos }
   8895  1.1  christos #endif /* HAVE_PRSTATUS_T */
   8896  1.1  christos 
   8897  1.1  christos #if defined (HAVE_LWPSTATUS_T)
   8898  1.1  christos char *
   8899  1.1  christos elfcore_write_lwpstatus (bfd *abfd,
   8900  1.1  christos 			 char *buf,
   8901  1.1  christos 			 int *bufsiz,
   8902  1.1  christos 			 long pid,
   8903  1.1  christos 			 int cursig,
   8904  1.1  christos 			 const void *gregs)
   8905  1.1  christos {
   8906  1.1  christos   lwpstatus_t lwpstat;
   8907  1.1  christos   const char *note_name = "CORE";
   8908  1.1  christos 
   8909  1.1  christos   memset (&lwpstat, 0, sizeof (lwpstat));
   8910  1.1  christos   lwpstat.pr_lwpid  = pid >> 16;
   8911  1.1  christos   lwpstat.pr_cursig = cursig;
   8912  1.1  christos #if defined (HAVE_LWPSTATUS_T_PR_REG)
   8913  1.1  christos   memcpy (lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
   8914  1.1  christos #elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
   8915  1.1  christos #if !defined(gregs)
   8916  1.1  christos   memcpy (lwpstat.pr_context.uc_mcontext.gregs,
   8917  1.1  christos 	  gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
   8918  1.1  christos #else
   8919  1.1  christos   memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
   8920  1.1  christos 	  gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
   8921  1.1  christos #endif
   8922  1.1  christos #endif
   8923  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz, note_name,
   8924  1.1  christos 			     NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
   8925  1.1  christos }
   8926  1.1  christos #endif /* HAVE_LWPSTATUS_T */
   8927  1.1  christos 
   8928  1.1  christos #if defined (HAVE_PSTATUS_T)
   8929  1.1  christos char *
   8930  1.1  christos elfcore_write_pstatus (bfd *abfd,
   8931  1.1  christos 		       char *buf,
   8932  1.1  christos 		       int *bufsiz,
   8933  1.1  christos 		       long pid,
   8934  1.1  christos 		       int cursig ATTRIBUTE_UNUSED,
   8935  1.1  christos 		       const void *gregs ATTRIBUTE_UNUSED)
   8936  1.1  christos {
   8937  1.1  christos   const char *note_name = "CORE";
   8938  1.1  christos #if defined (HAVE_PSTATUS32_T)
   8939  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   8940  1.1  christos 
   8941  1.1  christos   if (bed->s->elfclass == ELFCLASS32)
   8942  1.1  christos     {
   8943  1.1  christos       pstatus32_t pstat;
   8944  1.1  christos 
   8945  1.1  christos       memset (&pstat, 0, sizeof (pstat));
   8946  1.1  christos       pstat.pr_pid = pid & 0xffff;
   8947  1.1  christos       buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
   8948  1.1  christos 				NT_PSTATUS, &pstat, sizeof (pstat));
   8949  1.1  christos       return buf;
   8950  1.1  christos     }
   8951  1.1  christos   else
   8952  1.1  christos #endif
   8953  1.1  christos     {
   8954  1.1  christos       pstatus_t pstat;
   8955  1.1  christos 
   8956  1.1  christos       memset (&pstat, 0, sizeof (pstat));
   8957  1.1  christos       pstat.pr_pid = pid & 0xffff;
   8958  1.1  christos       buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
   8959  1.1  christos 				NT_PSTATUS, &pstat, sizeof (pstat));
   8960  1.1  christos       return buf;
   8961  1.1  christos     }
   8962  1.1  christos }
   8963  1.1  christos #endif /* HAVE_PSTATUS_T */
   8964  1.1  christos 
   8965  1.1  christos char *
   8966  1.1  christos elfcore_write_prfpreg (bfd *abfd,
   8967  1.1  christos 		       char *buf,
   8968  1.1  christos 		       int *bufsiz,
   8969  1.1  christos 		       const void *fpregs,
   8970  1.1  christos 		       int size)
   8971  1.1  christos {
   8972  1.1  christos   const char *note_name = "CORE";
   8973  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   8974  1.1  christos 			     note_name, NT_FPREGSET, fpregs, size);
   8975  1.1  christos }
   8976  1.1  christos 
   8977  1.1  christos char *
   8978  1.1  christos elfcore_write_prxfpreg (bfd *abfd,
   8979  1.1  christos 			char *buf,
   8980  1.1  christos 			int *bufsiz,
   8981  1.1  christos 			const void *xfpregs,
   8982  1.1  christos 			int size)
   8983  1.1  christos {
   8984  1.1  christos   char *note_name = "LINUX";
   8985  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   8986  1.1  christos 			     note_name, NT_PRXFPREG, xfpregs, size);
   8987  1.1  christos }
   8988  1.1  christos 
   8989  1.1  christos char *
   8990  1.1  christos elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
   8991  1.1  christos 			 const void *xfpregs, int size)
   8992  1.1  christos {
   8993  1.1  christos   char *note_name = "LINUX";
   8994  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   8995  1.1  christos 			     note_name, NT_X86_XSTATE, xfpregs, size);
   8996  1.1  christos }
   8997  1.1  christos 
   8998  1.1  christos char *
   8999  1.1  christos elfcore_write_ppc_vmx (bfd *abfd,
   9000  1.1  christos 		       char *buf,
   9001  1.1  christos 		       int *bufsiz,
   9002  1.1  christos 		       const void *ppc_vmx,
   9003  1.1  christos 		       int size)
   9004  1.1  christos {
   9005  1.1  christos   char *note_name = "LINUX";
   9006  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9007  1.1  christos 			     note_name, NT_PPC_VMX, ppc_vmx, size);
   9008  1.1  christos }
   9009  1.1  christos 
   9010  1.1  christos char *
   9011  1.1  christos elfcore_write_ppc_vsx (bfd *abfd,
   9012  1.1  christos                        char *buf,
   9013  1.1  christos                        int *bufsiz,
   9014  1.1  christos                        const void *ppc_vsx,
   9015  1.1  christos                        int size)
   9016  1.1  christos {
   9017  1.1  christos   char *note_name = "LINUX";
   9018  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9019  1.1  christos                              note_name, NT_PPC_VSX, ppc_vsx, size);
   9020  1.1  christos }
   9021  1.1  christos 
   9022  1.1  christos static char *
   9023  1.1  christos elfcore_write_s390_high_gprs (bfd *abfd,
   9024  1.1  christos 			      char *buf,
   9025  1.1  christos 			      int *bufsiz,
   9026  1.1  christos 			      const void *s390_high_gprs,
   9027  1.1  christos 			      int size)
   9028  1.1  christos {
   9029  1.1  christos   char *note_name = "LINUX";
   9030  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9031  1.1  christos                              note_name, NT_S390_HIGH_GPRS,
   9032  1.1  christos 			     s390_high_gprs, size);
   9033  1.1  christos }
   9034  1.1  christos 
   9035  1.1  christos char *
   9036  1.1  christos elfcore_write_s390_timer (bfd *abfd,
   9037  1.1  christos                           char *buf,
   9038  1.1  christos                           int *bufsiz,
   9039  1.1  christos                           const void *s390_timer,
   9040  1.1  christos                           int size)
   9041  1.1  christos {
   9042  1.1  christos   char *note_name = "LINUX";
   9043  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9044  1.1  christos                              note_name, NT_S390_TIMER, s390_timer, size);
   9045  1.1  christos }
   9046  1.1  christos 
   9047  1.1  christos char *
   9048  1.1  christos elfcore_write_s390_todcmp (bfd *abfd,
   9049  1.1  christos                            char *buf,
   9050  1.1  christos                            int *bufsiz,
   9051  1.1  christos                            const void *s390_todcmp,
   9052  1.1  christos                            int size)
   9053  1.1  christos {
   9054  1.1  christos   char *note_name = "LINUX";
   9055  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9056  1.1  christos                              note_name, NT_S390_TODCMP, s390_todcmp, size);
   9057  1.1  christos }
   9058  1.1  christos 
   9059  1.1  christos char *
   9060  1.1  christos elfcore_write_s390_todpreg (bfd *abfd,
   9061  1.1  christos                             char *buf,
   9062  1.1  christos                             int *bufsiz,
   9063  1.1  christos                             const void *s390_todpreg,
   9064  1.1  christos                             int size)
   9065  1.1  christos {
   9066  1.1  christos   char *note_name = "LINUX";
   9067  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9068  1.1  christos                              note_name, NT_S390_TODPREG, s390_todpreg, size);
   9069  1.1  christos }
   9070  1.1  christos 
   9071  1.1  christos char *
   9072  1.1  christos elfcore_write_s390_ctrs (bfd *abfd,
   9073  1.1  christos                          char *buf,
   9074  1.1  christos                          int *bufsiz,
   9075  1.1  christos                          const void *s390_ctrs,
   9076  1.1  christos                          int size)
   9077  1.1  christos {
   9078  1.1  christos   char *note_name = "LINUX";
   9079  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9080  1.1  christos                              note_name, NT_S390_CTRS, s390_ctrs, size);
   9081  1.1  christos }
   9082  1.1  christos 
   9083  1.1  christos char *
   9084  1.1  christos elfcore_write_s390_prefix (bfd *abfd,
   9085  1.1  christos                            char *buf,
   9086  1.1  christos                            int *bufsiz,
   9087  1.1  christos                            const void *s390_prefix,
   9088  1.1  christos                            int size)
   9089  1.1  christos {
   9090  1.1  christos   char *note_name = "LINUX";
   9091  1.1  christos   return elfcore_write_note (abfd, buf, bufsiz,
   9092  1.1  christos                              note_name, NT_S390_PREFIX, s390_prefix, size);
   9093  1.1  christos }
   9094  1.1  christos 
   9095  1.1  christos char *
   9096  1.1  christos elfcore_write_register_note (bfd *abfd,
   9097  1.1  christos 			     char *buf,
   9098  1.1  christos 			     int *bufsiz,
   9099  1.1  christos 			     const char *section,
   9100  1.1  christos 			     const void *data,
   9101  1.1  christos 			     int size)
   9102  1.1  christos {
   9103  1.1  christos   if (strcmp (section, ".reg2") == 0)
   9104  1.1  christos     return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
   9105  1.1  christos   if (strcmp (section, ".reg-xfp") == 0)
   9106  1.1  christos     return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
   9107  1.1  christos   if (strcmp (section, ".reg-xstate") == 0)
   9108  1.1  christos     return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
   9109  1.1  christos   if (strcmp (section, ".reg-ppc-vmx") == 0)
   9110  1.1  christos     return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
   9111  1.1  christos   if (strcmp (section, ".reg-ppc-vsx") == 0)
   9112  1.1  christos     return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
   9113  1.1  christos   if (strcmp (section, ".reg-s390-high-gprs") == 0)
   9114  1.1  christos     return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
   9115  1.1  christos   if (strcmp (section, ".reg-s390-timer") == 0)
   9116  1.1  christos     return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
   9117  1.1  christos   if (strcmp (section, ".reg-s390-todcmp") == 0)
   9118  1.1  christos     return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
   9119  1.1  christos   if (strcmp (section, ".reg-s390-todpreg") == 0)
   9120  1.1  christos     return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
   9121  1.1  christos   if (strcmp (section, ".reg-s390-ctrs") == 0)
   9122  1.1  christos     return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
   9123  1.1  christos   if (strcmp (section, ".reg-s390-prefix") == 0)
   9124  1.1  christos     return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
   9125  1.1  christos   return NULL;
   9126  1.1  christos }
   9127  1.1  christos 
   9128  1.1  christos static bfd_boolean
   9129  1.1  christos elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
   9130  1.1  christos {
   9131  1.1  christos   char *p;
   9132  1.1  christos 
   9133  1.1  christos   p = buf;
   9134  1.1  christos   while (p < buf + size)
   9135  1.1  christos     {
   9136  1.1  christos       /* FIXME: bad alignment assumption.  */
   9137  1.1  christos       Elf_External_Note *xnp = (Elf_External_Note *) p;
   9138  1.1  christos       Elf_Internal_Note in;
   9139  1.1  christos 
   9140  1.1  christos       if (offsetof (Elf_External_Note, name) > buf - p + size)
   9141  1.1  christos 	return FALSE;
   9142  1.1  christos 
   9143  1.1  christos       in.type = H_GET_32 (abfd, xnp->type);
   9144  1.1  christos 
   9145  1.1  christos       in.namesz = H_GET_32 (abfd, xnp->namesz);
   9146  1.1  christos       in.namedata = xnp->name;
   9147  1.1  christos       if (in.namesz > buf - in.namedata + size)
   9148  1.1  christos 	return FALSE;
   9149  1.1  christos 
   9150  1.1  christos       in.descsz = H_GET_32 (abfd, xnp->descsz);
   9151  1.1  christos       in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
   9152  1.1  christos       in.descpos = offset + (in.descdata - buf);
   9153  1.1  christos       if (in.descsz != 0
   9154  1.1  christos 	  && (in.descdata >= buf + size
   9155  1.1  christos 	      || in.descsz > buf - in.descdata + size))
   9156  1.1  christos 	return FALSE;
   9157  1.1  christos 
   9158  1.1  christos       switch (bfd_get_format (abfd))
   9159  1.1  christos         {
   9160  1.1  christos 	default:
   9161  1.1  christos 	  return TRUE;
   9162  1.1  christos 
   9163  1.1  christos 	case bfd_core:
   9164  1.1  christos 	  if (CONST_STRNEQ (in.namedata, "NetBSD-CORE"))
   9165  1.1  christos 	    {
   9166  1.1  christos 	      if (! elfcore_grok_netbsd_note (abfd, &in))
   9167  1.1  christos 		return FALSE;
   9168  1.1  christos 	    }
   9169  1.1  christos 	  else if (CONST_STRNEQ (in.namedata, "OpenBSD"))
   9170  1.1  christos 	    {
   9171  1.1  christos 	      if (! elfcore_grok_openbsd_note (abfd, &in))
   9172  1.1  christos 		return FALSE;
   9173  1.1  christos 	    }
   9174  1.1  christos 	  else if (CONST_STRNEQ (in.namedata, "QNX"))
   9175  1.1  christos 	    {
   9176  1.1  christos 	      if (! elfcore_grok_nto_note (abfd, &in))
   9177  1.1  christos 		return FALSE;
   9178  1.1  christos 	    }
   9179  1.1  christos 	  else if (CONST_STRNEQ (in.namedata, "SPU/"))
   9180  1.1  christos 	    {
   9181  1.1  christos 	      if (! elfcore_grok_spu_note (abfd, &in))
   9182  1.1  christos 		return FALSE;
   9183  1.1  christos 	    }
   9184  1.1  christos 	  else
   9185  1.1  christos 	    {
   9186  1.1  christos 	      if (! elfcore_grok_note (abfd, &in))
   9187  1.1  christos 		return FALSE;
   9188  1.1  christos 	    }
   9189  1.1  christos 	  break;
   9190  1.1  christos 
   9191  1.1  christos 	case bfd_object:
   9192  1.1  christos 	  if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
   9193  1.1  christos 	    {
   9194  1.1  christos 	      if (! elfobj_grok_gnu_note (abfd, &in))
   9195  1.1  christos 		return FALSE;
   9196  1.1  christos 	    }
   9197  1.1  christos 	  break;
   9198  1.1  christos 	}
   9199  1.1  christos 
   9200  1.1  christos       p = in.descdata + BFD_ALIGN (in.descsz, 4);
   9201  1.1  christos     }
   9202  1.1  christos 
   9203  1.1  christos   return TRUE;
   9204  1.1  christos }
   9205  1.1  christos 
   9206  1.1  christos static bfd_boolean
   9207  1.1  christos elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
   9208  1.1  christos {
   9209  1.1  christos   char *buf;
   9210  1.1  christos 
   9211  1.1  christos   if (size <= 0)
   9212  1.1  christos     return TRUE;
   9213  1.1  christos 
   9214  1.1  christos   if (bfd_seek (abfd, offset, SEEK_SET) != 0)
   9215  1.1  christos     return FALSE;
   9216  1.1  christos 
   9217  1.1  christos   buf = (char *) bfd_malloc (size);
   9218  1.1  christos   if (buf == NULL)
   9219  1.1  christos     return FALSE;
   9220  1.1  christos 
   9221  1.1  christos   if (bfd_bread (buf, size, abfd) != size
   9222  1.1  christos       || !elf_parse_notes (abfd, buf, size, offset))
   9223  1.1  christos     {
   9224  1.1  christos       free (buf);
   9225  1.1  christos       return FALSE;
   9226  1.1  christos     }
   9227  1.1  christos 
   9228  1.1  christos   free (buf);
   9229  1.1  christos   return TRUE;
   9230  1.1  christos }
   9231  1.1  christos 
   9232  1.1  christos /* Providing external access to the ELF program header table.  */
   9234  1.1  christos 
   9235  1.1  christos /* Return an upper bound on the number of bytes required to store a
   9236  1.1  christos    copy of ABFD's program header table entries.  Return -1 if an error
   9237  1.1  christos    occurs; bfd_get_error will return an appropriate code.  */
   9238  1.1  christos 
   9239  1.1  christos long
   9240  1.1  christos bfd_get_elf_phdr_upper_bound (bfd *abfd)
   9241  1.1  christos {
   9242  1.1  christos   if (abfd->xvec->flavour != bfd_target_elf_flavour)
   9243  1.1  christos     {
   9244  1.1  christos       bfd_set_error (bfd_error_wrong_format);
   9245  1.1  christos       return -1;
   9246  1.1  christos     }
   9247  1.1  christos 
   9248  1.1  christos   return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
   9249  1.1  christos }
   9250  1.1  christos 
   9251  1.1  christos /* Copy ABFD's program header table entries to *PHDRS.  The entries
   9252  1.1  christos    will be stored as an array of Elf_Internal_Phdr structures, as
   9253  1.1  christos    defined in include/elf/internal.h.  To find out how large the
   9254  1.1  christos    buffer needs to be, call bfd_get_elf_phdr_upper_bound.
   9255  1.1  christos 
   9256  1.1  christos    Return the number of program header table entries read, or -1 if an
   9257  1.1  christos    error occurs; bfd_get_error will return an appropriate code.  */
   9258  1.1  christos 
   9259  1.1  christos int
   9260  1.1  christos bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
   9261  1.1  christos {
   9262  1.1  christos   int num_phdrs;
   9263  1.1  christos 
   9264  1.1  christos   if (abfd->xvec->flavour != bfd_target_elf_flavour)
   9265  1.1  christos     {
   9266  1.1  christos       bfd_set_error (bfd_error_wrong_format);
   9267  1.1  christos       return -1;
   9268  1.1  christos     }
   9269  1.1  christos 
   9270  1.1  christos   num_phdrs = elf_elfheader (abfd)->e_phnum;
   9271  1.1  christos   memcpy (phdrs, elf_tdata (abfd)->phdr,
   9272  1.1  christos 	  num_phdrs * sizeof (Elf_Internal_Phdr));
   9273  1.1  christos 
   9274  1.1  christos   return num_phdrs;
   9275  1.1  christos }
   9276  1.1  christos 
   9277  1.1  christos enum elf_reloc_type_class
   9278  1.1  christos _bfd_elf_reloc_type_class (const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
   9279  1.1  christos {
   9280  1.1  christos   return reloc_class_normal;
   9281  1.1  christos }
   9282  1.1  christos 
   9283  1.1  christos /* For RELA architectures, return the relocation value for a
   9284  1.1  christos    relocation against a local symbol.  */
   9285  1.1  christos 
   9286  1.1  christos bfd_vma
   9287  1.1  christos _bfd_elf_rela_local_sym (bfd *abfd,
   9288  1.1  christos 			 Elf_Internal_Sym *sym,
   9289  1.1  christos 			 asection **psec,
   9290  1.1  christos 			 Elf_Internal_Rela *rel)
   9291  1.1  christos {
   9292  1.1  christos   asection *sec = *psec;
   9293  1.1  christos   bfd_vma relocation;
   9294  1.1  christos 
   9295  1.1  christos   relocation = (sec->output_section->vma
   9296  1.1  christos 		+ sec->output_offset
   9297  1.1  christos 		+ sym->st_value);
   9298  1.1  christos   if ((sec->flags & SEC_MERGE)
   9299  1.1  christos       && ELF_ST_TYPE (sym->st_info) == STT_SECTION
   9300  1.1  christos       && sec->sec_info_type == ELF_INFO_TYPE_MERGE)
   9301  1.1  christos     {
   9302  1.1  christos       rel->r_addend =
   9303  1.1  christos 	_bfd_merged_section_offset (abfd, psec,
   9304  1.1  christos 				    elf_section_data (sec)->sec_info,
   9305  1.1  christos 				    sym->st_value + rel->r_addend);
   9306  1.1  christos       if (sec != *psec)
   9307  1.1  christos 	{
   9308  1.1  christos 	  /* If we have changed the section, and our original section is
   9309  1.1  christos 	     marked with SEC_EXCLUDE, it means that the original
   9310  1.1  christos 	     SEC_MERGE section has been completely subsumed in some
   9311  1.1  christos 	     other SEC_MERGE section.  In this case, we need to leave
   9312  1.1  christos 	     some info around for --emit-relocs.  */
   9313  1.1  christos 	  if ((sec->flags & SEC_EXCLUDE) != 0)
   9314  1.1  christos 	    sec->kept_section = *psec;
   9315  1.1  christos 	  sec = *psec;
   9316  1.1  christos 	}
   9317  1.1  christos       rel->r_addend -= relocation;
   9318  1.1  christos       rel->r_addend += sec->output_section->vma + sec->output_offset;
   9319  1.1  christos     }
   9320  1.1  christos   return relocation;
   9321  1.1  christos }
   9322  1.1  christos 
   9323  1.1  christos bfd_vma
   9324  1.1  christos _bfd_elf_rel_local_sym (bfd *abfd,
   9325  1.1  christos 			Elf_Internal_Sym *sym,
   9326  1.1  christos 			asection **psec,
   9327  1.1  christos 			bfd_vma addend)
   9328  1.1  christos {
   9329  1.1  christos   asection *sec = *psec;
   9330  1.1  christos 
   9331  1.1  christos   if (sec->sec_info_type != ELF_INFO_TYPE_MERGE)
   9332  1.1  christos     return sym->st_value + addend;
   9333  1.1  christos 
   9334  1.1  christos   return _bfd_merged_section_offset (abfd, psec,
   9335  1.1  christos 				     elf_section_data (sec)->sec_info,
   9336  1.1  christos 				     sym->st_value + addend);
   9337  1.1  christos }
   9338  1.1  christos 
   9339  1.1  christos bfd_vma
   9340  1.1  christos _bfd_elf_section_offset (bfd *abfd,
   9341  1.1  christos 			 struct bfd_link_info *info,
   9342  1.1  christos 			 asection *sec,
   9343  1.1  christos 			 bfd_vma offset)
   9344  1.1  christos {
   9345  1.1  christos   switch (sec->sec_info_type)
   9346  1.1  christos     {
   9347  1.1  christos     case ELF_INFO_TYPE_STABS:
   9348  1.1  christos       return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
   9349  1.1  christos 				       offset);
   9350  1.1  christos     case ELF_INFO_TYPE_EH_FRAME:
   9351  1.1  christos       return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
   9352  1.1  christos     default:
   9353  1.1  christos       return offset;
   9354  1.1  christos     }
   9355  1.1  christos }
   9356  1.1  christos 
   9357  1.1  christos /* Create a new BFD as if by bfd_openr.  Rather than opening a file,
   9359  1.1  christos    reconstruct an ELF file by reading the segments out of remote memory
   9360  1.1  christos    based on the ELF file header at EHDR_VMA and the ELF program headers it
   9361  1.1  christos    points to.  If not null, *LOADBASEP is filled in with the difference
   9362  1.1  christos    between the VMAs from which the segments were read, and the VMAs the
   9363  1.1  christos    file headers (and hence BFD's idea of each section's VMA) put them at.
   9364  1.1  christos 
   9365  1.1  christos    The function TARGET_READ_MEMORY is called to copy LEN bytes from the
   9366  1.1  christos    remote memory at target address VMA into the local buffer at MYADDR; it
   9367  1.1  christos    should return zero on success or an `errno' code on failure.  TEMPL must
   9368  1.1  christos    be a BFD for an ELF target with the word size and byte order found in
   9369  1.1  christos    the remote memory.  */
   9370  1.1  christos 
   9371  1.1  christos bfd *
   9372  1.1  christos bfd_elf_bfd_from_remote_memory
   9373  1.1  christos   (bfd *templ,
   9374  1.1  christos    bfd_vma ehdr_vma,
   9375  1.1  christos    bfd_vma *loadbasep,
   9376  1.1  christos    int (*target_read_memory) (bfd_vma, bfd_byte *, int))
   9377  1.1  christos {
   9378  1.1  christos   return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
   9379  1.1  christos     (templ, ehdr_vma, loadbasep, target_read_memory);
   9380  1.1  christos }
   9381  1.1  christos 
   9382  1.1  christos long
   9384  1.1  christos _bfd_elf_get_synthetic_symtab (bfd *abfd,
   9385  1.1  christos 			       long symcount ATTRIBUTE_UNUSED,
   9386  1.1  christos 			       asymbol **syms ATTRIBUTE_UNUSED,
   9387  1.1  christos 			       long dynsymcount,
   9388  1.1  christos 			       asymbol **dynsyms,
   9389  1.1  christos 			       asymbol **ret)
   9390  1.1  christos {
   9391  1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   9392  1.1  christos   asection *relplt;
   9393  1.1  christos   asymbol *s;
   9394  1.1  christos   const char *relplt_name;
   9395  1.1  christos   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
   9396  1.1  christos   arelent *p;
   9397  1.1  christos   long count, i, n;
   9398  1.1  christos   size_t size;
   9399  1.1  christos   Elf_Internal_Shdr *hdr;
   9400  1.1  christos   char *names;
   9401  1.1  christos   asection *plt;
   9402  1.1  christos 
   9403  1.1  christos   *ret = NULL;
   9404  1.1  christos 
   9405  1.1  christos   if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
   9406  1.1  christos     return 0;
   9407  1.1  christos 
   9408  1.1  christos   if (dynsymcount <= 0)
   9409  1.1  christos     return 0;
   9410  1.1  christos 
   9411  1.1  christos   if (!bed->plt_sym_val)
   9412  1.1  christos     return 0;
   9413  1.1  christos 
   9414  1.1  christos   relplt_name = bed->relplt_name;
   9415  1.1  christos   if (relplt_name == NULL)
   9416  1.1  christos     relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
   9417  1.1  christos   relplt = bfd_get_section_by_name (abfd, relplt_name);
   9418  1.1  christos   if (relplt == NULL)
   9419  1.1  christos     return 0;
   9420  1.1  christos 
   9421  1.1  christos   hdr = &elf_section_data (relplt)->this_hdr;
   9422  1.1  christos   if (hdr->sh_link != elf_dynsymtab (abfd)
   9423  1.1  christos       || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
   9424  1.1  christos     return 0;
   9425  1.1  christos 
   9426  1.1  christos   plt = bfd_get_section_by_name (abfd, ".plt");
   9427  1.1  christos   if (plt == NULL)
   9428  1.1  christos     return 0;
   9429  1.1  christos 
   9430  1.1  christos   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
   9431  1.1  christos   if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
   9432  1.1  christos     return -1;
   9433  1.1  christos 
   9434  1.1  christos   count = relplt->size / hdr->sh_entsize;
   9435  1.1  christos   size = count * sizeof (asymbol);
   9436  1.1  christos   p = relplt->relocation;
   9437  1.1  christos   for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
   9438  1.1  christos     {
   9439  1.1  christos       size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
   9440  1.1  christos       if (p->addend != 0)
   9441  1.1  christos 	{
   9442  1.1  christos #ifdef BFD64
   9443  1.1  christos 	  size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
   9444  1.1  christos #else
   9445  1.1  christos 	  size += sizeof ("+0x") - 1 + 8;
   9446  1.1  christos #endif
   9447  1.1  christos 	}
   9448  1.1  christos     }
   9449  1.1  christos 
   9450  1.1  christos   s = *ret = (asymbol *) bfd_malloc (size);
   9451  1.1  christos   if (s == NULL)
   9452  1.1  christos     return -1;
   9453  1.1  christos 
   9454  1.1  christos   names = (char *) (s + count);
   9455  1.1  christos   p = relplt->relocation;
   9456  1.1  christos   n = 0;
   9457  1.1  christos   for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
   9458  1.1  christos     {
   9459  1.1  christos       size_t len;
   9460  1.1  christos       bfd_vma addr;
   9461  1.1  christos 
   9462  1.1  christos       addr = bed->plt_sym_val (i, plt, p);
   9463  1.1  christos       if (addr == (bfd_vma) -1)
   9464  1.1  christos 	continue;
   9465  1.1  christos 
   9466  1.1  christos       *s = **p->sym_ptr_ptr;
   9467  1.1  christos       /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
   9468  1.1  christos 	 we are defining a symbol, ensure one of them is set.  */
   9469  1.1  christos       if ((s->flags & BSF_LOCAL) == 0)
   9470  1.1  christos 	s->flags |= BSF_GLOBAL;
   9471  1.1  christos       s->flags |= BSF_SYNTHETIC;
   9472  1.1  christos       s->section = plt;
   9473  1.1  christos       s->value = addr - plt->vma;
   9474  1.1  christos       s->name = names;
   9475  1.1  christos       s->udata.p = NULL;
   9476  1.1  christos       len = strlen ((*p->sym_ptr_ptr)->name);
   9477  1.1  christos       memcpy (names, (*p->sym_ptr_ptr)->name, len);
   9478  1.1  christos       names += len;
   9479  1.1  christos       if (p->addend != 0)
   9480  1.1  christos 	{
   9481  1.1  christos 	  char buf[30], *a;
   9482  1.1  christos 
   9483  1.1  christos 	  memcpy (names, "+0x", sizeof ("+0x") - 1);
   9484  1.1  christos 	  names += sizeof ("+0x") - 1;
   9485  1.1  christos 	  bfd_sprintf_vma (abfd, buf, p->addend);
   9486  1.1  christos 	  for (a = buf; *a == '0'; ++a)
   9487  1.1  christos 	    ;
   9488  1.1  christos 	  len = strlen (a);
   9489  1.1  christos 	  memcpy (names, a, len);
   9490  1.1  christos 	  names += len;
   9491  1.1  christos 	}
   9492  1.1  christos       memcpy (names, "@plt", sizeof ("@plt"));
   9493  1.1  christos       names += sizeof ("@plt");
   9494  1.1  christos       ++s, ++n;
   9495  1.1  christos     }
   9496  1.1  christos 
   9497  1.1  christos   return n;
   9498  1.1  christos }
   9499  1.1  christos 
   9500  1.1  christos /* It is only used by x86-64 so far.  */
   9501  1.1  christos asection _bfd_elf_large_com_section
   9502  1.1  christos   = BFD_FAKE_SECTION (_bfd_elf_large_com_section,
   9503  1.1  christos 		      SEC_IS_COMMON, NULL, "LARGE_COMMON", 0);
   9504  1.1  christos 
   9505  1.1  christos void
   9506  1.1  christos _bfd_elf_set_osabi (bfd * abfd,
   9507  1.1  christos 		    struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
   9508  1.1  christos {
   9509  1.1  christos   Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
   9510  1.1  christos 
   9511  1.1  christos   i_ehdrp = elf_elfheader (abfd);
   9512  1.1  christos 
   9513  1.1  christos   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
   9514  1.1  christos 
   9515  1.1  christos   /* To make things simpler for the loader on Linux systems we set the
   9516  1.1  christos      osabi field to ELFOSABI_LINUX if the binary contains symbols of
   9517  1.1  christos      the STT_GNU_IFUNC type.  */
   9518  1.1  christos   if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE
   9519  1.1  christos       && elf_tdata (abfd)->has_ifunc_symbols)
   9520  1.1  christos     i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
   9521  1.1  christos }
   9522  1.1  christos 
   9523  1.1  christos 
   9524  1.1  christos /* Return TRUE for ELF symbol types that represent functions.
   9525  1.1  christos    This is the default version of this function, which is sufficient for
   9526                   most targets.  It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC.  */
   9527                
   9528                bfd_boolean
   9529                _bfd_elf_is_function_type (unsigned int type)
   9530                {
   9531                  return (type == STT_FUNC
   9532                	  || type == STT_GNU_IFUNC);
   9533                }
   9534