Home | History | Annotate | Line # | Download | only in bfd
elfcode.h revision 1.6
      1 /* ELF executable support for BFD.
      2    Copyright (C) 1991-2016 Free Software Foundation, Inc.
      3 
      4    Written by Fred Fish @ Cygnus Support, from information published
      5    in "UNIX System V Release 4, Programmers Guide: ANSI C and
      6    Programming Support Tools".  Sufficient support for gdb.
      7 
      8    Rewritten by Mark Eichin @ Cygnus Support, from information
      9    published in "System V Application Binary Interface", chapters 4
     10    and 5, as well as the various "Processor Supplement" documents
     11    derived from it. Added support for assembler and other object file
     12    utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
     13    Meissner (Open Software Foundation), and Peter Hoogenboom (University
     14    of Utah) to finish and extend this.
     15 
     16    This file is part of BFD, the Binary File Descriptor library.
     17 
     18    This program is free software; you can redistribute it and/or modify
     19    it under the terms of the GNU General Public License as published by
     20    the Free Software Foundation; either version 3 of the License, or
     21    (at your option) any later version.
     22 
     23    This program is distributed in the hope that it will be useful,
     24    but WITHOUT ANY WARRANTY; without even the implied warranty of
     25    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     26    GNU General Public License for more details.
     27 
     28    You should have received a copy of the GNU General Public License
     29    along with this program; if not, write to the Free Software
     30    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     31    MA 02110-1301, USA.  */
     32 
     33 
     34 /* Problems and other issues to resolve.
     35 
     36    (1)	BFD expects there to be some fixed number of "sections" in
     37 	the object file.  I.E. there is a "section_count" variable in the
     38 	bfd structure which contains the number of sections.  However, ELF
     39 	supports multiple "views" of a file.  In particular, with current
     40 	implementations, executable files typically have two tables, a
     41 	program header table and a section header table, both of which
     42 	partition the executable.
     43 
     44 	In ELF-speak, the "linking view" of the file uses the section header
     45 	table to access "sections" within the file, and the "execution view"
     46 	uses the program header table to access "segments" within the file.
     47 	"Segments" typically may contain all the data from one or more
     48 	"sections".
     49 
     50 	Note that the section header table is optional in ELF executables,
     51 	but it is this information that is most useful to gdb.  If the
     52 	section header table is missing, then gdb should probably try
     53 	to make do with the program header table.  (FIXME)
     54 
     55    (2)  The code in this file is compiled twice, once in 32-bit mode and
     56 	once in 64-bit mode.  More of it should be made size-independent
     57 	and moved into elf.c.
     58 
     59    (3)	ELF section symbols are handled rather sloppily now.  This should
     60 	be cleaned up, and ELF section symbols reconciled with BFD section
     61 	symbols.
     62 
     63    (4)  We need a published spec for 64-bit ELF.  We've got some stuff here
     64 	that we're using for SPARC V9 64-bit chips, but don't assume that
     65 	it's cast in stone.
     66  */
     67 
     68 #include "sysdep.h"
     69 #include "bfd.h"
     70 #include "libiberty.h"
     71 #include "bfdlink.h"
     72 #include "libbfd.h"
     73 #include "elf-bfd.h"
     74 #include "libiberty.h"
     75 
     76 /* Renaming structures, typedefs, macros and functions to be size-specific.  */
     77 #define Elf_External_Ehdr	NAME(Elf,External_Ehdr)
     78 #define Elf_External_Sym	NAME(Elf,External_Sym)
     79 #define Elf_External_Shdr	NAME(Elf,External_Shdr)
     80 #define Elf_External_Phdr	NAME(Elf,External_Phdr)
     81 #define Elf_External_Rel	NAME(Elf,External_Rel)
     82 #define Elf_External_Rela	NAME(Elf,External_Rela)
     83 #define Elf_External_Dyn	NAME(Elf,External_Dyn)
     84 
     85 #define elf_core_file_failing_command	NAME(bfd_elf,core_file_failing_command)
     86 #define elf_core_file_failing_signal	NAME(bfd_elf,core_file_failing_signal)
     87 #define elf_core_file_matches_executable_p \
     88   NAME(bfd_elf,core_file_matches_executable_p)
     89 #define elf_core_file_pid		NAME(bfd_elf,core_file_pid)
     90 #define elf_object_p			NAME(bfd_elf,object_p)
     91 #define elf_core_file_p			NAME(bfd_elf,core_file_p)
     92 #define elf_get_symtab_upper_bound	NAME(bfd_elf,get_symtab_upper_bound)
     93 #define elf_get_dynamic_symtab_upper_bound \
     94   NAME(bfd_elf,get_dynamic_symtab_upper_bound)
     95 #define elf_swap_reloc_in		NAME(bfd_elf,swap_reloc_in)
     96 #define elf_swap_reloca_in		NAME(bfd_elf,swap_reloca_in)
     97 #define elf_swap_reloc_out		NAME(bfd_elf,swap_reloc_out)
     98 #define elf_swap_reloca_out		NAME(bfd_elf,swap_reloca_out)
     99 #define elf_swap_symbol_in		NAME(bfd_elf,swap_symbol_in)
    100 #define elf_swap_symbol_out		NAME(bfd_elf,swap_symbol_out)
    101 #define elf_swap_phdr_in		NAME(bfd_elf,swap_phdr_in)
    102 #define elf_swap_phdr_out		NAME(bfd_elf,swap_phdr_out)
    103 #define elf_swap_dyn_in			NAME(bfd_elf,swap_dyn_in)
    104 #define elf_swap_dyn_out		NAME(bfd_elf,swap_dyn_out)
    105 #define elf_get_reloc_upper_bound	NAME(bfd_elf,get_reloc_upper_bound)
    106 #define elf_canonicalize_reloc		NAME(bfd_elf,canonicalize_reloc)
    107 #define elf_slurp_symbol_table		NAME(bfd_elf,slurp_symbol_table)
    108 #define elf_canonicalize_symtab		NAME(bfd_elf,canonicalize_symtab)
    109 #define elf_canonicalize_dynamic_symtab \
    110   NAME(bfd_elf,canonicalize_dynamic_symtab)
    111 #define elf_get_synthetic_symtab \
    112   NAME(bfd_elf,get_synthetic_symtab)
    113 #define elf_make_empty_symbol		NAME(bfd_elf,make_empty_symbol)
    114 #define elf_get_symbol_info		NAME(bfd_elf,get_symbol_info)
    115 #define elf_get_lineno			NAME(bfd_elf,get_lineno)
    116 #define elf_set_arch_mach		NAME(bfd_elf,set_arch_mach)
    117 #define elf_find_nearest_line		NAME(bfd_elf,find_nearest_line)
    118 #define elf_sizeof_headers		NAME(bfd_elf,sizeof_headers)
    119 #define elf_set_section_contents	NAME(bfd_elf,set_section_contents)
    120 #define elf_no_info_to_howto		NAME(bfd_elf,no_info_to_howto)
    121 #define elf_no_info_to_howto_rel	NAME(bfd_elf,no_info_to_howto_rel)
    122 #define elf_find_section		NAME(bfd_elf,find_section)
    123 #define elf_write_shdrs_and_ehdr	NAME(bfd_elf,write_shdrs_and_ehdr)
    124 #define elf_write_out_phdrs		NAME(bfd_elf,write_out_phdrs)
    125 #define elf_checksum_contents		NAME(bfd_elf,checksum_contents)
    126 #define elf_write_relocs		NAME(bfd_elf,write_relocs)
    127 #define elf_slurp_reloc_table		NAME(bfd_elf,slurp_reloc_table)
    128 
    129 #if ARCH_SIZE == 64
    130 #define ELF_R_INFO(X,Y)	ELF64_R_INFO(X,Y)
    131 #define ELF_R_SYM(X)	ELF64_R_SYM(X)
    132 #define ELF_R_TYPE(X)	ELF64_R_TYPE(X)
    133 #define ELFCLASS	ELFCLASS64
    134 #define FILE_ALIGN	8
    135 #define LOG_FILE_ALIGN	3
    136 #endif
    137 #if ARCH_SIZE == 32
    138 #define ELF_R_INFO(X,Y)	ELF32_R_INFO(X,Y)
    139 #define ELF_R_SYM(X)	ELF32_R_SYM(X)
    140 #define ELF_R_TYPE(X)	ELF32_R_TYPE(X)
    141 #define ELFCLASS	ELFCLASS32
    142 #define FILE_ALIGN	4
    143 #define LOG_FILE_ALIGN	2
    144 #endif
    145 
    146 #if DEBUG & 2
    147 static void elf_debug_section (int, Elf_Internal_Shdr *);
    148 #endif
    149 #if DEBUG & 1
    150 static void elf_debug_file (Elf_Internal_Ehdr *);
    151 #endif
    152 
    153 /* Structure swapping routines */
    155 
    156 /* Should perhaps use put_offset, put_word, etc.  For now, the two versions
    157    can be handled by explicitly specifying 32 bits or "the long type".  */
    158 #if ARCH_SIZE == 64
    159 #define H_PUT_WORD		H_PUT_64
    160 #define H_PUT_SIGNED_WORD	H_PUT_S64
    161 #define H_GET_WORD		H_GET_64
    162 #define H_GET_SIGNED_WORD	H_GET_S64
    163 #endif
    164 #if ARCH_SIZE == 32
    165 #define H_PUT_WORD		H_PUT_32
    166 #define H_PUT_SIGNED_WORD	H_PUT_S32
    167 #define H_GET_WORD		H_GET_32
    168 #define H_GET_SIGNED_WORD	H_GET_S32
    169 #endif
    170 
    171 /* Translate an ELF symbol in external format into an ELF symbol in internal
    172    format.  */
    173 
    174 bfd_boolean
    175 elf_swap_symbol_in (bfd *abfd,
    176 		    const void *psrc,
    177 		    const void *pshn,
    178 		    Elf_Internal_Sym *dst)
    179 {
    180   const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
    181   const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
    182   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    183 
    184   dst->st_name = H_GET_32 (abfd, src->st_name);
    185   if (signed_vma)
    186     dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
    187   else
    188     dst->st_value = H_GET_WORD (abfd, src->st_value);
    189   dst->st_size = H_GET_WORD (abfd, src->st_size);
    190   dst->st_info = H_GET_8 (abfd, src->st_info);
    191   dst->st_other = H_GET_8 (abfd, src->st_other);
    192   dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
    193   if (dst->st_shndx == (SHN_XINDEX & 0xffff))
    194     {
    195       if (shndx == NULL)
    196 	return FALSE;
    197       dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
    198     }
    199   else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
    200     dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
    201   dst->st_target_internal = 0;
    202   return TRUE;
    203 }
    204 
    205 /* Translate an ELF symbol in internal format into an ELF symbol in external
    206    format.  */
    207 
    208 void
    209 elf_swap_symbol_out (bfd *abfd,
    210 		     const Elf_Internal_Sym *src,
    211 		     void *cdst,
    212 		     void *shndx)
    213 {
    214   unsigned int tmp;
    215   Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
    216   H_PUT_32 (abfd, src->st_name, dst->st_name);
    217   H_PUT_WORD (abfd, src->st_value, dst->st_value);
    218   H_PUT_WORD (abfd, src->st_size, dst->st_size);
    219   H_PUT_8 (abfd, src->st_info, dst->st_info);
    220   H_PUT_8 (abfd, src->st_other, dst->st_other);
    221   tmp = src->st_shndx;
    222   if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
    223     {
    224       if (shndx == NULL)
    225 	abort ();
    226       H_PUT_32 (abfd, tmp, shndx);
    227       tmp = SHN_XINDEX & 0xffff;
    228     }
    229   H_PUT_16 (abfd, tmp, dst->st_shndx);
    230 }
    231 
    232 /* Translate an ELF file header in external format into an ELF file header in
    233    internal format.  */
    234 
    235 static void
    236 elf_swap_ehdr_in (bfd *abfd,
    237 		  const Elf_External_Ehdr *src,
    238 		  Elf_Internal_Ehdr *dst)
    239 {
    240   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    241   memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
    242   dst->e_type = H_GET_16 (abfd, src->e_type);
    243   dst->e_machine = H_GET_16 (abfd, src->e_machine);
    244   dst->e_version = H_GET_32 (abfd, src->e_version);
    245   if (signed_vma)
    246     dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
    247   else
    248     dst->e_entry = H_GET_WORD (abfd, src->e_entry);
    249   dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
    250   dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
    251   dst->e_flags = H_GET_32 (abfd, src->e_flags);
    252   dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
    253   dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
    254   dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
    255   dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
    256   dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
    257   dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
    258 }
    259 
    260 /* Translate an ELF file header in internal format into an ELF file header in
    261    external format.  */
    262 
    263 static void
    264 elf_swap_ehdr_out (bfd *abfd,
    265 		   const Elf_Internal_Ehdr *src,
    266 		   Elf_External_Ehdr *dst)
    267 {
    268   unsigned int tmp;
    269   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    270   memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
    271   /* note that all elements of dst are *arrays of unsigned char* already...  */
    272   H_PUT_16 (abfd, src->e_type, dst->e_type);
    273   H_PUT_16 (abfd, src->e_machine, dst->e_machine);
    274   H_PUT_32 (abfd, src->e_version, dst->e_version);
    275   if (signed_vma)
    276     H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
    277   else
    278     H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
    279   H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
    280   H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
    281   H_PUT_32 (abfd, src->e_flags, dst->e_flags);
    282   H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
    283   H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
    284   tmp = src->e_phnum;
    285   if (tmp > PN_XNUM)
    286     tmp = PN_XNUM;
    287   H_PUT_16 (abfd, tmp, dst->e_phnum);
    288   H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
    289   tmp = src->e_shnum;
    290   if (tmp >= (SHN_LORESERVE & 0xffff))
    291     tmp = SHN_UNDEF;
    292   H_PUT_16 (abfd, tmp, dst->e_shnum);
    293   tmp = src->e_shstrndx;
    294   if (tmp >= (SHN_LORESERVE & 0xffff))
    295     tmp = SHN_XINDEX & 0xffff;
    296   H_PUT_16 (abfd, tmp, dst->e_shstrndx);
    297 }
    298 
    299 /* Translate an ELF section header table entry in external format into an
    300    ELF section header table entry in internal format.  */
    301 
    302 static void
    303 elf_swap_shdr_in (bfd *abfd,
    304 		  const Elf_External_Shdr *src,
    305 		  Elf_Internal_Shdr *dst)
    306 {
    307   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    308 
    309   dst->sh_name = H_GET_32 (abfd, src->sh_name);
    310   dst->sh_type = H_GET_32 (abfd, src->sh_type);
    311   dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
    312   if (signed_vma)
    313     dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
    314   else
    315     dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
    316   dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
    317   dst->sh_size = H_GET_WORD (abfd, src->sh_size);
    318   dst->sh_link = H_GET_32 (abfd, src->sh_link);
    319   dst->sh_info = H_GET_32 (abfd, src->sh_info);
    320   dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
    321   dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
    322   dst->bfd_section = NULL;
    323   dst->contents = NULL;
    324 }
    325 
    326 /* Translate an ELF section header table entry in internal format into an
    327    ELF section header table entry in external format.  */
    328 
    329 static void
    330 elf_swap_shdr_out (bfd *abfd,
    331 		   const Elf_Internal_Shdr *src,
    332 		   Elf_External_Shdr *dst)
    333 {
    334   /* note that all elements of dst are *arrays of unsigned char* already...  */
    335   H_PUT_32 (abfd, src->sh_name, dst->sh_name);
    336   H_PUT_32 (abfd, src->sh_type, dst->sh_type);
    337   H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
    338   H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
    339   H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
    340   H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
    341   H_PUT_32 (abfd, src->sh_link, dst->sh_link);
    342   H_PUT_32 (abfd, src->sh_info, dst->sh_info);
    343   H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
    344   H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
    345 }
    346 
    347 /* Translate an ELF program header table entry in external format into an
    348    ELF program header table entry in internal format.  */
    349 
    350 void
    351 elf_swap_phdr_in (bfd *abfd,
    352 		  const Elf_External_Phdr *src,
    353 		  Elf_Internal_Phdr *dst)
    354 {
    355   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    356 
    357   dst->p_type = H_GET_32 (abfd, src->p_type);
    358   dst->p_flags = H_GET_32 (abfd, src->p_flags);
    359   dst->p_offset = H_GET_WORD (abfd, src->p_offset);
    360   if (signed_vma)
    361     {
    362       dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
    363       dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
    364     }
    365   else
    366     {
    367       dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
    368       dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
    369     }
    370   dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
    371   dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
    372   dst->p_align = H_GET_WORD (abfd, src->p_align);
    373 }
    374 
    375 void
    376 elf_swap_phdr_out (bfd *abfd,
    377 		   const Elf_Internal_Phdr *src,
    378 		   Elf_External_Phdr *dst)
    379 {
    380   const struct elf_backend_data *bed;
    381   bfd_vma p_paddr;
    382 
    383   bed = get_elf_backend_data (abfd);
    384   p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
    385 
    386   /* note that all elements of dst are *arrays of unsigned char* already...  */
    387   H_PUT_32 (abfd, src->p_type, dst->p_type);
    388   H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
    389   H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
    390   H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
    391   H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
    392   H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
    393   H_PUT_32 (abfd, src->p_flags, dst->p_flags);
    394   H_PUT_WORD (abfd, src->p_align, dst->p_align);
    395 }
    396 
    397 /* Translate an ELF reloc from external format to internal format.  */
    398 void
    399 elf_swap_reloc_in (bfd *abfd,
    400 		   const bfd_byte *s,
    401 		   Elf_Internal_Rela *dst)
    402 {
    403   const Elf_External_Rel *src = (const Elf_External_Rel *) s;
    404   dst->r_offset = H_GET_WORD (abfd, src->r_offset);
    405   dst->r_info = H_GET_WORD (abfd, src->r_info);
    406   dst->r_addend = 0;
    407 }
    408 
    409 void
    410 elf_swap_reloca_in (bfd *abfd,
    411 		    const bfd_byte *s,
    412 		    Elf_Internal_Rela *dst)
    413 {
    414   const Elf_External_Rela *src = (const Elf_External_Rela *) s;
    415   dst->r_offset = H_GET_WORD (abfd, src->r_offset);
    416   dst->r_info = H_GET_WORD (abfd, src->r_info);
    417   dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
    418 }
    419 
    420 /* Translate an ELF reloc from internal format to external format.  */
    421 void
    422 elf_swap_reloc_out (bfd *abfd,
    423 		    const Elf_Internal_Rela *src,
    424 		    bfd_byte *d)
    425 {
    426   Elf_External_Rel *dst = (Elf_External_Rel *) d;
    427   H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
    428   H_PUT_WORD (abfd, src->r_info, dst->r_info);
    429 }
    430 
    431 void
    432 elf_swap_reloca_out (bfd *abfd,
    433 		     const Elf_Internal_Rela *src,
    434 		     bfd_byte *d)
    435 {
    436   Elf_External_Rela *dst = (Elf_External_Rela *) d;
    437   H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
    438   H_PUT_WORD (abfd, src->r_info, dst->r_info);
    439   H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
    440 }
    441 
    442 void
    443 elf_swap_dyn_in (bfd *abfd,
    444 		 const void *p,
    445 		 Elf_Internal_Dyn *dst)
    446 {
    447   const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
    448 
    449   dst->d_tag = H_GET_WORD (abfd, src->d_tag);
    450   dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
    451 }
    452 
    453 void
    454 elf_swap_dyn_out (bfd *abfd,
    455 		  const Elf_Internal_Dyn *src,
    456 		  void *p)
    457 {
    458   Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
    459 
    460   H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
    461   H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
    462 }
    463 
    464 /* ELF .o/exec file reading */
    466 
    467 /* Begin processing a given object.
    468 
    469    First we validate the file by reading in the ELF header and checking
    470    the magic number.  */
    471 
    472 static inline bfd_boolean
    473 elf_file_p (Elf_External_Ehdr *x_ehdrp)
    474 {
    475   return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
    476 	  && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
    477 	  && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
    478 	  && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
    479 }
    480 
    481 /* Check to see if the file associated with ABFD matches the target vector
    482    that ABFD points to.
    483 
    484    Note that we may be called several times with the same ABFD, but different
    485    target vectors, most of which will not match.  We have to avoid leaving
    486    any side effects in ABFD, or any data it points to (like tdata), if the
    487    file does not match the target vector.  */
    488 
    489 const bfd_target *
    490 elf_object_p (bfd *abfd)
    491 {
    492   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
    493   Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form */
    494   Elf_External_Shdr x_shdr;	/* Section header table entry, external form */
    495   Elf_Internal_Shdr i_shdr;
    496   Elf_Internal_Shdr *i_shdrp;	/* Section header table, internal form */
    497   unsigned int shindex;
    498   const struct elf_backend_data *ebd;
    499   asection *s;
    500   bfd_size_type amt;
    501   const bfd_target *target;
    502 
    503   /* Read in the ELF header in external format.  */
    504 
    505   if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
    506     {
    507       if (bfd_get_error () != bfd_error_system_call)
    508 	goto got_wrong_format_error;
    509       else
    510 	goto got_no_match;
    511     }
    512 
    513   /* Now check to see if we have a valid ELF file, and one that BFD can
    514      make use of.  The magic number must match, the address size ('class')
    515      and byte-swapping must match our XVEC entry, and it must have a
    516      section header table (FIXME: See comments re sections at top of this
    517      file).  */
    518 
    519   if (! elf_file_p (&x_ehdr)
    520       || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
    521       || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
    522     goto got_wrong_format_error;
    523 
    524   /* Check that file's byte order matches xvec's */
    525   switch (x_ehdr.e_ident[EI_DATA])
    526     {
    527     case ELFDATA2MSB:		/* Big-endian */
    528       if (! bfd_header_big_endian (abfd))
    529 	goto got_wrong_format_error;
    530       break;
    531     case ELFDATA2LSB:		/* Little-endian */
    532       if (! bfd_header_little_endian (abfd))
    533 	goto got_wrong_format_error;
    534       break;
    535     case ELFDATANONE:		/* No data encoding specified */
    536     default:			/* Unknown data encoding specified */
    537       goto got_wrong_format_error;
    538     }
    539 
    540   target = abfd->xvec;
    541 
    542   /* Allocate an instance of the elf_obj_tdata structure and hook it up to
    543      the tdata pointer in the bfd.  */
    544 
    545   if (! (*target->_bfd_set_format[bfd_object]) (abfd))
    546     goto got_no_match;
    547 
    548   /* Now that we know the byte order, swap in the rest of the header */
    549   i_ehdrp = elf_elfheader (abfd);
    550   elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
    551 #if DEBUG & 1
    552   elf_debug_file (i_ehdrp);
    553 #endif
    554 
    555   /* Reject ET_CORE (header indicates core file, not object file) */
    556   if (i_ehdrp->e_type == ET_CORE)
    557     goto got_wrong_format_error;
    558 
    559   /* If this is a relocatable file and there is no section header
    560      table, then we're hosed.  */
    561   if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
    562     goto got_wrong_format_error;
    563 
    564   /* As a simple sanity check, verify that what BFD thinks is the
    565      size of each section header table entry actually matches the size
    566      recorded in the file, but only if there are any sections.  */
    567   if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
    568     goto got_wrong_format_error;
    569 
    570   /* Further sanity check.  */
    571   if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_shnum != 0)
    572     goto got_wrong_format_error;
    573 
    574   ebd = get_elf_backend_data (abfd);
    575   if (ebd->s->arch_size != ARCH_SIZE)
    576     goto got_wrong_format_error;
    577 
    578   /* Check that the ELF e_machine field matches what this particular
    579      BFD format expects.  */
    580   if (ebd->elf_machine_code != i_ehdrp->e_machine
    581       && (ebd->elf_machine_alt1 == 0
    582 	  || i_ehdrp->e_machine != ebd->elf_machine_alt1)
    583       && (ebd->elf_machine_alt2 == 0
    584 	  || i_ehdrp->e_machine != ebd->elf_machine_alt2)
    585       && ebd->elf_machine_code != EM_NONE)
    586     goto got_wrong_format_error;
    587 
    588   if (i_ehdrp->e_type == ET_EXEC)
    589     abfd->flags |= EXEC_P;
    590   else if (i_ehdrp->e_type == ET_DYN)
    591     abfd->flags |= DYNAMIC;
    592 
    593   if (i_ehdrp->e_phnum > 0)
    594     abfd->flags |= D_PAGED;
    595 
    596   if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
    597     {
    598       /* It's OK if this fails for the generic target.  */
    599       if (ebd->elf_machine_code != EM_NONE)
    600 	goto got_no_match;
    601     }
    602 
    603   if (ebd->elf_machine_code != EM_NONE
    604       && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
    605       && ebd->elf_osabi != ELFOSABI_NONE)
    606     goto got_wrong_format_error;
    607 
    608   if (i_ehdrp->e_shoff != 0)
    609     {
    610       file_ptr where = (file_ptr) i_ehdrp->e_shoff;
    611 
    612       /* Seek to the section header table in the file.  */
    613       if (bfd_seek (abfd, where, SEEK_SET) != 0)
    614 	goto got_no_match;
    615 
    616       /* Read the first section header at index 0, and convert to internal
    617 	 form.  */
    618       if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
    619 	goto got_no_match;
    620       elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
    621 
    622       /* If the section count is zero, the actual count is in the first
    623 	 section header.  */
    624       if (i_ehdrp->e_shnum == SHN_UNDEF)
    625 	{
    626 	  i_ehdrp->e_shnum = i_shdr.sh_size;
    627 	  if (i_ehdrp->e_shnum >= SHN_LORESERVE
    628 	      || i_ehdrp->e_shnum != i_shdr.sh_size
    629 	      || i_ehdrp->e_shnum  == 0)
    630 	    goto got_wrong_format_error;
    631 	}
    632 
    633       /* And similarly for the string table index.  */
    634       if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
    635 	{
    636 	  i_ehdrp->e_shstrndx = i_shdr.sh_link;
    637 	  if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
    638 	    goto got_wrong_format_error;
    639 	}
    640 
    641       /* And program headers.  */
    642       if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
    643 	{
    644 	  i_ehdrp->e_phnum = i_shdr.sh_info;
    645 	  if (i_ehdrp->e_phnum != i_shdr.sh_info)
    646 	    goto got_wrong_format_error;
    647 	}
    648 
    649       /* Sanity check that we can read all of the section headers.
    650 	 It ought to be good enough to just read the last one.  */
    651       if (i_ehdrp->e_shnum != 1)
    652 	{
    653 	  /* Check that we don't have a totally silly number of sections.  */
    654 	  if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
    655 	      || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
    656 	    goto got_wrong_format_error;
    657 
    658 	  where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
    659 	  if ((bfd_size_type) where <= i_ehdrp->e_shoff)
    660 	    goto got_wrong_format_error;
    661 
    662 	  if (bfd_seek (abfd, where, SEEK_SET) != 0)
    663 	    goto got_no_match;
    664 	  if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
    665 	    goto got_no_match;
    666 
    667 	  /* Back to where we were.  */
    668 	  where = i_ehdrp->e_shoff + sizeof (x_shdr);
    669 	  if (bfd_seek (abfd, where, SEEK_SET) != 0)
    670 	    goto got_no_match;
    671 	}
    672     }
    673 
    674   /* Allocate space for a copy of the section header table in
    675      internal form.  */
    676   if (i_ehdrp->e_shnum != 0)
    677     {
    678       Elf_Internal_Shdr *shdrp;
    679       unsigned int num_sec;
    680 
    681 #ifndef BFD64
    682       if (i_ehdrp->e_shnum > ((bfd_size_type) -1) / sizeof (*i_shdrp))
    683 	goto got_wrong_format_error;
    684 #endif
    685       amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
    686       i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
    687       if (!i_shdrp)
    688 	goto got_no_match;
    689       num_sec = i_ehdrp->e_shnum;
    690       elf_numsections (abfd) = num_sec;
    691       amt = sizeof (i_shdrp) * num_sec;
    692       elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
    693       if (!elf_elfsections (abfd))
    694 	goto got_no_match;
    695 
    696       memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
    697       for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
    698 	elf_elfsections (abfd)[shindex] = shdrp++;
    699 
    700       /* Read in the rest of the section header table and convert it
    701 	 to internal form.  */
    702       for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
    703 	{
    704 	  if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
    705 	    goto got_no_match;
    706 	  elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
    707 
    708 	  /* Sanity check sh_link and sh_info.  */
    709 	  if (i_shdrp[shindex].sh_link >= num_sec)
    710 	    {
    711 	      /* PR 10478: Accept Solaris binaries with a sh_link
    712 		 field set to SHN_BEFORE or SHN_AFTER.  */
    713 	      switch (ebd->elf_machine_code)
    714 		{
    715 		case EM_386:
    716 		case EM_IAMCU:
    717 		case EM_X86_64:
    718 		case EM_OLD_SPARCV9:
    719 		case EM_SPARC32PLUS:
    720 		case EM_SPARCV9:
    721 		case EM_SPARC:
    722 		  if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
    723 		      || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
    724 		    break;
    725 		  /* Otherwise fall through.  */
    726 		default:
    727 		  goto got_wrong_format_error;
    728 		}
    729 	    }
    730 
    731 	  if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
    732 	       || i_shdrp[shindex].sh_type == SHT_RELA
    733 	       || i_shdrp[shindex].sh_type == SHT_REL)
    734 	      && i_shdrp[shindex].sh_info >= num_sec)
    735 	    goto got_wrong_format_error;
    736 
    737 	  /* If the section is loaded, but not page aligned, clear
    738 	     D_PAGED.  */
    739 	  if (i_shdrp[shindex].sh_size != 0
    740 	      && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
    741 	      && i_shdrp[shindex].sh_type != SHT_NOBITS
    742 	      && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
    743 		   % ebd->minpagesize)
    744 		  != 0))
    745 	    abfd->flags &= ~D_PAGED;
    746 	}
    747     }
    748 
    749   /* A further sanity check.  */
    750   if (i_ehdrp->e_shnum != 0)
    751     {
    752       if (i_ehdrp->e_shstrndx >= elf_numsections (abfd))
    753 	{
    754 	  /* PR 2257:
    755 	     We used to just goto got_wrong_format_error here
    756 	     but there are binaries in existance for which this test
    757 	     will prevent the binutils from working with them at all.
    758 	     So we are kind, and reset the string index value to 0
    759 	     so that at least some processing can be done.  */
    760 	  i_ehdrp->e_shstrndx = SHN_UNDEF;
    761 	  _bfd_error_handler (_("warning: %s has a corrupt string table index - ignoring"), abfd->filename);
    762 	}
    763     }
    764   else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
    765     goto got_wrong_format_error;
    766 
    767   /* Read in the program headers.  */
    768   if (i_ehdrp->e_phnum == 0)
    769     elf_tdata (abfd)->phdr = NULL;
    770   else
    771     {
    772       Elf_Internal_Phdr *i_phdr;
    773       unsigned int i;
    774 
    775 #ifndef BFD64
    776       if (i_ehdrp->e_phnum > ((bfd_size_type) -1) / sizeof (*i_phdr))
    777 	goto got_wrong_format_error;
    778 #endif
    779       amt = i_ehdrp->e_phnum * sizeof (*i_phdr);
    780       elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
    781       if (elf_tdata (abfd)->phdr == NULL)
    782 	goto got_no_match;
    783       if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
    784 	goto got_no_match;
    785       i_phdr = elf_tdata (abfd)->phdr;
    786       for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
    787 	{
    788 	  Elf_External_Phdr x_phdr;
    789 
    790 	  if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
    791 	    goto got_no_match;
    792 	  elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
    793 	}
    794     }
    795 
    796   if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
    797     {
    798       unsigned int num_sec;
    799 
    800       /* Once all of the section headers have been read and converted, we
    801 	 can start processing them.  Note that the first section header is
    802 	 a dummy placeholder entry, so we ignore it.  */
    803       num_sec = elf_numsections (abfd);
    804       for (shindex = 1; shindex < num_sec; shindex++)
    805 	if (!bfd_section_from_shdr (abfd, shindex))
    806 	  goto got_no_match;
    807 
    808       /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
    809       if (! _bfd_elf_setup_sections (abfd))
    810 	goto got_wrong_format_error;
    811     }
    812 
    813   /* Let the backend double check the format and override global
    814      information.  */
    815   if (ebd->elf_backend_object_p)
    816     {
    817       if (! (*ebd->elf_backend_object_p) (abfd))
    818 	goto got_wrong_format_error;
    819     }
    820 
    821   /* Remember the entry point specified in the ELF file header.  */
    822   bfd_set_start_address (abfd, i_ehdrp->e_entry);
    823 
    824   /* If we have created any reloc sections that are associated with
    825      debugging sections, mark the reloc sections as debugging as well.  */
    826   for (s = abfd->sections; s != NULL; s = s->next)
    827     {
    828       if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
    829 	   || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
    830 	  && elf_section_data (s)->this_hdr.sh_info > 0)
    831 	{
    832 	  unsigned long targ_index;
    833 	  asection *targ_sec;
    834 
    835 	  targ_index = elf_section_data (s)->this_hdr.sh_info;
    836 	  targ_sec = bfd_section_from_elf_index (abfd, targ_index);
    837 	  if (targ_sec != NULL
    838 	      && (targ_sec->flags & SEC_DEBUGGING) != 0)
    839 	    s->flags |= SEC_DEBUGGING;
    840 	}
    841     }
    842   return target;
    843 
    844  got_wrong_format_error:
    845   bfd_set_error (bfd_error_wrong_format);
    846 
    847  got_no_match:
    848   return NULL;
    849 }
    850 
    851 /* ELF .o/exec file writing */
    853 
    854 /* Write out the relocs.  */
    855 
    856 void
    857 elf_write_relocs (bfd *abfd, asection *sec, void *data)
    858 {
    859   bfd_boolean *failedp = (bfd_boolean *) data;
    860   Elf_Internal_Shdr *rela_hdr;
    861   bfd_vma addr_offset;
    862   void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
    863   size_t extsize;
    864   bfd_byte *dst_rela;
    865   unsigned int idx;
    866   asymbol *last_sym;
    867   int last_sym_idx;
    868 
    869   /* If we have already failed, don't do anything.  */
    870   if (*failedp)
    871     return;
    872 
    873   if ((sec->flags & SEC_RELOC) == 0)
    874     return;
    875 
    876   /* The linker backend writes the relocs out itself, and sets the
    877      reloc_count field to zero to inhibit writing them here.  Also,
    878      sometimes the SEC_RELOC flag gets set even when there aren't any
    879      relocs.  */
    880   if (sec->reloc_count == 0)
    881     return;
    882 
    883   /* If we have opened an existing file for update, reloc_count may be
    884      set even though we are not linking.  In that case we have nothing
    885      to do.  */
    886   if (sec->orelocation == NULL)
    887     return;
    888 
    889   rela_hdr = elf_section_data (sec)->rela.hdr;
    890   if (rela_hdr == NULL)
    891     rela_hdr = elf_section_data (sec)->rel.hdr;
    892 
    893   rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
    894   rela_hdr->contents = (unsigned char *) bfd_alloc (abfd, rela_hdr->sh_size);
    895   if (rela_hdr->contents == NULL)
    896     {
    897       *failedp = TRUE;
    898       return;
    899     }
    900 
    901   /* Figure out whether the relocations are RELA or REL relocations.  */
    902   if (rela_hdr->sh_type == SHT_RELA)
    903     {
    904       swap_out = elf_swap_reloca_out;
    905       extsize = sizeof (Elf_External_Rela);
    906     }
    907   else if (rela_hdr->sh_type == SHT_REL)
    908     {
    909       swap_out = elf_swap_reloc_out;
    910       extsize = sizeof (Elf_External_Rel);
    911     }
    912   else
    913     /* Every relocation section should be either an SHT_RELA or an
    914        SHT_REL section.  */
    915     abort ();
    916 
    917   /* The address of an ELF reloc is section relative for an object
    918      file, and absolute for an executable file or shared library.
    919      The address of a BFD reloc is always section relative.  */
    920   addr_offset = 0;
    921   if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
    922     addr_offset = sec->vma;
    923 
    924   /* orelocation has the data, reloc_count has the count...  */
    925   last_sym = 0;
    926   last_sym_idx = 0;
    927   dst_rela = rela_hdr->contents;
    928 
    929   for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
    930     {
    931       Elf_Internal_Rela src_rela;
    932       arelent *ptr;
    933       asymbol *sym;
    934       int n;
    935 
    936       ptr = sec->orelocation[idx];
    937       sym = *ptr->sym_ptr_ptr;
    938       if (sym == last_sym)
    939 	n = last_sym_idx;
    940       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
    941 	n = STN_UNDEF;
    942       else
    943 	{
    944 	  last_sym = sym;
    945 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
    946 	  if (n < 0)
    947 	    {
    948 	      *failedp = TRUE;
    949 	      return;
    950 	    }
    951 	  last_sym_idx = n;
    952 	}
    953 
    954       if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
    955 	  && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
    956 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
    957 	{
    958 	  *failedp = TRUE;
    959 	  return;
    960 	}
    961 
    962       src_rela.r_offset = ptr->address + addr_offset;
    963       src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
    964       src_rela.r_addend = ptr->addend;
    965       (*swap_out) (abfd, &src_rela, dst_rela);
    966     }
    967 }
    968 
    969 /* Write out the program headers.  */
    970 
    971 int
    972 elf_write_out_phdrs (bfd *abfd,
    973 		     const Elf_Internal_Phdr *phdr,
    974 		     unsigned int count)
    975 {
    976   while (count--)
    977     {
    978       Elf_External_Phdr extphdr;
    979       elf_swap_phdr_out (abfd, phdr, &extphdr);
    980       if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
    981 	  != sizeof (Elf_External_Phdr))
    982 	return -1;
    983       phdr++;
    984     }
    985   return 0;
    986 }
    987 
    988 /* Write out the section headers and the ELF file header.  */
    989 
    990 bfd_boolean
    991 elf_write_shdrs_and_ehdr (bfd *abfd)
    992 {
    993   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
    994   Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form */
    995   Elf_External_Shdr *x_shdrp;	/* Section header table, external form */
    996   Elf_Internal_Shdr **i_shdrp;	/* Section header table, internal form */
    997   unsigned int count;
    998   bfd_size_type amt;
    999 
   1000   i_ehdrp = elf_elfheader (abfd);
   1001   i_shdrp = elf_elfsections (abfd);
   1002 
   1003   /* swap the header before spitting it out...  */
   1004 
   1005 #if DEBUG & 1
   1006   elf_debug_file (i_ehdrp);
   1007 #endif
   1008   elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
   1009   amt = sizeof (x_ehdr);
   1010   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
   1011       || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
   1012     return FALSE;
   1013 
   1014   /* Some fields in the first section header handle overflow of ehdr
   1015      fields.  */
   1016   if (i_ehdrp->e_phnum >= PN_XNUM)
   1017     i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
   1018   if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
   1019     i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
   1020   if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
   1021     i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
   1022 
   1023   /* at this point we've concocted all the ELF sections...  */
   1024   amt = i_ehdrp->e_shnum;
   1025   amt *= sizeof (*x_shdrp);
   1026   x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
   1027   if (!x_shdrp)
   1028     return FALSE;
   1029 
   1030   for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
   1031     {
   1032 #if DEBUG & 2
   1033       elf_debug_section (count, *i_shdrp);
   1034 #endif
   1035       elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
   1036     }
   1037   if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
   1038       || bfd_bwrite (x_shdrp, amt, abfd) != amt)
   1039     return FALSE;
   1040 
   1041   /* need to dump the string table too...  */
   1042 
   1043   return TRUE;
   1044 }
   1045 
   1046 bfd_boolean
   1047 elf_checksum_contents (bfd *abfd,
   1048 		       void (*process) (const void *, size_t, void *),
   1049 		       void *arg)
   1050 {
   1051   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
   1052   Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
   1053   Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
   1054   unsigned int count, num;
   1055 
   1056   {
   1057     Elf_External_Ehdr x_ehdr;
   1058     Elf_Internal_Ehdr i_ehdr;
   1059 
   1060     i_ehdr = *i_ehdrp;
   1061     i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
   1062     elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
   1063     (*process) (&x_ehdr, sizeof x_ehdr, arg);
   1064   }
   1065 
   1066   num = i_ehdrp->e_phnum;
   1067   for (count = 0; count < num; count++)
   1068     {
   1069       Elf_External_Phdr x_phdr;
   1070       elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
   1071       (*process) (&x_phdr, sizeof x_phdr, arg);
   1072     }
   1073 
   1074   num = elf_numsections (abfd);
   1075   for (count = 0; count < num; count++)
   1076     {
   1077       Elf_Internal_Shdr i_shdr;
   1078       Elf_External_Shdr x_shdr;
   1079       bfd_byte *contents, *free_contents;
   1080 
   1081       i_shdr = *i_shdrp[count];
   1082       i_shdr.sh_offset = 0;
   1083 
   1084       elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
   1085       (*process) (&x_shdr, sizeof x_shdr, arg);
   1086 
   1087       /* Process the section's contents, if it has some.
   1088 	 PR ld/12451: Read them in if necessary.  */
   1089       if (i_shdr.sh_type == SHT_NOBITS)
   1090 	continue;
   1091       free_contents = NULL;
   1092       contents = i_shdr.contents;
   1093       if (contents == NULL)
   1094 	{
   1095 	  asection *sec;
   1096 
   1097 	  sec = bfd_section_from_elf_index (abfd, count);
   1098 	  if (sec != NULL)
   1099 	    {
   1100 	      contents = sec->contents;
   1101 	      if (contents == NULL)
   1102 		{
   1103 		  /* Force rereading from file.  */
   1104 		  sec->flags &= ~SEC_IN_MEMORY;
   1105 		  if (!bfd_malloc_and_get_section (abfd, sec, &free_contents))
   1106 		    continue;
   1107 		  contents = free_contents;
   1108 		}
   1109 	    }
   1110 	}
   1111       if (contents != NULL)
   1112 	{
   1113 	  (*process) (contents, i_shdr.sh_size, arg);
   1114 	  if (free_contents != NULL)
   1115 	    free (free_contents);
   1116 	}
   1117     }
   1118 
   1119   return TRUE;
   1120 }
   1121 
   1122 long
   1123 elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
   1124 {
   1125   Elf_Internal_Shdr *hdr;
   1126   Elf_Internal_Shdr *verhdr;
   1127   unsigned long symcount;	/* Number of external ELF symbols */
   1128   elf_symbol_type *sym;		/* Pointer to current bfd symbol */
   1129   elf_symbol_type *symbase;	/* Buffer for generated bfd symbols */
   1130   Elf_Internal_Sym *isym;
   1131   Elf_Internal_Sym *isymend;
   1132   Elf_Internal_Sym *isymbuf = NULL;
   1133   Elf_External_Versym *xver;
   1134   Elf_External_Versym *xverbuf = NULL;
   1135   const struct elf_backend_data *ebd;
   1136   bfd_size_type amt;
   1137 
   1138   /* Read each raw ELF symbol, converting from external ELF form to
   1139      internal ELF form, and then using the information to create a
   1140      canonical bfd symbol table entry.
   1141 
   1142      Note that we allocate the initial bfd canonical symbol buffer
   1143      based on a one-to-one mapping of the ELF symbols to canonical
   1144      symbols.  We actually use all the ELF symbols, so there will be no
   1145      space left over at the end.  When we have all the symbols, we
   1146      build the caller's pointer vector.  */
   1147 
   1148   if (! dynamic)
   1149     {
   1150       hdr = &elf_tdata (abfd)->symtab_hdr;
   1151       verhdr = NULL;
   1152     }
   1153   else
   1154     {
   1155       hdr = &elf_tdata (abfd)->dynsymtab_hdr;
   1156       if (elf_dynversym (abfd) == 0)
   1157 	verhdr = NULL;
   1158       else
   1159 	verhdr = &elf_tdata (abfd)->dynversym_hdr;
   1160       if ((elf_dynverdef (abfd) != 0
   1161 	   && elf_tdata (abfd)->verdef == NULL)
   1162 	  || (elf_dynverref (abfd) != 0
   1163 	      && elf_tdata (abfd)->verref == NULL))
   1164 	{
   1165 	  if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
   1166 	    return -1;
   1167 	}
   1168     }
   1169 
   1170   ebd = get_elf_backend_data (abfd);
   1171   symcount = hdr->sh_size / sizeof (Elf_External_Sym);
   1172   if (symcount == 0)
   1173     sym = symbase = NULL;
   1174   else
   1175     {
   1176       isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
   1177 				      NULL, NULL, NULL);
   1178       if (isymbuf == NULL)
   1179 	return -1;
   1180 
   1181       amt = symcount;
   1182       amt *= sizeof (elf_symbol_type);
   1183       symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
   1184       if (symbase == (elf_symbol_type *) NULL)
   1185 	goto error_return;
   1186 
   1187       /* Read the raw ELF version symbol information.  */
   1188       if (verhdr != NULL
   1189 	  && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
   1190 	{
   1191 	  (*_bfd_error_handler)
   1192 	    (_("%s: version count (%ld) does not match symbol count (%ld)"),
   1193 	     abfd->filename,
   1194 	     (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
   1195 	     symcount);
   1196 
   1197 	  /* Slurp in the symbols without the version information,
   1198 	     since that is more helpful than just quitting.  */
   1199 	  verhdr = NULL;
   1200 	}
   1201 
   1202       if (verhdr != NULL)
   1203 	{
   1204 	  if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
   1205 	    goto error_return;
   1206 
   1207 	  xverbuf = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
   1208 	  if (xverbuf == NULL && verhdr->sh_size != 0)
   1209 	    goto error_return;
   1210 
   1211 	  if (bfd_bread (xverbuf, verhdr->sh_size, abfd) != verhdr->sh_size)
   1212 	    goto error_return;
   1213 	}
   1214 
   1215       /* Skip first symbol, which is a null dummy.  */
   1216       xver = xverbuf;
   1217       if (xver != NULL)
   1218 	++xver;
   1219       isymend = isymbuf + symcount;
   1220       for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
   1221 	{
   1222 	  memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
   1223 
   1224 	  sym->symbol.the_bfd = abfd;
   1225 	  sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
   1226 	  sym->symbol.value = isym->st_value;
   1227 
   1228 	  if (isym->st_shndx == SHN_UNDEF)
   1229 	    {
   1230 	      sym->symbol.section = bfd_und_section_ptr;
   1231 	    }
   1232 	  else if (isym->st_shndx == SHN_ABS)
   1233 	    {
   1234 	      sym->symbol.section = bfd_abs_section_ptr;
   1235 	    }
   1236 	  else if (isym->st_shndx == SHN_COMMON)
   1237 	    {
   1238 	      sym->symbol.section = bfd_com_section_ptr;
   1239 	      if ((abfd->flags & BFD_PLUGIN) != 0)
   1240 		{
   1241 		  asection *xc = bfd_get_section_by_name (abfd, "COMMON");
   1242 
   1243 		  if (xc == NULL)
   1244 		    {
   1245 		      flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
   1246 					| SEC_EXCLUDE);
   1247 		      xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
   1248 		      if (xc == NULL)
   1249 			goto error_return;
   1250 		    }
   1251 		  sym->symbol.section = xc;
   1252 		}
   1253 	      /* Elf puts the alignment into the `value' field, and
   1254 		 the size into the `size' field.  BFD wants to see the
   1255 		 size in the value field, and doesn't care (at the
   1256 		 moment) about the alignment.  */
   1257 	      sym->symbol.value = isym->st_size;
   1258 	    }
   1259 	  else
   1260 	    {
   1261 	      sym->symbol.section
   1262 		= bfd_section_from_elf_index (abfd, isym->st_shndx);
   1263 	      if (sym->symbol.section == NULL)
   1264 		{
   1265 		  /* This symbol is in a section for which we did not
   1266 		     create a BFD section.  Just use bfd_abs_section,
   1267 		     although it is wrong.  FIXME.  */
   1268 		  sym->symbol.section = bfd_abs_section_ptr;
   1269 		}
   1270 	    }
   1271 
   1272 	  /* If this is a relocatable file, then the symbol value is
   1273 	     already section relative.  */
   1274 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
   1275 	    sym->symbol.value -= sym->symbol.section->vma;
   1276 
   1277 	  switch (ELF_ST_BIND (isym->st_info))
   1278 	    {
   1279 	    case STB_LOCAL:
   1280 	      sym->symbol.flags |= BSF_LOCAL;
   1281 	      break;
   1282 	    case STB_GLOBAL:
   1283 	      if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
   1284 		sym->symbol.flags |= BSF_GLOBAL;
   1285 	      break;
   1286 	    case STB_WEAK:
   1287 	      sym->symbol.flags |= BSF_WEAK;
   1288 	      break;
   1289 	    case STB_GNU_UNIQUE:
   1290 	      sym->symbol.flags |= BSF_GNU_UNIQUE;
   1291 	      break;
   1292 	    }
   1293 
   1294 	  switch (ELF_ST_TYPE (isym->st_info))
   1295 	    {
   1296 	    case STT_SECTION:
   1297 	      sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
   1298 	      break;
   1299 	    case STT_FILE:
   1300 	      sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
   1301 	      break;
   1302 	    case STT_FUNC:
   1303 	      sym->symbol.flags |= BSF_FUNCTION;
   1304 	      break;
   1305 	    case STT_COMMON:
   1306 	      /* FIXME: Do we have to put the size field into the value field
   1307 		 as we do with symbols in SHN_COMMON sections (see above) ?  */
   1308 	      sym->symbol.flags |= BSF_ELF_COMMON;
   1309 	      /* Fall through.  */
   1310 	    case STT_OBJECT:
   1311 	      sym->symbol.flags |= BSF_OBJECT;
   1312 	      break;
   1313 	    case STT_TLS:
   1314 	      sym->symbol.flags |= BSF_THREAD_LOCAL;
   1315 	      break;
   1316 	    case STT_RELC:
   1317 	      sym->symbol.flags |= BSF_RELC;
   1318 	      break;
   1319 	    case STT_SRELC:
   1320 	      sym->symbol.flags |= BSF_SRELC;
   1321 	      break;
   1322 	    case STT_GNU_IFUNC:
   1323 	      sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
   1324 	      break;
   1325 	    }
   1326 
   1327 	  if (dynamic)
   1328 	    sym->symbol.flags |= BSF_DYNAMIC;
   1329 
   1330 	  if (xver != NULL)
   1331 	    {
   1332 	      Elf_Internal_Versym iversym;
   1333 
   1334 	      _bfd_elf_swap_versym_in (abfd, xver, &iversym);
   1335 	      sym->version = iversym.vs_vers;
   1336 	      xver++;
   1337 	    }
   1338 
   1339 	  /* Do some backend-specific processing on this symbol.  */
   1340 	  if (ebd->elf_backend_symbol_processing)
   1341 	    (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
   1342 	}
   1343     }
   1344 
   1345   /* Do some backend-specific processing on this symbol table.  */
   1346   if (ebd->elf_backend_symbol_table_processing)
   1347     (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
   1348 
   1349   /* We rely on the zalloc to clear out the final symbol entry.  */
   1350 
   1351   symcount = sym - symbase;
   1352 
   1353   /* Fill in the user's symbol pointer vector if needed.  */
   1354   if (symptrs)
   1355     {
   1356       long l = symcount;
   1357 
   1358       sym = symbase;
   1359       while (l-- > 0)
   1360 	{
   1361 	  *symptrs++ = &sym->symbol;
   1362 	  sym++;
   1363 	}
   1364       *symptrs = 0;		/* Final null pointer */
   1365     }
   1366 
   1367   if (xverbuf != NULL)
   1368     free (xverbuf);
   1369   if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
   1370     free (isymbuf);
   1371   return symcount;
   1372 
   1373 error_return:
   1374   if (xverbuf != NULL)
   1375     free (xverbuf);
   1376   if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
   1377     free (isymbuf);
   1378   return -1;
   1379 }
   1380 
   1381 /* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
   1382    them.  */
   1383 
   1384 static bfd_boolean
   1385 elf_slurp_reloc_table_from_section (bfd *abfd,
   1386 				    asection *asect,
   1387 				    Elf_Internal_Shdr *rel_hdr,
   1388 				    bfd_size_type reloc_count,
   1389 				    arelent *relents,
   1390 				    asymbol **symbols,
   1391 				    bfd_boolean dynamic)
   1392 {
   1393   const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
   1394   void *allocated = NULL;
   1395   bfd_byte *native_relocs;
   1396   arelent *relent;
   1397   unsigned int i;
   1398   int entsize;
   1399   unsigned int symcount;
   1400 
   1401   allocated = bfd_malloc (rel_hdr->sh_size);
   1402   if (allocated == NULL)
   1403     goto error_return;
   1404 
   1405   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
   1406       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
   1407 	  != rel_hdr->sh_size))
   1408     goto error_return;
   1409 
   1410   native_relocs = (bfd_byte *) allocated;
   1411 
   1412   entsize = rel_hdr->sh_entsize;
   1413   BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
   1414 	      || entsize == sizeof (Elf_External_Rela));
   1415 
   1416   if (dynamic)
   1417     symcount = bfd_get_dynamic_symcount (abfd);
   1418   else
   1419     symcount = bfd_get_symcount (abfd);
   1420 
   1421   for (i = 0, relent = relents;
   1422        i < reloc_count;
   1423        i++, relent++, native_relocs += entsize)
   1424     {
   1425       Elf_Internal_Rela rela;
   1426 
   1427       if (entsize == sizeof (Elf_External_Rela))
   1428 	elf_swap_reloca_in (abfd, native_relocs, &rela);
   1429       else
   1430 	elf_swap_reloc_in (abfd, native_relocs, &rela);
   1431 
   1432       /* The address of an ELF reloc is section relative for an object
   1433 	 file, and absolute for an executable file or shared library.
   1434 	 The address of a normal BFD reloc is always section relative,
   1435 	 and the address of a dynamic reloc is absolute..  */
   1436       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
   1437 	relent->address = rela.r_offset;
   1438       else
   1439 	relent->address = rela.r_offset - asect->vma;
   1440 
   1441       if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
   1442 	relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   1443       else if (ELF_R_SYM (rela.r_info) > symcount)
   1444 	{
   1445 	  (*_bfd_error_handler)
   1446 	    (_("%s(%s): relocation %d has invalid symbol index %ld"),
   1447 	     abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
   1448 	  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   1449 	}
   1450       else
   1451 	{
   1452 	  asymbol **ps;
   1453 
   1454 	  ps = symbols + ELF_R_SYM (rela.r_info) - 1;
   1455 
   1456 	  relent->sym_ptr_ptr = ps;
   1457 	}
   1458 
   1459       relent->addend = rela.r_addend;
   1460 
   1461       if ((entsize == sizeof (Elf_External_Rela)
   1462 	   && ebd->elf_info_to_howto != NULL)
   1463 	  || ebd->elf_info_to_howto_rel == NULL)
   1464 	(*ebd->elf_info_to_howto) (abfd, relent, &rela);
   1465       else
   1466 	(*ebd->elf_info_to_howto_rel) (abfd, relent, &rela);
   1467     }
   1468 
   1469   if (allocated != NULL)
   1470     free (allocated);
   1471 
   1472   return TRUE;
   1473 
   1474  error_return:
   1475   if (allocated != NULL)
   1476     free (allocated);
   1477   return FALSE;
   1478 }
   1479 
   1480 /* Read in and swap the external relocs.  */
   1481 
   1482 bfd_boolean
   1483 elf_slurp_reloc_table (bfd *abfd,
   1484 		       asection *asect,
   1485 		       asymbol **symbols,
   1486 		       bfd_boolean dynamic)
   1487 {
   1488   struct bfd_elf_section_data * const d = elf_section_data (asect);
   1489   Elf_Internal_Shdr *rel_hdr;
   1490   Elf_Internal_Shdr *rel_hdr2;
   1491   bfd_size_type reloc_count;
   1492   bfd_size_type reloc_count2;
   1493   arelent *relents;
   1494   bfd_size_type amt;
   1495 
   1496   if (asect->relocation != NULL)
   1497     return TRUE;
   1498 
   1499   if (! dynamic)
   1500     {
   1501       if ((asect->flags & SEC_RELOC) == 0
   1502 	  || asect->reloc_count == 0)
   1503 	return TRUE;
   1504 
   1505       rel_hdr = d->rel.hdr;
   1506       reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
   1507       rel_hdr2 = d->rela.hdr;
   1508       reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
   1509 
   1510       /* PR 17512: file: 0b4f81b7.  */
   1511       if (asect->reloc_count != reloc_count + reloc_count2)
   1512 	return FALSE;
   1513       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
   1514 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
   1515 
   1516     }
   1517   else
   1518     {
   1519       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
   1520 	 case because relocations against this section may use the
   1521 	 dynamic symbol table, and in that case bfd_section_from_shdr
   1522 	 in elf.c does not update the RELOC_COUNT.  */
   1523       if (asect->size == 0)
   1524 	return TRUE;
   1525 
   1526       rel_hdr = &d->this_hdr;
   1527       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
   1528       rel_hdr2 = NULL;
   1529       reloc_count2 = 0;
   1530     }
   1531 
   1532   amt = (reloc_count + reloc_count2) * sizeof (arelent);
   1533   relents = (arelent *) bfd_alloc (abfd, amt);
   1534   if (relents == NULL)
   1535     return FALSE;
   1536 
   1537   if (rel_hdr
   1538       && !elf_slurp_reloc_table_from_section (abfd, asect,
   1539 					      rel_hdr, reloc_count,
   1540 					      relents,
   1541 					      symbols, dynamic))
   1542     return FALSE;
   1543 
   1544   if (rel_hdr2
   1545       && !elf_slurp_reloc_table_from_section (abfd, asect,
   1546 					      rel_hdr2, reloc_count2,
   1547 					      relents + reloc_count,
   1548 					      symbols, dynamic))
   1549     return FALSE;
   1550 
   1551   asect->relocation = relents;
   1552   return TRUE;
   1553 }
   1554 
   1555 #if DEBUG & 2
   1556 static void
   1557 elf_debug_section (int num, Elf_Internal_Shdr *hdr)
   1558 {
   1559   fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
   1560 	   hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
   1561 	   (long) hdr);
   1562   fprintf (stderr,
   1563 	   "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
   1564 	   (long) hdr->sh_name,
   1565 	   (long) hdr->sh_type,
   1566 	   (long) hdr->sh_flags);
   1567   fprintf (stderr,
   1568 	   "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
   1569 	   (long) hdr->sh_addr,
   1570 	   (long) hdr->sh_offset,
   1571 	   (long) hdr->sh_size);
   1572   fprintf (stderr,
   1573 	   "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
   1574 	   (long) hdr->sh_link,
   1575 	   (long) hdr->sh_info,
   1576 	   (long) hdr->sh_addralign);
   1577   fprintf (stderr, "sh_entsize   = %ld\n",
   1578 	   (long) hdr->sh_entsize);
   1579   fflush (stderr);
   1580 }
   1581 #endif
   1582 
   1583 #if DEBUG & 1
   1584 static void
   1585 elf_debug_file (Elf_Internal_Ehdr *ehdrp)
   1586 {
   1587   fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
   1588   fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
   1589   fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
   1590   fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
   1591   fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
   1592   fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
   1593   fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
   1594 }
   1595 #endif
   1596 
   1597 /* Create a new BFD as if by bfd_openr.  Rather than opening a file,
   1599    reconstruct an ELF file by reading the segments out of remote
   1600    memory based on the ELF file header at EHDR_VMA and the ELF program
   1601    headers it points to.  If non-zero, SIZE is the known extent of the
   1602    object.  If not null, *LOADBASEP is filled in with the difference
   1603    between the VMAs from which the segments were read, and the VMAs
   1604    the file headers (and hence BFD's idea of each section's VMA) put
   1605    them at.
   1606 
   1607    The function TARGET_READ_MEMORY is called to copy LEN bytes from
   1608    the remote memory at target address VMA into the local buffer at
   1609    MYADDR; it should return zero on success or an `errno' code on
   1610    failure.  TEMPL must be a BFD for a target with the word size and
   1611    byte order found in the remote memory.  */
   1612 
   1613 bfd *
   1614 NAME(_bfd_elf,bfd_from_remote_memory)
   1615   (bfd *templ,
   1616    bfd_vma ehdr_vma,
   1617    bfd_size_type size,
   1618    bfd_vma *loadbasep,
   1619    int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
   1620 {
   1621   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
   1622   Elf_Internal_Ehdr i_ehdr;	/* Elf file header, internal form */
   1623   Elf_External_Phdr *x_phdrs;
   1624   Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
   1625   bfd *nbfd;
   1626   struct bfd_in_memory *bim;
   1627   bfd_byte *contents;
   1628   int err;
   1629   unsigned int i;
   1630   bfd_vma high_offset;
   1631   bfd_vma shdr_end;
   1632   bfd_vma loadbase;
   1633 
   1634   /* Read in the ELF header in external format.  */
   1635   err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
   1636   if (err)
   1637     {
   1638       bfd_set_error (bfd_error_system_call);
   1639       errno = err;
   1640       return NULL;
   1641     }
   1642 
   1643   /* Now check to see if we have a valid ELF file, and one that BFD can
   1644      make use of.  The magic number must match, the address size ('class')
   1645      and byte-swapping must match our XVEC entry.  */
   1646 
   1647   if (! elf_file_p (&x_ehdr)
   1648       || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
   1649       || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
   1650     {
   1651       bfd_set_error (bfd_error_wrong_format);
   1652       return NULL;
   1653     }
   1654 
   1655   /* Check that file's byte order matches xvec's */
   1656   switch (x_ehdr.e_ident[EI_DATA])
   1657     {
   1658     case ELFDATA2MSB:		/* Big-endian */
   1659       if (! bfd_header_big_endian (templ))
   1660 	{
   1661 	  bfd_set_error (bfd_error_wrong_format);
   1662 	  return NULL;
   1663 	}
   1664       break;
   1665     case ELFDATA2LSB:		/* Little-endian */
   1666       if (! bfd_header_little_endian (templ))
   1667 	{
   1668 	  bfd_set_error (bfd_error_wrong_format);
   1669 	  return NULL;
   1670 	}
   1671       break;
   1672     case ELFDATANONE:		/* No data encoding specified */
   1673     default:			/* Unknown data encoding specified */
   1674       bfd_set_error (bfd_error_wrong_format);
   1675       return NULL;
   1676     }
   1677 
   1678   elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
   1679 
   1680   /* The file header tells where to find the program headers.
   1681      These are what we use to actually choose what to read.  */
   1682 
   1683   if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
   1684     {
   1685       bfd_set_error (bfd_error_wrong_format);
   1686       return NULL;
   1687     }
   1688 
   1689   x_phdrs = (Elf_External_Phdr *)
   1690       bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
   1691   if (x_phdrs == NULL)
   1692     return NULL;
   1693   err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
   1694 			    i_ehdr.e_phnum * sizeof x_phdrs[0]);
   1695   if (err)
   1696     {
   1697       free (x_phdrs);
   1698       bfd_set_error (bfd_error_system_call);
   1699       errno = err;
   1700       return NULL;
   1701     }
   1702   i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
   1703 
   1704   high_offset = 0;
   1705   loadbase = 0;
   1706   first_phdr = NULL;
   1707   last_phdr = NULL;
   1708   for (i = 0; i < i_ehdr.e_phnum; ++i)
   1709     {
   1710       elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
   1711       if (i_phdrs[i].p_type == PT_LOAD)
   1712 	{
   1713 	  bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
   1714 
   1715 	  if (segment_end > high_offset)
   1716 	    {
   1717 	      high_offset = segment_end;
   1718 	      last_phdr = &i_phdrs[i];
   1719 	    }
   1720 
   1721 	  /* If this program header covers offset zero, where the file
   1722 	     header sits, then we can figure out the loadbase.  */
   1723 	  if (first_phdr == NULL)
   1724 	    {
   1725 	      bfd_vma p_offset = i_phdrs[i].p_offset;
   1726 	      bfd_vma p_vaddr = i_phdrs[i].p_vaddr;
   1727 
   1728 	      if (i_phdrs[i].p_align > 1)
   1729 		{
   1730 		  p_offset &= -i_phdrs[i].p_align;
   1731 		  p_vaddr &= -i_phdrs[i].p_align;
   1732 		}
   1733 	      if (p_offset == 0)
   1734 		{
   1735 		  loadbase = ehdr_vma - p_vaddr;
   1736 		  first_phdr = &i_phdrs[i];
   1737 		}
   1738 	    }
   1739 	}
   1740     }
   1741   if (high_offset == 0)
   1742     {
   1743       /* There were no PT_LOAD segments, so we don't have anything to read.  */
   1744       free (x_phdrs);
   1745       bfd_set_error (bfd_error_wrong_format);
   1746       return NULL;
   1747     }
   1748 
   1749   shdr_end = 0;
   1750   if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
   1751     {
   1752       shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
   1753 
   1754       if (last_phdr->p_filesz != last_phdr->p_memsz)
   1755 	{
   1756 	  /* If the last PT_LOAD header has a bss area then ld.so will
   1757 	     have cleared anything past p_filesz, zapping the section
   1758 	     headers.  */
   1759 	}
   1760       else if (size >= shdr_end)
   1761 	high_offset = size;
   1762       else
   1763 	{
   1764 	  bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
   1765 	  bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
   1766 
   1767 	  /* Assume we loaded full pages, allowing us to sometimes see
   1768 	     section headers.  */
   1769 	  if (page_size > 1 && shdr_end > segment_end)
   1770 	    {
   1771 	      bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
   1772 
   1773 	      if (page_end >= shdr_end)
   1774 		/* Whee, section headers covered.  */
   1775 		high_offset = shdr_end;
   1776 	    }
   1777 	}
   1778     }
   1779 
   1780   /* Now we know the size of the whole image we want read in.  */
   1781   contents = (bfd_byte *) bfd_zmalloc (high_offset);
   1782   if (contents == NULL)
   1783     {
   1784       free (x_phdrs);
   1785       return NULL;
   1786     }
   1787 
   1788   for (i = 0; i < i_ehdr.e_phnum; ++i)
   1789     if (i_phdrs[i].p_type == PT_LOAD)
   1790       {
   1791 	bfd_vma start = i_phdrs[i].p_offset;
   1792 	bfd_vma end = start + i_phdrs[i].p_filesz;
   1793 	bfd_vma vaddr = i_phdrs[i].p_vaddr;
   1794 
   1795 	/* Extend the beginning of the first pt_load to cover file
   1796 	   header and program headers, if we proved earlier that its
   1797 	   aligned offset is 0.  */
   1798 	if (first_phdr == &i_phdrs[i])
   1799 	  {
   1800 	    vaddr -= start;
   1801 	    start = 0;
   1802 	  }
   1803 	/* Extend the end of the last pt_load to cover section headers.  */
   1804 	if (last_phdr == &i_phdrs[i])
   1805 	  end = high_offset;
   1806 	err = target_read_memory (loadbase + vaddr,
   1807 				  contents + start, end - start);
   1808 	if (err)
   1809 	  {
   1810 	    free (x_phdrs);
   1811 	    free (contents);
   1812 	    bfd_set_error (bfd_error_system_call);
   1813 	    errno = err;
   1814 	    return NULL;
   1815 	  }
   1816       }
   1817   free (x_phdrs);
   1818 
   1819   /* If the segments visible in memory didn't include the section headers,
   1820      then clear them from the file header.  */
   1821   if (high_offset < shdr_end)
   1822     {
   1823       memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
   1824       memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
   1825       memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
   1826     }
   1827 
   1828   /* This will normally have been in the first PT_LOAD segment.  But it
   1829      conceivably could be missing, and we might have just changed it.  */
   1830   memcpy (contents, &x_ehdr, sizeof x_ehdr);
   1831 
   1832   /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
   1833   bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
   1834   if (bim == NULL)
   1835     {
   1836       free (contents);
   1837       return NULL;
   1838     }
   1839   nbfd = _bfd_new_bfd ();
   1840   if (nbfd == NULL)
   1841     {
   1842       free (bim);
   1843       free (contents);
   1844       return NULL;
   1845     }
   1846   nbfd->filename = xstrdup ("<in-memory>");
   1847   nbfd->xvec = templ->xvec;
   1848   bim->size = high_offset;
   1849   bim->buffer = contents;
   1850   nbfd->iostream = bim;
   1851   nbfd->flags = BFD_IN_MEMORY;
   1852   nbfd->iovec = &_bfd_memory_iovec;
   1853   nbfd->origin = 0;
   1854   nbfd->direction = read_direction;
   1855   nbfd->mtime = time (NULL);
   1856   nbfd->mtime_set = TRUE;
   1857 
   1858   if (loadbasep)
   1859     *loadbasep = loadbase;
   1860   return nbfd;
   1861 }
   1862 
   1863 /* Function for ELF_R_INFO.  */
   1864 
   1865 bfd_vma
   1866 NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
   1867 {
   1868   return ELF_R_INFO (sym, type);
   1869 }
   1870 
   1871 /* Function for ELF_R_SYM.  */
   1872 
   1873 bfd_vma
   1874 NAME(elf,r_sym) (bfd_vma r_info)
   1875 {
   1876   return ELF_R_SYM (r_info);
   1877 }
   1878 
   1879 #include "elfcore.h"
   1881 
   1882 /* Size-dependent data and functions.  */
   1884 const struct elf_size_info NAME(_bfd_elf,size_info) = {
   1885   sizeof (Elf_External_Ehdr),
   1886   sizeof (Elf_External_Phdr),
   1887   sizeof (Elf_External_Shdr),
   1888   sizeof (Elf_External_Rel),
   1889   sizeof (Elf_External_Rela),
   1890   sizeof (Elf_External_Sym),
   1891   sizeof (Elf_External_Dyn),
   1892   sizeof (Elf_External_Note),
   1893   4,
   1894   1,
   1895   ARCH_SIZE, LOG_FILE_ALIGN,
   1896   ELFCLASS, EV_CURRENT,
   1897   elf_write_out_phdrs,
   1898   elf_write_shdrs_and_ehdr,
   1899   elf_checksum_contents,
   1900   elf_write_relocs,
   1901   elf_swap_symbol_in,
   1902   elf_swap_symbol_out,
   1903   elf_slurp_reloc_table,
   1904   elf_slurp_symbol_table,
   1905   elf_swap_dyn_in,
   1906   elf_swap_dyn_out,
   1907   elf_swap_reloc_in,
   1908   elf_swap_reloc_out,
   1909   elf_swap_reloca_in,
   1910   elf_swap_reloca_out
   1911 };
   1912