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