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