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