1 /* ELF executable support for BFD.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001 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
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
58 (3) ELF section symbols are handled rather sloppily now. This should
59 be cleaned up, and ELF section symbols reconciled with BFD section
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
69 #include "libiberty.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_get_symtab NAME(bfd_elf,get_symtab)
106 #define elf_canonicalize_dynamic_symtab \
107 NAME(bfd_elf,canonicalize_dynamic_symtab)
108 #define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol)
109 #define elf_get_symbol_info NAME(bfd_elf,get_symbol_info)
110 #define elf_get_lineno NAME(bfd_elf,get_lineno)
111 #define elf_set_arch_mach NAME(bfd_elf,set_arch_mach)
112 #define elf_find_nearest_line NAME(bfd_elf,find_nearest_line)
113 #define elf_sizeof_headers NAME(bfd_elf,sizeof_headers)
114 #define elf_set_section_contents NAME(bfd_elf,set_section_contents)
115 #define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto)
116 #define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel)
117 #define elf_find_section NAME(bfd_elf,find_section)
118 #define elf_bfd_link_add_symbols NAME(bfd_elf,bfd_link_add_symbols)
119 #define elf_add_dynamic_entry NAME(bfd_elf,add_dynamic_entry)
120 #define elf_write_shdrs_and_ehdr NAME(bfd_elf,write_shdrs_and_ehdr)
121 #define elf_write_out_phdrs NAME(bfd_elf,write_out_phdrs)
122 #define elf_write_relocs NAME(bfd_elf,write_relocs)
123 #define elf_slurp_reloc_table NAME(bfd_elf,slurp_reloc_table)
124 #define elf_link_create_dynamic_sections \
125 NAME(bfd_elf,link_create_dynamic_sections)
126 #define elf_bfd_discard_info NAME(bfd_elf,discard_info)
127 #define elf_reloc_symbol_deleted_p NAME(_bfd_elf,reloc_symbol_deleted_p)
128 #define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
129 #define elf_bfd_final_link NAME(bfd_elf,bfd_final_link)
130 #define elf_create_pointer_linker_section NAME(bfd_elf,create_pointer_linker_section)
131 #define elf_finish_pointer_linker_section NAME(bfd_elf,finish_pointer_linker_section)
132 #define elf_gc_sections NAME(_bfd_elf,gc_sections)
133 #define elf_gc_common_finalize_got_offsets \
134 NAME(_bfd_elf,gc_common_finalize_got_offsets)
135 #define elf_gc_common_final_link NAME(_bfd_elf,gc_common_final_link)
136 #define elf_gc_record_vtinherit NAME(_bfd_elf,gc_record_vtinherit)
137 #define elf_gc_record_vtentry NAME(_bfd_elf,gc_record_vtentry)
138 #define elf_link_record_local_dynamic_symbol \
139 NAME(_bfd_elf,link_record_local_dynamic_symbol)
142 #define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
143 #define ELF_R_SYM(X) ELF64_R_SYM(X)
144 #define ELF_R_TYPE(X) ELF64_R_TYPE(X)
145 #define ELFCLASS ELFCLASS64
147 #define LOG_FILE_ALIGN 3
150 #define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
151 #define ELF_R_SYM(X) ELF32_R_SYM(X)
152 #define ELF_R_TYPE(X) ELF32_R_TYPE(X)
153 #define ELFCLASS ELFCLASS32
155 #define LOG_FILE_ALIGN 2
158 /* Static functions */
160 static void elf_swap_ehdr_in
161 PARAMS ((bfd *, const Elf_External_Ehdr *, Elf_Internal_Ehdr *));
162 static void elf_swap_ehdr_out
163 PARAMS ((bfd *, const Elf_Internal_Ehdr *, Elf_External_Ehdr *));
164 static void elf_swap_shdr_in
165 PARAMS ((bfd *, const Elf_External_Shdr *, Elf_Internal_Shdr *));
166 static void elf_swap_shdr_out
167 PARAMS ((bfd *, const Elf_Internal_Shdr *, Elf_External_Shdr *));
169 #define elf_stringtab_init _bfd_elf_stringtab_init
171 #define section_from_elf_index bfd_section_from_elf_index
173 static boolean elf_slurp_reloc_table_from_section
174 PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type,
175 arelent *, asymbol **, boolean));
177 static boolean elf_file_p PARAMS ((Elf_External_Ehdr *));
180 static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *));
181 static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *));
182 static char *elf_symbol_flags PARAMS ((flagword));
185 /* Structure swapping routines */
187 /* Should perhaps use put_offset, put_word, etc. For now, the two versions
188 can be handled by explicitly specifying 32 bits or "the long type". */
190 #define H_PUT_WORD H_PUT_64
191 #define H_PUT_SIGNED_WORD H_PUT_S64
192 #define H_GET_WORD H_GET_64
193 #define H_GET_SIGNED_WORD H_GET_S64
196 #define H_PUT_WORD H_PUT_32
197 #define H_PUT_SIGNED_WORD H_PUT_S32
198 #define H_GET_WORD H_GET_32
199 #define H_GET_SIGNED_WORD H_GET_S32
202 /* Translate an ELF symbol in external format into an ELF symbol in internal
206 elf_swap_symbol_in (abfd, src, dst)
208 const Elf_External_Sym *src;
209 Elf_Internal_Sym *dst;
211 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
213 dst->st_name = H_GET_32 (abfd, src->st_name);
215 dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
217 dst->st_value = H_GET_WORD (abfd, src->st_value);
218 dst->st_size = H_GET_WORD (abfd, src->st_size);
219 dst->st_info = H_GET_8 (abfd, src->st_info);
220 dst->st_other = H_GET_8 (abfd, src->st_other);
221 dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
224 /* Translate an ELF symbol in internal format into an ELF symbol in external
228 elf_swap_symbol_out (abfd, src, cdst)
230 const Elf_Internal_Sym *src;
233 Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
234 H_PUT_32 (abfd, src->st_name, dst->st_name);
235 H_PUT_WORD (abfd, src->st_value, dst->st_value);
236 H_PUT_WORD (abfd, src->st_size, dst->st_size);
237 H_PUT_8 (abfd, src->st_info, dst->st_info);
238 H_PUT_8 (abfd, src->st_other, dst->st_other);
239 H_PUT_16 (abfd, src->st_shndx, dst->st_shndx);
242 /* Translate an ELF file header in external format into an ELF file header in
246 elf_swap_ehdr_in (abfd, src, dst)
248 const Elf_External_Ehdr *src;
249 Elf_Internal_Ehdr *dst;
251 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
253 dst->e_type = H_GET_16 (abfd, src->e_type);
254 dst->e_machine = H_GET_16 (abfd, src->e_machine);
255 dst->e_version = H_GET_32 (abfd, src->e_version);
257 dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
259 dst->e_entry = H_GET_WORD (abfd, src->e_entry);
260 dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
261 dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
262 dst->e_flags = H_GET_32 (abfd, src->e_flags);
263 dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
264 dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
265 dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
266 dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
267 dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
268 dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
271 /* Translate an ELF file header in internal format into an ELF file header in
275 elf_swap_ehdr_out (abfd, src, dst)
277 const Elf_Internal_Ehdr *src;
278 Elf_External_Ehdr *dst;
281 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
282 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
283 /* note that all elements of dst are *arrays of unsigned char* already... */
284 H_PUT_16 (abfd, src->e_type, dst->e_type);
285 H_PUT_16 (abfd, src->e_machine, dst->e_machine);
286 H_PUT_32 (abfd, src->e_version, dst->e_version);
288 H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
290 H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
291 H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
292 H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
293 H_PUT_32 (abfd, src->e_flags, dst->e_flags);
294 H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
295 H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
296 H_PUT_16 (abfd, src->e_phnum, dst->e_phnum);
297 H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
299 if (tmp >= SHN_LORESERVE)
301 H_PUT_16 (abfd, tmp, dst->e_shnum);
302 tmp = src->e_shstrndx;
303 if (tmp >= SHN_LORESERVE)
305 H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308 /* Translate an ELF section header table entry in external format into an
309 ELF section header table entry in internal format. */
312 elf_swap_shdr_in (abfd, src, dst)
314 const Elf_External_Shdr *src;
315 Elf_Internal_Shdr *dst;
317 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
319 dst->sh_name = H_GET_32 (abfd, src->sh_name);
320 dst->sh_type = H_GET_32 (abfd, src->sh_type);
321 dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
323 dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
325 dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
326 dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
327 dst->sh_size = H_GET_WORD (abfd, src->sh_size);
328 dst->sh_link = H_GET_32 (abfd, src->sh_link);
329 dst->sh_info = H_GET_32 (abfd, src->sh_info);
330 dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
331 dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
332 dst->bfd_section = NULL;
333 dst->contents = NULL;
336 /* Translate an ELF section header table entry in internal format into an
337 ELF section header table entry in external format. */
340 elf_swap_shdr_out (abfd, src, dst)
342 const Elf_Internal_Shdr *src;
343 Elf_External_Shdr *dst;
345 /* note that all elements of dst are *arrays of unsigned char* already... */
346 H_PUT_32 (abfd, src->sh_name, dst->sh_name);
347 H_PUT_32 (abfd, src->sh_type, dst->sh_type);
348 H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
349 H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
350 H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
351 H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
352 H_PUT_32 (abfd, src->sh_link, dst->sh_link);
353 H_PUT_32 (abfd, src->sh_info, dst->sh_info);
354 H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
355 H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
358 /* Translate an ELF program header table entry in external format into an
359 ELF program header table entry in internal format. */
362 elf_swap_phdr_in (abfd, src, dst)
364 const Elf_External_Phdr *src;
365 Elf_Internal_Phdr *dst;
367 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
369 dst->p_type = H_GET_32 (abfd, src->p_type);
370 dst->p_flags = H_GET_32 (abfd, src->p_flags);
371 dst->p_offset = H_GET_WORD (abfd, src->p_offset);
374 dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
375 dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
379 dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
380 dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
382 dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
383 dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
384 dst->p_align = H_GET_WORD (abfd, src->p_align);
388 elf_swap_phdr_out (abfd, src, dst)
390 const Elf_Internal_Phdr *src;
391 Elf_External_Phdr *dst;
393 /* note that all elements of dst are *arrays of unsigned char* already... */
394 H_PUT_32 (abfd, src->p_type, dst->p_type);
395 H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
396 H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
397 H_PUT_WORD (abfd, src->p_paddr, dst->p_paddr);
398 H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
399 H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
400 H_PUT_32 (abfd, src->p_flags, dst->p_flags);
401 H_PUT_WORD (abfd, src->p_align, dst->p_align);
404 /* Translate an ELF reloc from external format to internal format. */
406 elf_swap_reloc_in (abfd, src, dst)
408 const Elf_External_Rel *src;
409 Elf_Internal_Rel *dst;
411 dst->r_offset = H_GET_WORD (abfd, src->r_offset);
412 dst->r_info = H_GET_WORD (abfd, src->r_info);
416 elf_swap_reloca_in (abfd, src, dst)
418 const Elf_External_Rela *src;
419 Elf_Internal_Rela *dst;
421 dst->r_offset = H_GET_WORD (abfd, src->r_offset);
422 dst->r_info = H_GET_WORD (abfd, src->r_info);
423 dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
426 /* Translate an ELF reloc from internal format to external format. */
428 elf_swap_reloc_out (abfd, src, dst)
430 const Elf_Internal_Rel *src;
431 Elf_External_Rel *dst;
433 H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
434 H_PUT_WORD (abfd, src->r_info, dst->r_info);
438 elf_swap_reloca_out (abfd, src, dst)
440 const Elf_Internal_Rela *src;
441 Elf_External_Rela *dst;
443 H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
444 H_PUT_WORD (abfd, src->r_info, dst->r_info);
445 H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
449 elf_swap_dyn_in (abfd, p, dst)
452 Elf_Internal_Dyn *dst;
454 const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
456 dst->d_tag = H_GET_WORD (abfd, src->d_tag);
457 dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
461 elf_swap_dyn_out (abfd, src, p)
463 const Elf_Internal_Dyn *src;
466 Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
468 H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
469 H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
472 /* ELF .o/exec file reading */
474 /* Begin processing a given object.
476 First we validate the file by reading in the ELF header and checking
479 static INLINE boolean
481 Elf_External_Ehdr *x_ehdrp;
483 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
484 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
485 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
486 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
489 /* Check to see if the file associated with ABFD matches the target vector
492 Note that we may be called several times with the same ABFD, but different
493 target vectors, most of which will not match. We have to avoid leaving
494 any side effects in ABFD, or any data it points to (like tdata), if the
495 file does not match the target vector. */
501 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
502 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
503 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
504 Elf_Internal_Shdr i_shdr;
505 Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */
506 unsigned int shindex;
507 char *shstrtab; /* Internal copy of section header stringtab */
508 struct elf_backend_data *ebd;
509 struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd);
510 struct sec *preserved_sections = abfd->sections;
511 unsigned int preserved_section_count = abfd->section_count;
512 enum bfd_architecture previous_arch = bfd_get_arch (abfd);
513 unsigned long previous_mach = bfd_get_mach (abfd);
514 struct elf_obj_tdata *new_tdata = NULL;
518 /* Clear section information, since there might be a recognized bfd that
519 we now check if we can replace, and we don't want to append to it. */
520 abfd->sections = NULL;
521 abfd->section_count = 0;
523 /* Read in the ELF header in external format. */
525 if (bfd_bread ((PTR) & x_ehdr, (bfd_size_type) sizeof (x_ehdr), abfd)
528 if (bfd_get_error () != bfd_error_system_call)
529 goto got_wrong_format_error;
534 /* Now check to see if we have a valid ELF file, and one that BFD can
535 make use of. The magic number must match, the address size ('class')
536 and byte-swapping must match our XVEC entry, and it must have a
537 section header table (FIXME: See comments re sections at top of this
540 if ((elf_file_p (&x_ehdr) == false) ||
541 (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) ||
542 (x_ehdr.e_ident[EI_CLASS] != ELFCLASS))
543 goto got_wrong_format_error;
545 /* Check that file's byte order matches xvec's */
546 switch (x_ehdr.e_ident[EI_DATA])
548 case ELFDATA2MSB: /* Big-endian */
549 if (! bfd_header_big_endian (abfd))
550 goto got_wrong_format_error;
552 case ELFDATA2LSB: /* Little-endian */
553 if (! bfd_header_little_endian (abfd))
554 goto got_wrong_format_error;
556 case ELFDATANONE: /* No data encoding specified */
557 default: /* Unknown data encoding specified */
558 goto got_wrong_format_error;
561 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
562 the tdata pointer in the bfd. */
564 amt = sizeof (struct elf_obj_tdata);
565 new_tdata = (struct elf_obj_tdata *) bfd_zalloc (abfd, amt);
566 if (new_tdata == NULL)
568 elf_tdata (abfd) = new_tdata;
570 /* Now that we know the byte order, swap in the rest of the header */
571 i_ehdrp = elf_elfheader (abfd);
572 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
574 elf_debug_file (i_ehdrp);
577 /* Reject ET_CORE (header indicates core file, not object file) */
578 if (i_ehdrp->e_type == ET_CORE)
579 goto got_wrong_format_error;
581 /* If this is a relocatable file and there is no section header
582 table, then we're hosed. */
583 if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
584 goto got_wrong_format_error;
586 /* As a simple sanity check, verify that the what BFD thinks is the
587 size of each section header table entry actually matches the size
588 recorded in the file, but only if there are any sections. */
589 if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
590 goto got_wrong_format_error;
592 ebd = get_elf_backend_data (abfd);
594 /* Check that the ELF e_machine field matches what this particular
595 BFD format expects. */
596 if (ebd->elf_machine_code != i_ehdrp->e_machine
597 && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
598 && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
600 const bfd_target * const *target_ptr;
602 if (ebd->elf_machine_code != EM_NONE)
603 goto got_wrong_format_error;
605 /* This is the generic ELF target. Let it match any ELF target
606 for which we do not have a specific backend. */
607 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
609 struct elf_backend_data *back;
611 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
613 back = (struct elf_backend_data *) (*target_ptr)->backend_data;
614 if (back->elf_machine_code == i_ehdrp->e_machine
615 || (back->elf_machine_alt1 != 0
616 && back->elf_machine_alt1 == i_ehdrp->e_machine)
617 || (back->elf_machine_alt2 != 0
618 && back->elf_machine_alt2 == i_ehdrp->e_machine))
620 /* target_ptr is an ELF backend which matches this
621 object file, so reject the generic ELF target. */
622 goto got_wrong_format_error;
627 if (i_ehdrp->e_type == ET_EXEC)
628 abfd->flags |= EXEC_P;
629 else if (i_ehdrp->e_type == ET_DYN)
630 abfd->flags |= DYNAMIC;
632 if (i_ehdrp->e_phnum > 0)
633 abfd->flags |= D_PAGED;
635 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
637 /* It's OK if this fails for the generic target. */
638 if (ebd->elf_machine_code != EM_NONE)
642 /* Remember the entry point specified in the ELF file header. */
643 bfd_set_start_address (abfd, i_ehdrp->e_entry);
645 /* Seek to the section header table in the file. */
646 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0)
649 /* Read the first section header at index 0, and convert to internal
651 if (bfd_bread ((PTR) & x_shdr, (bfd_size_type) sizeof x_shdr, abfd)
654 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
656 /* If the section count is zero, the actual count is in the first
658 if (i_ehdrp->e_shnum == SHN_UNDEF)
659 i_ehdrp->e_shnum = i_shdr.sh_size;
661 /* And similarly for the string table index. */
662 if (i_ehdrp->e_shstrndx == SHN_XINDEX)
663 i_ehdrp->e_shstrndx = i_shdr.sh_link;
665 /* Allocate space for a copy of the section header table in
667 if (i_ehdrp->e_shnum != 0)
669 Elf_Internal_Shdr *shdrp;
671 amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
672 i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
675 amt = sizeof (i_shdrp) * i_ehdrp->e_shnum;
676 if (i_ehdrp->e_shnum > SHN_LORESERVE)
677 amt += sizeof (i_shdrp) * (SHN_HIRESERVE + 1 - SHN_LORESERVE);
678 elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
679 if (!elf_elfsections (abfd))
682 memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
685 if (i_ehdrp->e_shnum > SHN_LORESERVE)
687 for ( ; shindex < SHN_LORESERVE; shindex++)
688 elf_elfsections (abfd)[shindex] = shdrp++;
689 for ( ; shindex < SHN_HIRESERVE + 1; shindex++)
690 elf_elfsections (abfd)[shindex] = NULL;
692 for ( ; shindex < i_ehdrp->e_shnum; shindex++)
693 elf_elfsections (abfd)[shindex] = shdrp++;
696 /* Read in the rest of the section header table and convert it to
698 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
700 if (bfd_bread ((PTR) & x_shdr, (bfd_size_type) sizeof x_shdr, abfd)
703 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
705 /* If the section is loaded, but not page aligned, clear
707 if (i_shdrp[shindex].sh_size != 0
708 && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
709 && i_shdrp[shindex].sh_type != SHT_NOBITS
710 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
713 abfd->flags &= ~D_PAGED;
715 if (i_ehdrp->e_shstrndx)
717 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
721 /* Read in the program headers. */
722 if (i_ehdrp->e_phnum == 0)
723 elf_tdata (abfd)->phdr = NULL;
726 Elf_Internal_Phdr *i_phdr;
729 amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
730 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
731 if (elf_tdata (abfd)->phdr == NULL)
733 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
735 i_phdr = elf_tdata (abfd)->phdr;
736 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
738 Elf_External_Phdr x_phdr;
740 if (bfd_bread ((PTR) &x_phdr, (bfd_size_type) sizeof x_phdr, abfd)
743 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
747 /* Read in the string table containing the names of the sections. We
748 will need the base pointer to this table later. */
749 /* We read this inline now, so that we don't have to go through
750 bfd_section_from_shdr with it (since this particular strtab is
751 used to find all of the ELF section names.) */
753 if (i_ehdrp->e_shstrndx != 0)
755 shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
759 /* Once all of the section headers have been read and converted, we
760 can start processing them. Note that the first section header is
761 a dummy placeholder entry, so we ignore it. */
763 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
765 if (! bfd_section_from_shdr (abfd, shindex))
770 /* Let the backend double check the format and override global
772 if (ebd->elf_backend_object_p)
774 if ((*ebd->elf_backend_object_p) (abfd) == false)
775 goto got_wrong_format_error;
778 /* If we have created any reloc sections that are associated with
779 debugging sections, mark the reloc sections as debugging as well. */
780 for (s = abfd->sections; s != NULL; s = s->next)
782 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
783 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
784 && elf_section_data (s)->this_hdr.sh_info > 0)
786 unsigned long targ_index;
789 targ_index = elf_section_data (s)->this_hdr.sh_info;
790 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
792 && (targ_sec->flags & SEC_DEBUGGING) != 0)
793 s->flags |= SEC_DEBUGGING;
799 got_wrong_format_error:
800 /* There is way too much undoing of half-known state here. The caller,
801 bfd_check_format_matches, really shouldn't iterate on live bfd's to
802 check match/no-match like it does. We have to rely on that a call to
803 bfd_default_set_arch_mach with the previously known mach, undoes what
804 was done by the first bfd_default_set_arch_mach (with mach 0) here.
805 For this to work, only elf-data and the mach may be changed by the
806 target-specific elf_backend_object_p function. Note that saving the
807 whole bfd here and restoring it would be even worse; the first thing
808 you notice is that the cached bfd file position gets out of sync. */
809 bfd_default_set_arch_mach (abfd, previous_arch, previous_mach);
810 bfd_set_error (bfd_error_wrong_format);
812 if (new_tdata != NULL
813 && new_tdata->elf_sect_ptr != NULL)
814 bfd_release (abfd, new_tdata->elf_sect_ptr);
816 bfd_release (abfd, i_shdrp);
817 if (new_tdata != NULL)
818 bfd_release (abfd, new_tdata);
819 elf_tdata (abfd) = preserved_tdata;
820 abfd->sections = preserved_sections;
821 abfd->section_count = preserved_section_count;
825 /* ELF .o/exec file writing */
827 /* Write out the relocs. */
830 elf_write_relocs (abfd, sec, data)
835 boolean *failedp = (boolean *) data;
836 Elf_Internal_Shdr *rela_hdr;
837 Elf_External_Rela *outbound_relocas;
838 Elf_External_Rel *outbound_relocs;
841 asymbol *last_sym = 0;
842 int last_sym_idx = 0;
844 /* If we have already failed, don't do anything. */
848 if ((sec->flags & SEC_RELOC) == 0)
851 /* The linker backend writes the relocs out itself, and sets the
852 reloc_count field to zero to inhibit writing them here. Also,
853 sometimes the SEC_RELOC flag gets set even when there aren't any
855 if (sec->reloc_count == 0)
858 rela_hdr = &elf_section_data (sec)->rel_hdr;
860 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
861 rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
862 if (rela_hdr->contents == NULL)
868 /* Figure out whether the relocations are RELA or REL relocations. */
869 if (rela_hdr->sh_type == SHT_RELA)
871 else if (rela_hdr->sh_type == SHT_REL)
874 /* Every relocation section should be either an SHT_RELA or an
878 /* orelocation has the data, reloc_count has the count... */
881 outbound_relocas = (Elf_External_Rela *) rela_hdr->contents;
883 for (idx = 0; idx < sec->reloc_count; idx++)
885 Elf_Internal_Rela dst_rela;
886 Elf_External_Rela *src_rela;
891 ptr = sec->orelocation[idx];
892 src_rela = outbound_relocas + idx;
894 /* The address of an ELF reloc is section relative for an object
895 file, and absolute for an executable file or shared library.
896 The address of a BFD reloc is always section relative. */
897 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
898 dst_rela.r_offset = ptr->address;
900 dst_rela.r_offset = ptr->address + sec->vma;
902 sym = *ptr->sym_ptr_ptr;
905 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
910 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
919 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
920 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
921 && ! _bfd_elf_validate_reloc (abfd, ptr))
927 dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
929 dst_rela.r_addend = ptr->addend;
930 elf_swap_reloca_out (abfd, &dst_rela, src_rela);
934 /* REL relocations */
936 outbound_relocs = (Elf_External_Rel *) rela_hdr->contents;
938 for (idx = 0; idx < sec->reloc_count; idx++)
940 Elf_Internal_Rel dst_rel;
941 Elf_External_Rel *src_rel;
946 ptr = sec->orelocation[idx];
947 sym = *ptr->sym_ptr_ptr;
948 src_rel = outbound_relocs + idx;
950 /* The address of an ELF reloc is section relative for an object
951 file, and absolute for an executable file or shared library.
952 The address of a BFD reloc is always section relative. */
953 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
954 dst_rel.r_offset = ptr->address;
956 dst_rel.r_offset = ptr->address + sec->vma;
960 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
965 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
974 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
975 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
976 && ! _bfd_elf_validate_reloc (abfd, ptr))
982 dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type);
984 elf_swap_reloc_out (abfd, &dst_rel, src_rel);
989 /* Write out the program headers. */
992 elf_write_out_phdrs (abfd, phdr, count)
994 const Elf_Internal_Phdr *phdr;
999 Elf_External_Phdr extphdr;
1000 elf_swap_phdr_out (abfd, phdr, &extphdr);
1001 if (bfd_bwrite (&extphdr, (bfd_size_type) sizeof (Elf_External_Phdr),
1002 abfd) != sizeof (Elf_External_Phdr))
1009 /* Write out the section headers and the ELF file header. */
1012 elf_write_shdrs_and_ehdr (abfd)
1015 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
1016 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1017 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
1018 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
1022 i_ehdrp = elf_elfheader (abfd);
1023 i_shdrp = elf_elfsections (abfd);
1025 /* swap the header before spitting it out... */
1028 elf_debug_file (i_ehdrp);
1030 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1031 amt = sizeof (x_ehdr);
1032 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1033 || bfd_bwrite ((PTR) & x_ehdr, amt, abfd) != amt)
1036 /* Some fields in the first section header handle overflow of ehdr
1038 if (i_ehdrp->e_shnum >= SHN_LORESERVE)
1039 i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1040 if (i_ehdrp->e_shstrndx >= SHN_LORESERVE)
1041 i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1043 /* at this point we've concocted all the ELF sections... */
1044 amt = i_ehdrp->e_shnum;
1045 amt *= sizeof (*x_shdrp);
1046 x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1050 for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1053 elf_debug_section (count, *i_shdrp);
1055 elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1057 if (count == SHN_LORESERVE - 1)
1058 i_shdrp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
1060 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1061 || bfd_bwrite ((PTR) x_shdrp, amt, abfd) != amt)
1064 /* need to dump the string table too... */
1070 elf_slurp_symbol_table (abfd, symptrs, dynamic)
1072 asymbol **symptrs; /* Buffer for generated bfd symbols */
1075 Elf_Internal_Shdr *hdr;
1076 Elf_Internal_Shdr *verhdr;
1077 unsigned long symcount; /* Number of external ELF symbols */
1078 elf_symbol_type *sym; /* Pointer to current bfd symbol */
1079 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1080 Elf_Internal_Sym i_sym;
1081 Elf_External_Sym *x_symp = NULL;
1082 Elf_External_Versym *x_versymp = NULL;
1085 /* Read each raw ELF symbol, converting from external ELF form to
1086 internal ELF form, and then using the information to create a
1087 canonical bfd symbol table entry.
1089 Note that we allocate the initial bfd canonical symbol buffer
1090 based on a one-to-one mapping of the ELF symbols to canonical
1091 symbols. We actually use all the ELF symbols, so there will be no
1092 space left over at the end. When we have all the symbols, we
1093 build the caller's pointer vector. */
1097 hdr = &elf_tdata (abfd)->symtab_hdr;
1102 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1103 if (elf_dynversym (abfd) == 0)
1106 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1107 if ((elf_tdata (abfd)->dynverdef_section != 0
1108 && elf_tdata (abfd)->verdef == NULL)
1109 || (elf_tdata (abfd)->dynverref_section != 0
1110 && elf_tdata (abfd)->verref == NULL))
1112 if (! _bfd_elf_slurp_version_tables (abfd))
1117 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
1120 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1123 sym = symbase = NULL;
1128 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
1132 amt *= sizeof (elf_symbol_type);
1133 symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1134 if (symbase == (elf_symbol_type *) NULL)
1138 /* Temporarily allocate room for the raw ELF symbols. */
1140 amt *= sizeof (Elf_External_Sym);
1141 x_symp = (Elf_External_Sym *) bfd_malloc (amt);
1142 if (x_symp == NULL && symcount != 0)
1145 if (bfd_bread ((PTR) x_symp, amt, abfd) != amt)
1148 /* Read the raw ELF version symbol information. */
1151 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1153 (*_bfd_error_handler)
1154 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1156 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1159 /* Slurp in the symbols without the version information,
1160 since that is more helpful than just quitting. */
1166 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1169 x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1170 if (x_versymp == NULL && verhdr->sh_size != 0)
1173 if (bfd_bread ((PTR) x_versymp, verhdr->sh_size, abfd)
1178 /* Skip first symbol, which is a null dummy. */
1179 for (i = 1; i < symcount; i++)
1181 elf_swap_symbol_in (abfd, x_symp + i, &i_sym);
1182 memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
1183 #ifdef ELF_KEEP_EXTSYM
1184 memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym));
1186 sym->symbol.the_bfd = abfd;
1188 sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
1192 sym->symbol.value = i_sym.st_value;
1194 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE)
1196 sym->symbol.section = section_from_elf_index (abfd,
1198 if (sym->symbol.section == NULL)
1200 /* This symbol is in a section for which we did not
1201 create a BFD section. Just use bfd_abs_section,
1202 although it is wrong. FIXME. */
1203 sym->symbol.section = bfd_abs_section_ptr;
1206 else if (i_sym.st_shndx == SHN_ABS)
1208 sym->symbol.section = bfd_abs_section_ptr;
1210 else if (i_sym.st_shndx == SHN_COMMON)
1212 sym->symbol.section = bfd_com_section_ptr;
1213 /* Elf puts the alignment into the `value' field, and
1214 the size into the `size' field. BFD wants to see the
1215 size in the value field, and doesn't care (at the
1216 moment) about the alignment. */
1217 sym->symbol.value = i_sym.st_size;
1219 else if (i_sym.st_shndx == SHN_UNDEF)
1221 sym->symbol.section = bfd_und_section_ptr;
1224 sym->symbol.section = bfd_abs_section_ptr;
1226 /* If this is a relocateable file, then the symbol value is
1227 already section relative. */
1228 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1229 sym->symbol.value -= sym->symbol.section->vma;
1231 switch (ELF_ST_BIND (i_sym.st_info))
1234 sym->symbol.flags |= BSF_LOCAL;
1237 if (i_sym.st_shndx != SHN_UNDEF
1238 && i_sym.st_shndx != SHN_COMMON)
1239 sym->symbol.flags |= BSF_GLOBAL;
1242 sym->symbol.flags |= BSF_WEAK;
1246 switch (ELF_ST_TYPE (i_sym.st_info))
1249 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1252 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1255 sym->symbol.flags |= BSF_FUNCTION;
1258 sym->symbol.flags |= BSF_OBJECT;
1263 sym->symbol.flags |= BSF_DYNAMIC;
1265 if (x_versymp != NULL)
1267 Elf_Internal_Versym iversym;
1269 _bfd_elf_swap_versym_in (abfd, x_versymp + i, &iversym);
1270 sym->version = iversym.vs_vers;
1273 /* Do some backend-specific processing on this symbol. */
1275 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1276 if (ebd->elf_backend_symbol_processing)
1277 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1284 /* Do some backend-specific processing on this symbol table. */
1286 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1287 if (ebd->elf_backend_symbol_table_processing)
1288 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1291 /* We rely on the zalloc to clear out the final symbol entry. */
1293 symcount = sym - symbase;
1295 /* Fill in the user's symbol pointer vector if needed. */
1303 *symptrs++ = &sym->symbol;
1306 *symptrs = 0; /* Final null pointer */
1309 if (x_versymp != NULL)
1315 if (x_versymp != NULL)
1322 /* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
1326 elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
1327 relents, symbols, dynamic)
1330 Elf_Internal_Shdr *rel_hdr;
1331 bfd_size_type reloc_count;
1336 struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1337 PTR allocated = NULL;
1338 bfd_byte *native_relocs;
1343 allocated = (PTR) bfd_malloc (rel_hdr->sh_size);
1344 if (allocated == NULL)
1347 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1348 || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
1349 != rel_hdr->sh_size))
1352 native_relocs = (bfd_byte *) allocated;
1354 entsize = rel_hdr->sh_entsize;
1355 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1356 || entsize == sizeof (Elf_External_Rela));
1358 for (i = 0, relent = relents;
1360 i++, relent++, native_relocs += entsize)
1362 Elf_Internal_Rela rela;
1363 Elf_Internal_Rel rel;
1365 if (entsize == sizeof (Elf_External_Rela))
1366 elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela);
1369 elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel);
1370 rela.r_offset = rel.r_offset;
1371 rela.r_info = rel.r_info;
1375 /* The address of an ELF reloc is section relative for an object
1376 file, and absolute for an executable file or shared library.
1377 The address of a normal BFD reloc is always section relative,
1378 and the address of a dynamic reloc is absolute.. */
1379 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1380 relent->address = rela.r_offset;
1382 relent->address = rela.r_offset - asect->vma;
1384 if (ELF_R_SYM (rela.r_info) == 0)
1385 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1390 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1393 /* Canonicalize ELF section symbols. FIXME: Why? */
1394 if ((s->flags & BSF_SECTION_SYM) == 0)
1395 relent->sym_ptr_ptr = ps;
1397 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
1400 relent->addend = rela.r_addend;
1402 if (entsize == sizeof (Elf_External_Rela))
1403 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1405 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
1408 if (allocated != NULL)
1414 if (allocated != NULL)
1419 /* Read in and swap the external relocs. */
1422 elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
1428 struct bfd_elf_section_data * const d = elf_section_data (asect);
1429 Elf_Internal_Shdr *rel_hdr;
1430 Elf_Internal_Shdr *rel_hdr2;
1431 bfd_size_type reloc_count;
1432 bfd_size_type reloc_count2;
1436 if (asect->relocation != NULL)
1441 if ((asect->flags & SEC_RELOC) == 0
1442 || asect->reloc_count == 0)
1445 rel_hdr = &d->rel_hdr;
1446 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1447 rel_hdr2 = d->rel_hdr2;
1448 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
1450 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1451 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1452 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1457 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1458 case because relocations against this section may use the
1459 dynamic symbol table, and in that case bfd_section_from_shdr
1460 in elf.c does not update the RELOC_COUNT. */
1461 if (asect->_raw_size == 0)
1464 rel_hdr = &d->this_hdr;
1465 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1470 amt = (reloc_count + reloc_count2) * sizeof (arelent);
1471 relents = (arelent *) bfd_alloc (abfd, amt);
1472 if (relents == NULL)
1475 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1476 rel_hdr, reloc_count,
1482 && !elf_slurp_reloc_table_from_section (abfd, asect,
1483 rel_hdr2, reloc_count2,
1484 relents + reloc_count,
1488 asect->relocation = relents;
1494 elf_debug_section (num, hdr)
1496 Elf_Internal_Shdr *hdr;
1498 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1499 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1502 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1503 (long) hdr->sh_name,
1504 (long) hdr->sh_type,
1505 (long) hdr->sh_flags);
1507 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1508 (long) hdr->sh_addr,
1509 (long) hdr->sh_offset,
1510 (long) hdr->sh_size);
1512 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1513 (long) hdr->sh_link,
1514 (long) hdr->sh_info,
1515 (long) hdr->sh_addralign);
1516 fprintf (stderr, "sh_entsize = %ld\n",
1517 (long) hdr->sh_entsize);
1522 elf_debug_file (ehdrp)
1523 Elf_Internal_Ehdr *ehdrp;
1525 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1526 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1527 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1528 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1529 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1530 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1531 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1535 elf_symbol_flags (flags)
1538 static char buffer[1024];
1541 if (flags & BSF_LOCAL)
1542 strcat (buffer, " local");
1544 if (flags & BSF_GLOBAL)
1545 strcat (buffer, " global");
1547 if (flags & BSF_DEBUGGING)
1548 strcat (buffer, " debug");
1550 if (flags & BSF_FUNCTION)
1551 strcat (buffer, " function");
1553 if (flags & BSF_KEEP)
1554 strcat (buffer, " keep");
1556 if (flags & BSF_KEEP_G)
1557 strcat (buffer, " keep_g");
1559 if (flags & BSF_WEAK)
1560 strcat (buffer, " weak");
1562 if (flags & BSF_SECTION_SYM)
1563 strcat (buffer, " section-sym");
1565 if (flags & BSF_OLD_COMMON)
1566 strcat (buffer, " old-common");
1568 if (flags & BSF_NOT_AT_END)
1569 strcat (buffer, " not-at-end");
1571 if (flags & BSF_CONSTRUCTOR)
1572 strcat (buffer, " constructor");
1574 if (flags & BSF_WARNING)
1575 strcat (buffer, " warning");
1577 if (flags & BSF_INDIRECT)
1578 strcat (buffer, " indirect");
1580 if (flags & BSF_FILE)
1581 strcat (buffer, " file");
1583 if (flags & DYNAMIC)
1584 strcat (buffer, " dynamic");
1586 if (flags & ~(BSF_LOCAL
1601 strcat (buffer, " unknown-bits");
1607 #include "elfcore.h"
1608 #include "elflink.h"
1610 /* Size-dependent data and functions. */
1611 const struct elf_size_info NAME(_bfd_elf,size_info) = {
1612 sizeof (Elf_External_Ehdr),
1613 sizeof (Elf_External_Phdr),
1614 sizeof (Elf_External_Shdr),
1615 sizeof (Elf_External_Rel),
1616 sizeof (Elf_External_Rela),
1617 sizeof (Elf_External_Sym),
1618 sizeof (Elf_External_Dyn),
1619 sizeof (Elf_External_Note),
1622 ARCH_SIZE, FILE_ALIGN,
1623 ELFCLASS, EV_CURRENT,
1624 elf_write_out_phdrs,
1625 elf_write_shdrs_and_ehdr,
1627 elf_swap_symbol_out,
1628 elf_slurp_reloc_table,
1629 elf_slurp_symbol_table,