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