Convert to ISO C90 formatting.
[binutils.git] / bfd / elfcode.h
blobfd0dacad5c6679f654cfad5b4fd1bfa0c61a6270
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.
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.
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.
17 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
33 /* Problems and other issues to resolve.
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.
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".
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)
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.
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.
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.
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"
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)
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)
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
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
148 /* Structure swapping routines */
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
165 /* Translate an ELF symbol in external format into an ELF symbol in internal
166 format. */
168 void
169 elf_swap_symbol_in (bfd *abfd,
170 const void *psrc,
171 const void *pshn,
172 Elf_Internal_Sym *dst)
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;
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)
189 if (shndx == NULL)
190 abort ();
191 dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
195 /* Translate an ELF symbol in internal format into an ELF symbol in external
196 format. */
198 void
199 elf_swap_symbol_out (bfd *abfd,
200 const Elf_Internal_Sym *src,
201 void *cdst,
202 void *shndx)
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)
214 if (shndx == NULL)
215 abort ();
216 H_PUT_32 (abfd, tmp, shndx);
217 tmp = SHN_XINDEX;
219 H_PUT_16 (abfd, tmp, dst->st_shndx);
222 /* Translate an ELF file header in external format into an ELF file header in
223 internal format. */
225 static void
226 elf_swap_ehdr_in (bfd *abfd,
227 const Elf_External_Ehdr *src,
228 Elf_Internal_Ehdr *dst)
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);
250 /* Translate an ELF file header in internal format into an ELF file header in
251 external format. */
253 static void
254 elf_swap_ehdr_out (bfd *abfd,
255 const Elf_Internal_Ehdr *src,
256 Elf_External_Ehdr *dst)
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);
286 /* Translate an ELF section header table entry in external format into an
287 ELF section header table entry in internal format. */
289 static void
290 elf_swap_shdr_in (bfd *abfd,
291 const Elf_External_Shdr *src,
292 Elf_Internal_Shdr *dst)
294 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
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;
313 /* Translate an ELF section header table entry in internal format into an
314 ELF section header table entry in external format. */
316 static void
317 elf_swap_shdr_out (bfd *abfd,
318 const Elf_Internal_Shdr *src,
319 Elf_External_Shdr *dst)
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);
334 /* Translate an ELF program header table entry in external format into an
335 ELF program header table entry in internal format. */
337 void
338 elf_swap_phdr_in (bfd *abfd,
339 const Elf_External_Phdr *src,
340 Elf_Internal_Phdr *dst)
342 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
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)
349 dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
350 dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
352 else
354 dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
355 dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
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);
362 void
363 elf_swap_phdr_out (bfd *abfd,
364 const Elf_Internal_Phdr *src,
365 Elf_External_Phdr *dst)
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);
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)
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;
390 void
391 elf_swap_reloca_in (bfd *abfd,
392 const bfd_byte *s,
393 Elf_Internal_Rela *dst)
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);
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)
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);
412 void
413 elf_swap_reloca_out (bfd *abfd,
414 const Elf_Internal_Rela *src,
415 bfd_byte *d)
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);
423 void
424 elf_swap_dyn_in (bfd *abfd,
425 const void *p,
426 Elf_Internal_Dyn *dst)
428 const Elf_External_Dyn *src = p;
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);
434 void
435 elf_swap_dyn_out (bfd *abfd,
436 const Elf_Internal_Dyn *src,
437 void *p)
439 Elf_External_Dyn *dst = p;
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);
445 /* ELF .o/exec file reading */
447 /* Begin processing a given object.
449 First we validate the file by reading in the ELF header and checking
450 the magic number. */
452 static inline bfd_boolean
453 elf_file_p (Elf_External_Ehdr *x_ehdrp)
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));
461 /* Check to see if the file associated with ABFD matches the target vector
462 that ABFD points to.
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. */
469 const bfd_target *
470 elf_object_p (bfd *abfd)
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;
483 preserve.marker = NULL;
485 /* Read in the ELF header in external format. */
487 if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
489 if (bfd_get_error () != bfd_error_system_call)
490 goto got_wrong_format_error;
491 else
492 goto got_no_match;
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). */
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;
506 /* Check that file's byte order matches xvec's */
507 switch (x_ehdr.e_ident[EI_DATA])
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;
522 if (!bfd_preserve_save (abfd, &preserve))
523 goto got_no_match;
525 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
526 the tdata pointer in the bfd. */
528 if (! (*abfd->xvec->_bfd_set_format[bfd_object]) (abfd))
529 goto got_no_match;
530 preserve.marker = elf_tdata (abfd);
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
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;
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;
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;
554 /* Further sanity check. */
555 if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_shnum != 0)
556 goto got_wrong_format_error;
558 ebd = get_elf_backend_data (abfd);
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))
568 const bfd_target * const *target_ptr;
570 if (ebd->elf_machine_code != EM_NONE)
571 goto got_wrong_format_error;
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++)
577 const struct elf_backend_data *back;
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))
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;
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;
600 if (i_ehdrp->e_phnum > 0)
601 abfd->flags |= D_PAGED;
603 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
605 /* It's OK if this fails for the generic target. */
606 if (ebd->elf_machine_code != EM_NONE)
607 goto got_no_match;
610 /* Remember the entry point specified in the ELF file header. */
611 bfd_set_start_address (abfd, i_ehdrp->e_entry);
613 if (i_ehdrp->e_shoff != 0)
615 /* Seek to the section header table in the file. */
616 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0)
617 goto got_no_match;
619 /* Read the first section header at index 0, and convert to internal
620 form. */
621 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
622 goto got_no_match;
623 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
625 /* If the section count is zero, the actual count is in the first
626 section header. */
627 if (i_ehdrp->e_shnum == SHN_UNDEF)
628 i_ehdrp->e_shnum = i_shdr.sh_size;
630 /* And similarly for the string table index. */
631 if (i_ehdrp->e_shstrndx == SHN_XINDEX)
632 i_ehdrp->e_shstrndx = i_shdr.sh_link;
635 /* Allocate space for a copy of the section header table in
636 internal form. */
637 if (i_ehdrp->e_shnum != 0)
639 Elf_Internal_Shdr *shdrp;
640 unsigned int num_sec;
642 amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
643 i_shdrp = bfd_alloc (abfd, amt);
644 if (!i_shdrp)
645 goto got_no_match;
646 num_sec = i_ehdrp->e_shnum;
647 if (num_sec > SHN_LORESERVE)
648 num_sec += SHN_HIRESERVE + 1 - SHN_LORESERVE;
649 elf_numsections (abfd) = num_sec;
650 amt = sizeof (i_shdrp) * num_sec;
651 elf_elfsections (abfd) = bfd_alloc (abfd, amt);
652 if (!elf_elfsections (abfd))
653 goto got_no_match;
655 memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
656 shdrp = i_shdrp;
657 shindex = 0;
658 if (num_sec > SHN_LORESERVE)
660 for ( ; shindex < SHN_LORESERVE; shindex++)
661 elf_elfsections (abfd)[shindex] = shdrp++;
662 for ( ; shindex < SHN_HIRESERVE + 1; shindex++)
663 elf_elfsections (abfd)[shindex] = i_shdrp;
665 for ( ; shindex < num_sec; shindex++)
666 elf_elfsections (abfd)[shindex] = shdrp++;
668 /* Read in the rest of the section header table and convert it
669 to internal form. */
670 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
672 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
673 goto got_no_match;
674 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
676 /* If the section is loaded, but not page aligned, clear
677 D_PAGED. */
678 if (i_shdrp[shindex].sh_size != 0
679 && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
680 && i_shdrp[shindex].sh_type != SHT_NOBITS
681 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
682 % ebd->minpagesize)
683 != 0))
684 abfd->flags &= ~D_PAGED;
688 /* Read in the program headers. */
689 if (i_ehdrp->e_phnum == 0)
690 elf_tdata (abfd)->phdr = NULL;
691 else
693 Elf_Internal_Phdr *i_phdr;
694 unsigned int i;
696 amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
697 elf_tdata (abfd)->phdr = bfd_alloc (abfd, amt);
698 if (elf_tdata (abfd)->phdr == NULL)
699 goto got_no_match;
700 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
701 goto got_no_match;
702 i_phdr = elf_tdata (abfd)->phdr;
703 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
705 Elf_External_Phdr x_phdr;
707 if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
708 goto got_no_match;
709 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
713 if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
715 unsigned int num_sec;
717 /* Once all of the section headers have been read and converted, we
718 can start processing them. Note that the first section header is
719 a dummy placeholder entry, so we ignore it. */
720 num_sec = elf_numsections (abfd);
721 for (shindex = 1; shindex < num_sec; shindex++)
723 if (! bfd_section_from_shdr (abfd, shindex))
724 goto got_no_match;
725 if (shindex == SHN_LORESERVE - 1)
726 shindex += SHN_HIRESERVE + 1 - SHN_LORESERVE;
729 /* Set up group pointers. */
730 if (! _bfd_elf_setup_group_pointers (abfd))
731 goto got_wrong_format_error;
734 /* Let the backend double check the format and override global
735 information. */
736 if (ebd->elf_backend_object_p)
738 if (! (*ebd->elf_backend_object_p) (abfd))
739 goto got_wrong_format_error;
742 /* If we have created any reloc sections that are associated with
743 debugging sections, mark the reloc sections as debugging as well. */
744 for (s = abfd->sections; s != NULL; s = s->next)
746 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
747 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
748 && elf_section_data (s)->this_hdr.sh_info > 0)
750 unsigned long targ_index;
751 asection *targ_sec;
753 targ_index = elf_section_data (s)->this_hdr.sh_info;
754 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
755 if (targ_sec != NULL
756 && (targ_sec->flags & SEC_DEBUGGING) != 0)
757 s->flags |= SEC_DEBUGGING;
761 bfd_preserve_finish (abfd, &preserve);
762 return abfd->xvec;
764 got_wrong_format_error:
765 /* There is way too much undoing of half-known state here. The caller,
766 bfd_check_format_matches, really shouldn't iterate on live bfd's to
767 check match/no-match like it does. We have to rely on that a call to
768 bfd_default_set_arch_mach with the previously known mach, undoes what
769 was done by the first bfd_default_set_arch_mach (with mach 0) here.
770 For this to work, only elf-data and the mach may be changed by the
771 target-specific elf_backend_object_p function. Note that saving the
772 whole bfd here and restoring it would be even worse; the first thing
773 you notice is that the cached bfd file position gets out of sync. */
774 bfd_set_error (bfd_error_wrong_format);
776 got_no_match:
777 if (preserve.marker != NULL)
778 bfd_preserve_restore (abfd, &preserve);
779 return NULL;
782 /* ELF .o/exec file writing */
784 /* Write out the relocs. */
786 void
787 elf_write_relocs (bfd *abfd, asection *sec, void *data)
789 bfd_boolean *failedp = data;
790 Elf_Internal_Shdr *rela_hdr;
791 bfd_vma addr_offset;
792 void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
793 size_t extsize;
794 bfd_byte *dst_rela;
795 unsigned int idx;
796 asymbol *last_sym;
797 int last_sym_idx;
799 /* If we have already failed, don't do anything. */
800 if (*failedp)
801 return;
803 if ((sec->flags & SEC_RELOC) == 0)
804 return;
806 /* The linker backend writes the relocs out itself, and sets the
807 reloc_count field to zero to inhibit writing them here. Also,
808 sometimes the SEC_RELOC flag gets set even when there aren't any
809 relocs. */
810 if (sec->reloc_count == 0)
811 return;
813 rela_hdr = &elf_section_data (sec)->rel_hdr;
815 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
816 rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
817 if (rela_hdr->contents == NULL)
819 *failedp = TRUE;
820 return;
823 /* Figure out whether the relocations are RELA or REL relocations. */
824 if (rela_hdr->sh_type == SHT_RELA)
826 swap_out = elf_swap_reloca_out;
827 extsize = sizeof (Elf_External_Rela);
829 else if (rela_hdr->sh_type == SHT_REL)
831 swap_out = elf_swap_reloc_out;
832 extsize = sizeof (Elf_External_Rel);
834 else
835 /* Every relocation section should be either an SHT_RELA or an
836 SHT_REL section. */
837 abort ();
839 /* The address of an ELF reloc is section relative for an object
840 file, and absolute for an executable file or shared library.
841 The address of a BFD reloc is always section relative. */
842 addr_offset = 0;
843 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
844 addr_offset = sec->vma;
846 /* orelocation has the data, reloc_count has the count... */
847 last_sym = 0;
848 last_sym_idx = 0;
849 dst_rela = rela_hdr->contents;
851 for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
853 Elf_Internal_Rela src_rela;
854 arelent *ptr;
855 asymbol *sym;
856 int n;
858 ptr = sec->orelocation[idx];
859 sym = *ptr->sym_ptr_ptr;
860 if (sym == last_sym)
861 n = last_sym_idx;
862 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
863 n = STN_UNDEF;
864 else
866 last_sym = sym;
867 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
868 if (n < 0)
870 *failedp = TRUE;
871 return;
873 last_sym_idx = n;
876 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
877 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
878 && ! _bfd_elf_validate_reloc (abfd, ptr))
880 *failedp = TRUE;
881 return;
884 src_rela.r_offset = ptr->address + addr_offset;
885 src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
886 src_rela.r_addend = ptr->addend;
887 (*swap_out) (abfd, &src_rela, dst_rela);
891 /* Write out the program headers. */
894 elf_write_out_phdrs (bfd *abfd,
895 const Elf_Internal_Phdr *phdr,
896 unsigned int count)
898 while (count--)
900 Elf_External_Phdr extphdr;
901 elf_swap_phdr_out (abfd, phdr, &extphdr);
902 if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
903 != sizeof (Elf_External_Phdr))
904 return -1;
905 phdr++;
907 return 0;
910 /* Write out the section headers and the ELF file header. */
912 bfd_boolean
913 elf_write_shdrs_and_ehdr (bfd *abfd)
915 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
916 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
917 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
918 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
919 unsigned int count;
920 bfd_size_type amt;
922 i_ehdrp = elf_elfheader (abfd);
923 i_shdrp = elf_elfsections (abfd);
925 /* swap the header before spitting it out... */
927 #if DEBUG & 1
928 elf_debug_file (i_ehdrp);
929 #endif
930 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
931 amt = sizeof (x_ehdr);
932 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
933 || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
934 return FALSE;
936 /* Some fields in the first section header handle overflow of ehdr
937 fields. */
938 if (i_ehdrp->e_shnum >= SHN_LORESERVE)
939 i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
940 if (i_ehdrp->e_shstrndx >= SHN_LORESERVE)
941 i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
943 /* at this point we've concocted all the ELF sections... */
944 amt = i_ehdrp->e_shnum;
945 amt *= sizeof (*x_shdrp);
946 x_shdrp = bfd_alloc (abfd, amt);
947 if (!x_shdrp)
948 return FALSE;
950 for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
952 #if DEBUG & 2
953 elf_debug_section (count, *i_shdrp);
954 #endif
955 elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
957 if (count == SHN_LORESERVE - 1)
958 i_shdrp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
960 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
961 || bfd_bwrite (x_shdrp, amt, abfd) != amt)
962 return FALSE;
964 /* need to dump the string table too... */
966 return TRUE;
969 long
970 elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
972 Elf_Internal_Shdr *hdr;
973 Elf_Internal_Shdr *verhdr;
974 unsigned long symcount; /* Number of external ELF symbols */
975 elf_symbol_type *sym; /* Pointer to current bfd symbol */
976 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
977 Elf_Internal_Sym *isym;
978 Elf_Internal_Sym *isymend;
979 Elf_Internal_Sym *isymbuf = NULL;
980 Elf_External_Versym *xver;
981 Elf_External_Versym *xverbuf = NULL;
982 const struct elf_backend_data *ebd;
983 bfd_size_type amt;
985 /* Read each raw ELF symbol, converting from external ELF form to
986 internal ELF form, and then using the information to create a
987 canonical bfd symbol table entry.
989 Note that we allocate the initial bfd canonical symbol buffer
990 based on a one-to-one mapping of the ELF symbols to canonical
991 symbols. We actually use all the ELF symbols, so there will be no
992 space left over at the end. When we have all the symbols, we
993 build the caller's pointer vector. */
995 if (! dynamic)
997 hdr = &elf_tdata (abfd)->symtab_hdr;
998 verhdr = NULL;
1000 else
1002 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1003 if (elf_dynversym (abfd) == 0)
1004 verhdr = NULL;
1005 else
1006 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1007 if ((elf_tdata (abfd)->dynverdef_section != 0
1008 && elf_tdata (abfd)->verdef == NULL)
1009 || (elf_tdata (abfd)->dynverref_section != 0
1010 && elf_tdata (abfd)->verref == NULL))
1012 if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
1013 return -1;
1017 ebd = get_elf_backend_data (abfd);
1018 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1019 if (symcount == 0)
1020 sym = symbase = NULL;
1021 else
1023 isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1024 NULL, NULL, NULL);
1025 if (isymbuf == NULL)
1026 return -1;
1028 amt = symcount;
1029 amt *= sizeof (elf_symbol_type);
1030 symbase = bfd_zalloc (abfd, amt);
1031 if (symbase == (elf_symbol_type *) NULL)
1032 goto error_return;
1034 /* Read the raw ELF version symbol information. */
1035 if (verhdr != NULL
1036 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1038 (*_bfd_error_handler)
1039 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1040 abfd->filename,
1041 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1042 symcount);
1044 /* Slurp in the symbols without the version information,
1045 since that is more helpful than just quitting. */
1046 verhdr = NULL;
1049 if (verhdr != NULL)
1051 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1052 goto error_return;
1054 xverbuf = bfd_malloc (verhdr->sh_size);
1055 if (xverbuf == NULL && verhdr->sh_size != 0)
1056 goto error_return;
1058 if (bfd_bread (xverbuf, verhdr->sh_size, abfd) != verhdr->sh_size)
1059 goto error_return;
1062 /* Skip first symbol, which is a null dummy. */
1063 xver = xverbuf;
1064 if (xver != NULL)
1065 ++xver;
1066 isymend = isymbuf + symcount;
1067 for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1069 memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1070 sym->symbol.the_bfd = abfd;
1072 sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym);
1074 sym->symbol.value = isym->st_value;
1076 if (isym->st_shndx == SHN_UNDEF)
1078 sym->symbol.section = bfd_und_section_ptr;
1080 else if (isym->st_shndx < SHN_LORESERVE
1081 || isym->st_shndx > SHN_HIRESERVE)
1083 sym->symbol.section = bfd_section_from_elf_index (abfd,
1084 isym->st_shndx);
1085 if (sym->symbol.section == NULL)
1087 /* This symbol is in a section for which we did not
1088 create a BFD section. Just use bfd_abs_section,
1089 although it is wrong. FIXME. */
1090 sym->symbol.section = bfd_abs_section_ptr;
1093 else if (isym->st_shndx == SHN_ABS)
1095 sym->symbol.section = bfd_abs_section_ptr;
1097 else if (isym->st_shndx == SHN_COMMON)
1099 sym->symbol.section = bfd_com_section_ptr;
1100 /* Elf puts the alignment into the `value' field, and
1101 the size into the `size' field. BFD wants to see the
1102 size in the value field, and doesn't care (at the
1103 moment) about the alignment. */
1104 sym->symbol.value = isym->st_size;
1106 else
1107 sym->symbol.section = bfd_abs_section_ptr;
1109 /* If this is a relocatable file, then the symbol value is
1110 already section relative. */
1111 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1112 sym->symbol.value -= sym->symbol.section->vma;
1114 switch (ELF_ST_BIND (isym->st_info))
1116 case STB_LOCAL:
1117 sym->symbol.flags |= BSF_LOCAL;
1118 break;
1119 case STB_GLOBAL:
1120 if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1121 sym->symbol.flags |= BSF_GLOBAL;
1122 break;
1123 case STB_WEAK:
1124 sym->symbol.flags |= BSF_WEAK;
1125 break;
1128 switch (ELF_ST_TYPE (isym->st_info))
1130 case STT_SECTION:
1131 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1132 break;
1133 case STT_FILE:
1134 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1135 break;
1136 case STT_FUNC:
1137 sym->symbol.flags |= BSF_FUNCTION;
1138 break;
1139 case STT_OBJECT:
1140 sym->symbol.flags |= BSF_OBJECT;
1141 break;
1142 case STT_TLS:
1143 sym->symbol.flags |= BSF_THREAD_LOCAL;
1144 break;
1147 if (dynamic)
1148 sym->symbol.flags |= BSF_DYNAMIC;
1150 if (xver != NULL)
1152 Elf_Internal_Versym iversym;
1154 _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1155 sym->version = iversym.vs_vers;
1156 xver++;
1159 /* Do some backend-specific processing on this symbol. */
1160 if (ebd->elf_backend_symbol_processing)
1161 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1165 /* Do some backend-specific processing on this symbol table. */
1166 if (ebd->elf_backend_symbol_table_processing)
1167 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1169 /* We rely on the zalloc to clear out the final symbol entry. */
1171 symcount = sym - symbase;
1173 /* Fill in the user's symbol pointer vector if needed. */
1174 if (symptrs)
1176 long l = symcount;
1178 sym = symbase;
1179 while (l-- > 0)
1181 *symptrs++ = &sym->symbol;
1182 sym++;
1184 *symptrs = 0; /* Final null pointer */
1187 if (xverbuf != NULL)
1188 free (xverbuf);
1189 if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1190 free (isymbuf);
1191 return symcount;
1193 error_return:
1194 if (xverbuf != NULL)
1195 free (xverbuf);
1196 if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1197 free (isymbuf);
1198 return -1;
1201 /* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
1202 them. */
1204 static bfd_boolean
1205 elf_slurp_reloc_table_from_section (bfd *abfd,
1206 asection *asect,
1207 Elf_Internal_Shdr *rel_hdr,
1208 bfd_size_type reloc_count,
1209 arelent *relents,
1210 asymbol **symbols,
1211 bfd_boolean dynamic)
1213 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1214 void *allocated = NULL;
1215 bfd_byte *native_relocs;
1216 arelent *relent;
1217 unsigned int i;
1218 int entsize;
1219 unsigned int symcount;
1221 allocated = bfd_malloc (rel_hdr->sh_size);
1222 if (allocated == NULL)
1223 goto error_return;
1225 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1226 || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
1227 != rel_hdr->sh_size))
1228 goto error_return;
1230 native_relocs = allocated;
1232 entsize = rel_hdr->sh_entsize;
1233 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1234 || entsize == sizeof (Elf_External_Rela));
1236 if (dynamic)
1237 symcount = bfd_get_dynamic_symcount (abfd);
1238 else
1239 symcount = bfd_get_symcount (abfd);
1241 for (i = 0, relent = relents;
1242 i < reloc_count;
1243 i++, relent++, native_relocs += entsize)
1245 Elf_Internal_Rela rela;
1247 if (entsize == sizeof (Elf_External_Rela))
1248 elf_swap_reloca_in (abfd, native_relocs, &rela);
1249 else
1250 elf_swap_reloc_in (abfd, native_relocs, &rela);
1252 /* The address of an ELF reloc is section relative for an object
1253 file, and absolute for an executable file or shared library.
1254 The address of a normal BFD reloc is always section relative,
1255 and the address of a dynamic reloc is absolute.. */
1256 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1257 relent->address = rela.r_offset;
1258 else
1259 relent->address = rela.r_offset - asect->vma;
1261 if (ELF_R_SYM (rela.r_info) == 0)
1262 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1263 else if (ELF_R_SYM (rela.r_info) > symcount)
1265 (*_bfd_error_handler)
1266 (_("%s(%s): relocation %d has invalid symbol index %ld"),
1267 abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
1268 relent->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
1270 else
1272 asymbol **ps, *s;
1274 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1275 s = *ps;
1277 relent->sym_ptr_ptr = ps;
1280 relent->addend = rela.r_addend;
1282 if ((entsize == sizeof (Elf_External_Rela)
1283 && ebd->elf_info_to_howto != NULL)
1284 || ebd->elf_info_to_howto_rel == NULL)
1285 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1286 else
1287 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rela);
1290 if (allocated != NULL)
1291 free (allocated);
1293 return TRUE;
1295 error_return:
1296 if (allocated != NULL)
1297 free (allocated);
1298 return FALSE;
1301 /* Read in and swap the external relocs. */
1303 bfd_boolean
1304 elf_slurp_reloc_table (bfd *abfd,
1305 asection *asect,
1306 asymbol **symbols,
1307 bfd_boolean dynamic)
1309 struct bfd_elf_section_data * const d = elf_section_data (asect);
1310 Elf_Internal_Shdr *rel_hdr;
1311 Elf_Internal_Shdr *rel_hdr2;
1312 bfd_size_type reloc_count;
1313 bfd_size_type reloc_count2;
1314 arelent *relents;
1315 bfd_size_type amt;
1317 if (asect->relocation != NULL)
1318 return TRUE;
1320 if (! dynamic)
1322 if ((asect->flags & SEC_RELOC) == 0
1323 || asect->reloc_count == 0)
1324 return TRUE;
1326 rel_hdr = &d->rel_hdr;
1327 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1328 rel_hdr2 = d->rel_hdr2;
1329 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
1331 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1332 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1333 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1336 else
1338 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1339 case because relocations against this section may use the
1340 dynamic symbol table, and in that case bfd_section_from_shdr
1341 in elf.c does not update the RELOC_COUNT. */
1342 if (asect->size == 0)
1343 return TRUE;
1345 rel_hdr = &d->this_hdr;
1346 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1347 rel_hdr2 = NULL;
1348 reloc_count2 = 0;
1351 amt = (reloc_count + reloc_count2) * sizeof (arelent);
1352 relents = bfd_alloc (abfd, amt);
1353 if (relents == NULL)
1354 return FALSE;
1356 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1357 rel_hdr, reloc_count,
1358 relents,
1359 symbols, dynamic))
1360 return FALSE;
1362 if (rel_hdr2
1363 && !elf_slurp_reloc_table_from_section (abfd, asect,
1364 rel_hdr2, reloc_count2,
1365 relents + reloc_count,
1366 symbols, dynamic))
1367 return FALSE;
1369 asect->relocation = relents;
1370 return TRUE;
1373 #ifdef DEBUG
1374 static void
1375 elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1377 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1378 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1379 (long) hdr);
1380 fprintf (stderr,
1381 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1382 (long) hdr->sh_name,
1383 (long) hdr->sh_type,
1384 (long) hdr->sh_flags);
1385 fprintf (stderr,
1386 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1387 (long) hdr->sh_addr,
1388 (long) hdr->sh_offset,
1389 (long) hdr->sh_size);
1390 fprintf (stderr,
1391 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1392 (long) hdr->sh_link,
1393 (long) hdr->sh_info,
1394 (long) hdr->sh_addralign);
1395 fprintf (stderr, "sh_entsize = %ld\n",
1396 (long) hdr->sh_entsize);
1397 fflush (stderr);
1400 static void
1401 elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1403 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1404 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1405 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1406 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1407 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1408 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1409 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1412 static char *
1413 elf_symbol_flags (flagword flags)
1415 static char buffer[1024];
1417 buffer[0] = '\0';
1418 if (flags & BSF_LOCAL)
1419 strcat (buffer, " local");
1421 if (flags & BSF_GLOBAL)
1422 strcat (buffer, " global");
1424 if (flags & BSF_DEBUGGING)
1425 strcat (buffer, " debug");
1427 if (flags & BSF_FUNCTION)
1428 strcat (buffer, " function");
1430 if (flags & BSF_KEEP)
1431 strcat (buffer, " keep");
1433 if (flags & BSF_KEEP_G)
1434 strcat (buffer, " keep_g");
1436 if (flags & BSF_WEAK)
1437 strcat (buffer, " weak");
1439 if (flags & BSF_SECTION_SYM)
1440 strcat (buffer, " section-sym");
1442 if (flags & BSF_OLD_COMMON)
1443 strcat (buffer, " old-common");
1445 if (flags & BSF_NOT_AT_END)
1446 strcat (buffer, " not-at-end");
1448 if (flags & BSF_CONSTRUCTOR)
1449 strcat (buffer, " constructor");
1451 if (flags & BSF_WARNING)
1452 strcat (buffer, " warning");
1454 if (flags & BSF_INDIRECT)
1455 strcat (buffer, " indirect");
1457 if (flags & BSF_FILE)
1458 strcat (buffer, " file");
1460 if (flags & DYNAMIC)
1461 strcat (buffer, " dynamic");
1463 if (flags & ~(BSF_LOCAL
1464 | BSF_GLOBAL
1465 | BSF_DEBUGGING
1466 | BSF_FUNCTION
1467 | BSF_KEEP
1468 | BSF_KEEP_G
1469 | BSF_WEAK
1470 | BSF_SECTION_SYM
1471 | BSF_OLD_COMMON
1472 | BSF_NOT_AT_END
1473 | BSF_CONSTRUCTOR
1474 | BSF_WARNING
1475 | BSF_INDIRECT
1476 | BSF_FILE
1477 | BSF_DYNAMIC))
1478 strcat (buffer, " unknown-bits");
1480 return buffer;
1482 #endif
1484 /* Create a new BFD as if by bfd_openr. Rather than opening a file,
1485 reconstruct an ELF file by reading the segments out of remote memory
1486 based on the ELF file header at EHDR_VMA and the ELF program headers it
1487 points to. If not null, *LOADBASEP is filled in with the difference
1488 between the VMAs from which the segments were read, and the VMAs the
1489 file headers (and hence BFD's idea of each section's VMA) put them at.
1491 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
1492 remote memory at target address VMA into the local buffer at MYADDR; it
1493 should return zero on success or an `errno' code on failure. TEMPL must
1494 be a BFD for a target with the word size and byte order found in the
1495 remote memory. */
1497 bfd *
1498 NAME(_bfd_elf,bfd_from_remote_memory)
1499 (bfd *templ,
1500 bfd_vma ehdr_vma,
1501 bfd_vma *loadbasep,
1502 int (*target_read_memory) (bfd_vma, bfd_byte *, int))
1504 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
1505 Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1506 Elf_External_Phdr *x_phdrs;
1507 Elf_Internal_Phdr *i_phdrs, *last_phdr;
1508 bfd *nbfd;
1509 struct bfd_in_memory *bim;
1510 int contents_size;
1511 bfd_byte *contents;
1512 int err;
1513 unsigned int i;
1514 bfd_vma loadbase;
1516 /* Read in the ELF header in external format. */
1517 err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1518 if (err)
1520 bfd_set_error (bfd_error_system_call);
1521 errno = err;
1522 return NULL;
1525 /* Now check to see if we have a valid ELF file, and one that BFD can
1526 make use of. The magic number must match, the address size ('class')
1527 and byte-swapping must match our XVEC entry. */
1529 if (! elf_file_p (&x_ehdr)
1530 || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1531 || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1533 bfd_set_error (bfd_error_wrong_format);
1534 return NULL;
1537 /* Check that file's byte order matches xvec's */
1538 switch (x_ehdr.e_ident[EI_DATA])
1540 case ELFDATA2MSB: /* Big-endian */
1541 if (! bfd_header_big_endian (templ))
1543 bfd_set_error (bfd_error_wrong_format);
1544 return NULL;
1546 break;
1547 case ELFDATA2LSB: /* Little-endian */
1548 if (! bfd_header_little_endian (templ))
1550 bfd_set_error (bfd_error_wrong_format);
1551 return NULL;
1553 break;
1554 case ELFDATANONE: /* No data encoding specified */
1555 default: /* Unknown data encoding specified */
1556 bfd_set_error (bfd_error_wrong_format);
1557 return NULL;
1560 elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1562 /* The file header tells where to find the program headers.
1563 These are what we use to actually choose what to read. */
1565 if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1567 bfd_set_error (bfd_error_wrong_format);
1568 return NULL;
1571 x_phdrs = bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
1572 if (x_phdrs == NULL)
1574 bfd_set_error (bfd_error_no_memory);
1575 return NULL;
1577 err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1578 i_ehdr.e_phnum * sizeof x_phdrs[0]);
1579 if (err)
1581 free (x_phdrs);
1582 bfd_set_error (bfd_error_system_call);
1583 errno = err;
1584 return NULL;
1586 i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1588 contents_size = 0;
1589 last_phdr = NULL;
1590 loadbase = ehdr_vma;
1591 for (i = 0; i < i_ehdr.e_phnum; ++i)
1593 elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1594 if (i_phdrs[i].p_type == PT_LOAD)
1596 bfd_vma segment_end;
1597 segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1598 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1599 if (segment_end > (bfd_vma) contents_size)
1600 contents_size = segment_end;
1602 if ((i_phdrs[i].p_offset & -i_phdrs[i].p_align) == 0)
1603 loadbase = ehdr_vma - (i_phdrs[i].p_vaddr & -i_phdrs[i].p_align);
1605 last_phdr = &i_phdrs[i];
1608 if (last_phdr == NULL)
1610 /* There were no PT_LOAD segments, so we don't have anything to read. */
1611 free (x_phdrs);
1612 bfd_set_error (bfd_error_wrong_format);
1613 return NULL;
1616 /* Trim the last segment so we don't bother with zeros in the last page
1617 that are off the end of the file. However, if the extra bit in that
1618 page includes the section headers, keep them. */
1619 if ((bfd_vma) contents_size > last_phdr->p_offset + last_phdr->p_filesz
1620 && (bfd_vma) contents_size >= (i_ehdr.e_shoff
1621 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1623 contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1624 if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1625 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1626 contents_size = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1628 else
1629 contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1631 /* Now we know the size of the whole image we want read in. */
1632 contents = bfd_zmalloc (contents_size);
1633 if (contents == NULL)
1635 free (x_phdrs);
1636 bfd_set_error (bfd_error_no_memory);
1637 return NULL;
1640 for (i = 0; i < i_ehdr.e_phnum; ++i)
1641 if (i_phdrs[i].p_type == PT_LOAD)
1643 bfd_vma start = i_phdrs[i].p_offset & -i_phdrs[i].p_align;
1644 bfd_vma end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1645 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1646 if (end > (bfd_vma) contents_size)
1647 end = contents_size;
1648 err = target_read_memory ((loadbase + i_phdrs[i].p_vaddr)
1649 & -i_phdrs[i].p_align,
1650 contents + start, end - start);
1651 if (err)
1653 free (x_phdrs);
1654 free (contents);
1655 bfd_set_error (bfd_error_system_call);
1656 errno = err;
1657 return NULL;
1660 free (x_phdrs);
1662 /* If the segments visible in memory didn't include the section headers,
1663 then clear them from the file header. */
1664 if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1665 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1667 memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1668 memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1669 memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1672 /* This will normally have been in the first PT_LOAD segment. But it
1673 conceivably could be missing, and we might have just changed it. */
1674 memcpy (contents, &x_ehdr, sizeof x_ehdr);
1676 /* Now we have a memory image of the ELF file contents. Make a BFD. */
1677 bim = bfd_malloc (sizeof (struct bfd_in_memory));
1678 if (bim == NULL)
1680 free (contents);
1681 bfd_set_error (bfd_error_no_memory);
1682 return NULL;
1684 nbfd = _bfd_new_bfd ();
1685 if (nbfd == NULL)
1687 free (bim);
1688 free (contents);
1689 bfd_set_error (bfd_error_no_memory);
1690 return NULL;
1692 nbfd->filename = "<in-memory>";
1693 nbfd->xvec = templ->xvec;
1694 bim->size = contents_size;
1695 bim->buffer = contents;
1696 nbfd->iostream = bim;
1697 nbfd->flags = BFD_IN_MEMORY;
1698 nbfd->direction = read_direction;
1699 nbfd->mtime = time (NULL);
1700 nbfd->mtime_set = TRUE;
1702 if (loadbasep)
1703 *loadbasep = loadbase;
1704 return nbfd;
1707 #include "elfcore.h"
1709 /* Size-dependent data and functions. */
1710 const struct elf_size_info NAME(_bfd_elf,size_info) = {
1711 sizeof (Elf_External_Ehdr),
1712 sizeof (Elf_External_Phdr),
1713 sizeof (Elf_External_Shdr),
1714 sizeof (Elf_External_Rel),
1715 sizeof (Elf_External_Rela),
1716 sizeof (Elf_External_Sym),
1717 sizeof (Elf_External_Dyn),
1718 sizeof (Elf_External_Note),
1721 ARCH_SIZE, LOG_FILE_ALIGN,
1722 ELFCLASS, EV_CURRENT,
1723 elf_write_out_phdrs,
1724 elf_write_shdrs_and_ehdr,
1725 elf_write_relocs,
1726 elf_swap_symbol_in,
1727 elf_swap_symbol_out,
1728 elf_slurp_reloc_table,
1729 elf_slurp_symbol_table,
1730 elf_swap_dyn_in,
1731 elf_swap_dyn_out,
1732 elf_swap_reloc_in,
1733 elf_swap_reloc_out,
1734 elf_swap_reloca_in,
1735 elf_swap_reloca_out