1 /* ELF executable support for BFD.
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software
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
73 /* Renaming structures, typedefs, macros and functions to be size-specific. */
74 #define Elf_External_Ehdr NAME(Elf,External_Ehdr)
75 #define Elf_External_Sym NAME(Elf,External_Sym)
76 #define Elf_External_Shdr NAME(Elf,External_Shdr)
77 #define Elf_External_Phdr NAME(Elf,External_Phdr)
78 #define Elf_External_Rel NAME(Elf,External_Rel)
79 #define Elf_External_Rela NAME(Elf,External_Rela)
80 #define Elf_External_Dyn NAME(Elf,External_Dyn)
82 #define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command)
83 #define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal)
84 #define elf_core_file_matches_executable_p \
85 NAME(bfd_elf,core_file_matches_executable_p)
86 #define elf_object_p NAME(bfd_elf,object_p)
87 #define elf_core_file_p NAME(bfd_elf,core_file_p)
88 #define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound)
89 #define elf_get_dynamic_symtab_upper_bound \
90 NAME(bfd_elf,get_dynamic_symtab_upper_bound)
91 #define elf_swap_reloc_in NAME(bfd_elf,swap_reloc_in)
92 #define elf_swap_reloca_in NAME(bfd_elf,swap_reloca_in)
93 #define elf_swap_reloc_out NAME(bfd_elf,swap_reloc_out)
94 #define elf_swap_reloca_out NAME(bfd_elf,swap_reloca_out)
95 #define elf_swap_symbol_in NAME(bfd_elf,swap_symbol_in)
96 #define elf_swap_symbol_out NAME(bfd_elf,swap_symbol_out)
97 #define elf_swap_phdr_in NAME(bfd_elf,swap_phdr_in)
98 #define elf_swap_phdr_out NAME(bfd_elf,swap_phdr_out)
99 #define elf_swap_dyn_in NAME(bfd_elf,swap_dyn_in)
100 #define elf_swap_dyn_out NAME(bfd_elf,swap_dyn_out)
101 #define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound)
102 #define elf_canonicalize_reloc NAME(bfd_elf,canonicalize_reloc)
103 #define elf_slurp_symbol_table NAME(bfd_elf,slurp_symbol_table)
104 #define elf_get_symtab NAME(bfd_elf,get_symtab)
105 #define elf_canonicalize_dynamic_symtab \
106 NAME(bfd_elf,canonicalize_dynamic_symtab)
107 #define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol)
108 #define elf_get_symbol_info NAME(bfd_elf,get_symbol_info)
109 #define elf_get_lineno NAME(bfd_elf,get_lineno)
110 #define elf_set_arch_mach NAME(bfd_elf,set_arch_mach)
111 #define elf_find_nearest_line NAME(bfd_elf,find_nearest_line)
112 #define elf_sizeof_headers NAME(bfd_elf,sizeof_headers)
113 #define elf_set_section_contents NAME(bfd_elf,set_section_contents)
114 #define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto)
115 #define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel)
116 #define elf_find_section NAME(bfd_elf,find_section)
117 #define elf_bfd_link_add_symbols NAME(bfd_elf,bfd_link_add_symbols)
118 #define elf_add_dynamic_entry NAME(bfd_elf,add_dynamic_entry)
119 #define elf_write_shdrs_and_ehdr NAME(bfd_elf,write_shdrs_and_ehdr)
120 #define elf_write_out_phdrs NAME(bfd_elf,write_out_phdrs)
121 #define elf_link_create_dynamic_sections \
122 NAME(bfd_elf,link_create_dynamic_sections)
123 #define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
124 #define elf_bfd_final_link NAME(bfd_elf,bfd_final_link)
125 #define elf_create_pointer_linker_section NAME(bfd_elf,create_pointer_linker_section)
126 #define elf_finish_pointer_linker_section NAME(bfd_elf,finish_pointer_linker_section)
127 #define elf_gc_sections NAME(_bfd_elf,gc_sections)
128 #define elf_gc_common_finalize_got_offsets \
129 NAME(_bfd_elf,gc_common_finalize_got_offsets)
130 #define elf_gc_common_final_link NAME(_bfd_elf,gc_common_final_link)
131 #define elf_gc_record_vtinherit NAME(_bfd_elf,gc_record_vtinherit)
132 #define elf_gc_record_vtentry NAME(_bfd_elf,gc_record_vtentry)
133 #define elf_link_record_local_dynamic_symbol \
134 NAME(_bfd_elf,link_record_local_dynamic_symbol)
137 #define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
138 #define ELF_R_SYM(X) ELF64_R_SYM(X)
139 #define ELF_R_TYPE(X) ELF64_R_TYPE(X)
140 #define ELFCLASS ELFCLASS64
142 #define LOG_FILE_ALIGN 3
145 #define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
146 #define ELF_R_SYM(X) ELF32_R_SYM(X)
147 #define ELF_R_TYPE(X) ELF32_R_TYPE(X)
148 #define ELFCLASS ELFCLASS32
150 #define LOG_FILE_ALIGN 2
153 /* Static functions */
155 static void elf_swap_ehdr_in
156 PARAMS ((bfd *, const Elf_External_Ehdr *, Elf_Internal_Ehdr *));
157 static void elf_swap_ehdr_out
158 PARAMS ((bfd *, const Elf_Internal_Ehdr *, Elf_External_Ehdr *));
159 static void elf_swap_shdr_in
160 PARAMS ((bfd *, const Elf_External_Shdr *, Elf_Internal_Shdr *));
161 static void elf_swap_shdr_out
162 PARAMS ((bfd *, const Elf_Internal_Shdr *, Elf_External_Shdr *));
164 #define elf_stringtab_init _bfd_elf_stringtab_init
166 #define section_from_elf_index bfd_section_from_elf_index
168 static boolean elf_slurp_reloc_table_from_section
169 PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type,
170 arelent *, asymbol **, boolean));
171 static boolean elf_slurp_reloc_table
172 PARAMS ((bfd *, asection *, asymbol **, boolean));
174 static void write_relocs PARAMS ((bfd *, asection *, PTR));
176 static boolean elf_file_p PARAMS ((Elf_External_Ehdr *));
179 static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *));
180 static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *));
181 static char *elf_symbol_flags PARAMS ((flagword));
184 /* Structure swapping routines */
186 /* Should perhaps use put_offset, put_word, etc. For now, the two versions
187 can be handled by explicitly specifying 32 bits or "the long type". */
189 #define put_word bfd_h_put_64
190 #define put_signed_word bfd_h_put_signed_64
191 #define get_word bfd_h_get_64
192 #define get_signed_word bfd_h_get_signed_64
195 #define put_word bfd_h_put_32
196 #define put_signed_word bfd_h_put_signed_32
197 #define get_word bfd_h_get_32
198 #define get_signed_word bfd_h_get_signed_32
201 /* Translate an ELF symbol in external format into an ELF symbol in internal
205 elf_swap_symbol_in (abfd, src, dst)
207 const Elf_External_Sym *src;
208 Elf_Internal_Sym *dst;
210 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
212 dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name);
214 dst->st_value = get_signed_word (abfd, (bfd_byte *) src->st_value);
216 dst->st_value = get_word (abfd, (bfd_byte *) src->st_value);
217 dst->st_size = get_word (abfd, (bfd_byte *) src->st_size);
218 dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info);
219 dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other);
220 dst->st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src->st_shndx);
223 /* Translate an ELF symbol in internal format into an ELF symbol in external
227 elf_swap_symbol_out (abfd, src, cdst)
229 const Elf_Internal_Sym *src;
232 Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
233 bfd_h_put_32 (abfd, src->st_name, dst->st_name);
234 put_word (abfd, src->st_value, dst->st_value);
235 put_word (abfd, src->st_size, dst->st_size);
236 bfd_h_put_8 (abfd, src->st_info, dst->st_info);
237 bfd_h_put_8 (abfd, src->st_other, dst->st_other);
238 bfd_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 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
252 dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type);
253 dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine);
254 dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version);
255 dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry);
256 dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff);
257 dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff);
258 dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags);
259 dst->e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_ehsize);
260 dst->e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phentsize);
261 dst->e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phnum);
262 dst->e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shentsize);
263 dst->e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shnum);
264 dst->e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shstrndx);
267 /* Translate an ELF file header in internal format into an ELF file header in
271 elf_swap_ehdr_out (abfd, src, dst)
273 const Elf_Internal_Ehdr *src;
274 Elf_External_Ehdr *dst;
276 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
277 /* note that all elements of dst are *arrays of unsigned char* already... */
278 bfd_h_put_16 (abfd, src->e_type, dst->e_type);
279 bfd_h_put_16 (abfd, src->e_machine, dst->e_machine);
280 bfd_h_put_32 (abfd, src->e_version, dst->e_version);
281 put_word (abfd, src->e_entry, dst->e_entry);
282 put_word (abfd, src->e_phoff, dst->e_phoff);
283 put_word (abfd, src->e_shoff, dst->e_shoff);
284 bfd_h_put_32 (abfd, src->e_flags, dst->e_flags);
285 bfd_h_put_16 (abfd, src->e_ehsize, dst->e_ehsize);
286 bfd_h_put_16 (abfd, src->e_phentsize, dst->e_phentsize);
287 bfd_h_put_16 (abfd, src->e_phnum, dst->e_phnum);
288 bfd_h_put_16 (abfd, src->e_shentsize, dst->e_shentsize);
289 bfd_h_put_16 (abfd, src->e_shnum, dst->e_shnum);
290 bfd_h_put_16 (abfd, src->e_shstrndx, dst->e_shstrndx);
294 /* Translate an ELF section header table entry in external format into an
295 ELF section header table entry in internal format. */
298 elf_swap_shdr_in (abfd, src, dst)
300 const Elf_External_Shdr *src;
301 Elf_Internal_Shdr *dst;
303 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
305 dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name);
306 dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type);
307 dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags);
309 dst->sh_addr = get_signed_word (abfd, (bfd_byte *) src->sh_addr);
311 dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr);
312 dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset);
313 dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size);
314 dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link);
315 dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info);
316 dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign);
317 dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize);
318 dst->bfd_section = NULL;
319 dst->contents = NULL;
322 /* Translate an ELF section header table entry in internal format into an
323 ELF section header table entry in external format. */
326 elf_swap_shdr_out (abfd, src, dst)
328 const Elf_Internal_Shdr *src;
329 Elf_External_Shdr *dst;
331 /* note that all elements of dst are *arrays of unsigned char* already... */
332 bfd_h_put_32 (abfd, src->sh_name, dst->sh_name);
333 bfd_h_put_32 (abfd, src->sh_type, dst->sh_type);
334 put_word (abfd, src->sh_flags, dst->sh_flags);
335 put_word (abfd, src->sh_addr, dst->sh_addr);
336 put_word (abfd, src->sh_offset, dst->sh_offset);
337 put_word (abfd, src->sh_size, dst->sh_size);
338 bfd_h_put_32 (abfd, src->sh_link, dst->sh_link);
339 bfd_h_put_32 (abfd, src->sh_info, dst->sh_info);
340 put_word (abfd, src->sh_addralign, dst->sh_addralign);
341 put_word (abfd, src->sh_entsize, dst->sh_entsize);
345 /* Translate an ELF program header table entry in external format into an
346 ELF program header table entry in internal format. */
349 elf_swap_phdr_in (abfd, src, dst)
351 const Elf_External_Phdr *src;
352 Elf_Internal_Phdr *dst;
354 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
356 dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type);
357 dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags);
358 dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset);
361 dst->p_vaddr = get_signed_word (abfd, (bfd_byte *) src->p_vaddr);
362 dst->p_paddr = get_signed_word (abfd, (bfd_byte *) src->p_paddr);
366 dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr);
367 dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr);
369 dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz);
370 dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz);
371 dst->p_align = get_word (abfd, (bfd_byte *) src->p_align);
375 elf_swap_phdr_out (abfd, src, dst)
377 const Elf_Internal_Phdr *src;
378 Elf_External_Phdr *dst;
380 /* note that all elements of dst are *arrays of unsigned char* already... */
381 bfd_h_put_32 (abfd, src->p_type, dst->p_type);
382 put_word (abfd, src->p_offset, dst->p_offset);
383 put_word (abfd, src->p_vaddr, dst->p_vaddr);
384 put_word (abfd, src->p_paddr, dst->p_paddr);
385 put_word (abfd, src->p_filesz, dst->p_filesz);
386 put_word (abfd, src->p_memsz, dst->p_memsz);
387 bfd_h_put_32 (abfd, src->p_flags, dst->p_flags);
388 put_word (abfd, src->p_align, dst->p_align);
391 /* Translate an ELF reloc from external format to internal format. */
393 elf_swap_reloc_in (abfd, src, dst)
395 const Elf_External_Rel *src;
396 Elf_Internal_Rel *dst;
398 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
399 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
403 elf_swap_reloca_in (abfd, src, dst)
405 const Elf_External_Rela *src;
406 Elf_Internal_Rela *dst;
408 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
409 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
410 dst->r_addend = get_signed_word (abfd, (bfd_byte *) src->r_addend);
413 /* Translate an ELF reloc from internal format to external format. */
415 elf_swap_reloc_out (abfd, src, dst)
417 const Elf_Internal_Rel *src;
418 Elf_External_Rel *dst;
420 put_word (abfd, src->r_offset, dst->r_offset);
421 put_word (abfd, src->r_info, dst->r_info);
425 elf_swap_reloca_out (abfd, src, dst)
427 const Elf_Internal_Rela *src;
428 Elf_External_Rela *dst;
430 put_word (abfd, src->r_offset, dst->r_offset);
431 put_word (abfd, src->r_info, dst->r_info);
432 put_signed_word (abfd, src->r_addend, dst->r_addend);
436 elf_swap_dyn_in (abfd, p, dst)
439 Elf_Internal_Dyn *dst;
441 const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
443 dst->d_tag = get_word (abfd, src->d_tag);
444 dst->d_un.d_val = get_word (abfd, src->d_un.d_val);
448 elf_swap_dyn_out (abfd, src, p)
450 const Elf_Internal_Dyn *src;
453 Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
455 put_word (abfd, src->d_tag, dst->d_tag);
456 put_word (abfd, src->d_un.d_val, dst->d_un.d_val);
459 /* ELF .o/exec file reading */
462 /* Begin processing a given object.
464 First we validate the file by reading in the ELF header and checking
467 static INLINE boolean
469 Elf_External_Ehdr *x_ehdrp;
471 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
472 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
473 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
474 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
477 /* Check to see if the file associated with ABFD matches the target vector
480 Note that we may be called several times with the same ABFD, but different
481 target vectors, most of which will not match. We have to avoid leaving
482 any side effects in ABFD, or any data it points to (like tdata), if the
483 file does not match the target vector. */
489 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
490 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
491 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
492 Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */
493 unsigned int shindex;
494 char *shstrtab; /* Internal copy of section header stringtab */
495 struct elf_backend_data *ebd;
496 struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd);
497 struct elf_obj_tdata *new_tdata = NULL;
500 /* Read in the ELF header in external format. */
502 if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
504 if (bfd_get_error () != bfd_error_system_call)
505 goto got_wrong_format_error;
510 /* Now check to see if we have a valid ELF file, and one that BFD can
511 make use of. The magic number must match, the address size ('class')
512 and byte-swapping must match our XVEC entry, and it must have a
513 section header table (FIXME: See comments re sections at top of this
516 if ((elf_file_p (&x_ehdr) == false) ||
517 (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) ||
518 (x_ehdr.e_ident[EI_CLASS] != ELFCLASS))
519 goto got_wrong_format_error;
521 /* Check that file's byte order matches xvec's */
522 switch (x_ehdr.e_ident[EI_DATA])
524 case ELFDATA2MSB: /* Big-endian */
525 if (! bfd_header_big_endian (abfd))
526 goto got_wrong_format_error;
528 case ELFDATA2LSB: /* Little-endian */
529 if (! bfd_header_little_endian (abfd))
530 goto got_wrong_format_error;
532 case ELFDATANONE: /* No data encoding specified */
533 default: /* Unknown data encoding specified */
534 goto got_wrong_format_error;
537 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
538 the tdata pointer in the bfd. */
540 new_tdata = ((struct elf_obj_tdata *)
541 bfd_zalloc (abfd, sizeof (struct elf_obj_tdata)));
542 if (new_tdata == NULL)
544 elf_tdata (abfd) = new_tdata;
546 /* Now that we know the byte order, swap in the rest of the header */
547 i_ehdrp = elf_elfheader (abfd);
548 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
550 elf_debug_file (i_ehdrp);
553 /* Reject ET_CORE (header indicates core file, not object file) */
554 if (i_ehdrp->e_type == ET_CORE)
555 goto got_wrong_format_error;
557 /* If there is no section header table, we're hosed. */
558 if (i_ehdrp->e_shoff == 0)
559 goto got_wrong_format_error;
561 /* As a simple sanity check, verify that the what BFD thinks is the
562 size of each section header table entry actually matches the size
563 recorded in the file. */
564 if (i_ehdrp->e_shentsize != sizeof (x_shdr))
565 goto got_wrong_format_error;
567 ebd = get_elf_backend_data (abfd);
569 /* Check that the ELF e_machine field matches what this particular
570 BFD format expects. */
571 if (ebd->elf_machine_code != i_ehdrp->e_machine
572 && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
573 && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
575 const bfd_target * const *target_ptr;
577 if (ebd->elf_machine_code != EM_NONE)
578 goto got_wrong_format_error;
580 /* This is the generic ELF target. Let it match any ELF target
581 for which we do not have a specific backend. */
582 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
584 struct elf_backend_data *back;
586 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
588 back = (struct elf_backend_data *) (*target_ptr)->backend_data;
589 if (back->elf_machine_code == i_ehdrp->e_machine
590 || (back->elf_machine_alt1 != 0
591 && back->elf_machine_alt1 == i_ehdrp->e_machine)
592 || (back->elf_machine_alt2 != 0
593 && back->elf_machine_alt2 == i_ehdrp->e_machine))
595 /* target_ptr is an ELF backend which matches this
596 object file, so reject the generic ELF target. */
597 goto got_wrong_format_error;
602 if (i_ehdrp->e_type == ET_EXEC)
603 abfd->flags |= EXEC_P;
604 else if (i_ehdrp->e_type == ET_DYN)
605 abfd->flags |= DYNAMIC;
607 if (i_ehdrp->e_phnum > 0)
608 abfd->flags |= D_PAGED;
610 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
612 /* It's OK if this fails for the generic target. */
613 if (ebd->elf_machine_code != EM_NONE)
617 /* Remember the entry point specified in the ELF file header. */
618 bfd_get_start_address (abfd) = i_ehdrp->e_entry;
620 /* Allocate space for a copy of the section header table in
621 internal form, seek to the section header table in the file,
622 read it in, and convert it to internal form. */
623 i_shdrp = ((Elf_Internal_Shdr *)
624 bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
625 elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
627 sizeof (i_shdrp) * i_ehdrp->e_shnum));
628 if (!i_shdrp || !elf_elfsections (abfd))
630 if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0)
632 for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++)
634 if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr))
636 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
637 elf_elfsections (abfd)[shindex] = i_shdrp + shindex;
639 /* If the section is loaded, but not page aligned, clear
641 if ((i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
642 && i_shdrp[shindex].sh_type != SHT_NOBITS
643 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
646 abfd->flags &= ~D_PAGED;
648 if (i_ehdrp->e_shstrndx)
650 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
654 /* Read in the program headers. */
655 if (i_ehdrp->e_phnum == 0)
656 elf_tdata (abfd)->phdr = NULL;
659 Elf_Internal_Phdr *i_phdr;
662 elf_tdata (abfd)->phdr = ((Elf_Internal_Phdr *)
665 * sizeof (Elf_Internal_Phdr))));
666 if (elf_tdata (abfd)->phdr == NULL)
668 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
670 i_phdr = elf_tdata (abfd)->phdr;
671 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
673 Elf_External_Phdr x_phdr;
675 if (bfd_read ((PTR) &x_phdr, sizeof x_phdr, 1, abfd)
678 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
682 /* Read in the string table containing the names of the sections. We
683 will need the base pointer to this table later. */
684 /* We read this inline now, so that we don't have to go through
685 bfd_section_from_shdr with it (since this particular strtab is
686 used to find all of the ELF section names.) */
688 shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
692 /* Once all of the section headers have been read and converted, we
693 can start processing them. Note that the first section header is
694 a dummy placeholder entry, so we ignore it. */
696 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
698 if (! bfd_section_from_shdr (abfd, shindex))
702 /* Let the backend double check the format and override global
704 if (ebd->elf_backend_object_p)
706 if ((*ebd->elf_backend_object_p) (abfd) == false)
707 goto got_wrong_format_error;
710 /* If we have created any reloc sections that are associated with
711 debugging sections, mark the reloc sections as debugging as well. */
712 for (s = abfd->sections; s != NULL; s = s->next)
714 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
715 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
716 && elf_section_data (s)->this_hdr.sh_info > 0)
718 unsigned long targ_index;
721 targ_index = elf_section_data (s)->this_hdr.sh_info;
722 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
724 && (targ_sec->flags & SEC_DEBUGGING) != 0)
725 s->flags |= SEC_DEBUGGING;
731 got_wrong_format_error:
732 bfd_set_error (bfd_error_wrong_format);
734 if (new_tdata != NULL
735 && new_tdata->elf_sect_ptr != NULL)
736 bfd_release (abfd, new_tdata->elf_sect_ptr);
738 bfd_release (abfd, i_shdrp);
739 if (new_tdata != NULL)
740 bfd_release (abfd, new_tdata);
741 elf_tdata (abfd) = preserved_tdata;
745 /* ELF .o/exec file writing */
747 /* Write out the relocs. */
750 write_relocs (abfd, sec, data)
755 boolean *failedp = (boolean *) data;
756 Elf_Internal_Shdr *rela_hdr;
757 Elf_External_Rela *outbound_relocas;
758 Elf_External_Rel *outbound_relocs;
761 asymbol *last_sym = 0;
762 int last_sym_idx = 0;
764 /* If we have already failed, don't do anything. */
768 if ((sec->flags & SEC_RELOC) == 0)
771 /* The linker backend writes the relocs out itself, and sets the
772 reloc_count field to zero to inhibit writing them here. Also,
773 sometimes the SEC_RELOC flag gets set even when there aren't any
775 if (sec->reloc_count == 0)
778 rela_hdr = &elf_section_data (sec)->rel_hdr;
780 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
781 rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
782 if (rela_hdr->contents == NULL)
788 /* Figure out whether the relocations are RELA or REL relocations. */
789 if (rela_hdr->sh_type == SHT_RELA)
791 else if (rela_hdr->sh_type == SHT_REL)
794 /* Every relocation section should be either an SHT_RELA or an
798 /* orelocation has the data, reloc_count has the count... */
801 outbound_relocas = (Elf_External_Rela *) rela_hdr->contents;
803 for (idx = 0; idx < sec->reloc_count; idx++)
805 Elf_Internal_Rela dst_rela;
806 Elf_External_Rela *src_rela;
811 ptr = sec->orelocation[idx];
812 src_rela = outbound_relocas + idx;
814 /* The address of an ELF reloc is section relative for an object
815 file, and absolute for an executable file or shared library.
816 The address of a BFD reloc is always section relative. */
817 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
818 dst_rela.r_offset = ptr->address;
820 dst_rela.r_offset = ptr->address + sec->vma;
822 sym = *ptr->sym_ptr_ptr;
825 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
830 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
839 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
840 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
841 && ! _bfd_elf_validate_reloc (abfd, ptr))
847 dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
849 dst_rela.r_addend = ptr->addend;
850 elf_swap_reloca_out (abfd, &dst_rela, src_rela);
854 /* REL relocations */
856 outbound_relocs = (Elf_External_Rel *) rela_hdr->contents;
858 for (idx = 0; idx < sec->reloc_count; idx++)
860 Elf_Internal_Rel dst_rel;
861 Elf_External_Rel *src_rel;
866 ptr = sec->orelocation[idx];
867 sym = *ptr->sym_ptr_ptr;
868 src_rel = outbound_relocs + idx;
870 /* The address of an ELF reloc is section relative for an object
871 file, and absolute for an executable file or shared library.
872 The address of a BFD reloc is always section relative. */
873 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
874 dst_rel.r_offset = ptr->address;
876 dst_rel.r_offset = ptr->address + sec->vma;
880 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
885 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
894 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
895 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
896 && ! _bfd_elf_validate_reloc (abfd, ptr))
902 dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type);
904 elf_swap_reloc_out (abfd, &dst_rel, src_rel);
909 /* Write out the program headers. */
912 elf_write_out_phdrs (abfd, phdr, count)
914 const Elf_Internal_Phdr *phdr;
919 Elf_External_Phdr extphdr;
920 elf_swap_phdr_out (abfd, phdr, &extphdr);
921 if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), 1, abfd)
922 != sizeof (Elf_External_Phdr))
929 /* Write out the section headers and the ELF file header. */
932 elf_write_shdrs_and_ehdr (abfd)
935 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
936 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
937 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
938 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
941 i_ehdrp = elf_elfheader (abfd);
942 i_shdrp = elf_elfsections (abfd);
944 /* swap the header before spitting it out... */
947 elf_debug_file (i_ehdrp);
949 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
950 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
951 || (bfd_write ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd)
955 /* at this point we've concocted all the ELF sections... */
956 x_shdrp = (Elf_External_Shdr *)
957 bfd_alloc (abfd, sizeof (*x_shdrp) * (i_ehdrp->e_shnum));
961 for (count = 0; count < i_ehdrp->e_shnum; count++)
964 elf_debug_section (count, i_shdrp[count]);
966 elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count);
968 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
969 || (bfd_write ((PTR) x_shdrp, sizeof (*x_shdrp), i_ehdrp->e_shnum, abfd)
970 != sizeof (*x_shdrp) * i_ehdrp->e_shnum))
973 /* need to dump the string table too... */
979 elf_slurp_symbol_table (abfd, symptrs, dynamic)
981 asymbol **symptrs; /* Buffer for generated bfd symbols */
984 Elf_Internal_Shdr *hdr;
985 Elf_Internal_Shdr *verhdr;
986 unsigned long symcount; /* Number of external ELF symbols */
987 elf_symbol_type *sym; /* Pointer to current bfd symbol */
988 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
989 Elf_Internal_Sym i_sym;
990 Elf_External_Sym *x_symp = NULL;
991 Elf_External_Versym *x_versymp = NULL;
993 /* Read each raw ELF symbol, converting from external ELF form to
994 internal ELF form, and then using the information to create a
995 canonical bfd symbol table entry.
997 Note that we allocate the initial bfd canonical symbol buffer
998 based on a one-to-one mapping of the ELF symbols to canonical
999 symbols. We actually use all the ELF symbols, so there will be no
1000 space left over at the end. When we have all the symbols, we
1001 build the caller's pointer vector. */
1005 hdr = &elf_tdata (abfd)->symtab_hdr;
1010 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1011 if (elf_dynversym (abfd) == 0)
1014 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1015 if ((elf_tdata (abfd)->dynverdef_section != 0
1016 && elf_tdata (abfd)->verdef == NULL)
1017 || (elf_tdata (abfd)->dynverref_section != 0
1018 && elf_tdata (abfd)->verref == NULL))
1020 if (! _bfd_elf_slurp_version_tables (abfd))
1025 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
1028 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1031 sym = symbase = NULL;
1036 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
1039 symbase = ((elf_symbol_type *)
1040 bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type)));
1041 if (symbase == (elf_symbol_type *) NULL)
1045 /* Temporarily allocate room for the raw ELF symbols. */
1046 x_symp = ((Elf_External_Sym *)
1047 bfd_malloc (symcount * sizeof (Elf_External_Sym)));
1048 if (x_symp == NULL && symcount != 0)
1051 if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd)
1052 != symcount * sizeof (Elf_External_Sym))
1055 /* Read the raw ELF version symbol information. */
1058 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1060 (*_bfd_error_handler)
1061 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1063 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1066 /* Slurp in the symbols without the version information,
1067 since that is more helpful than just quitting. */
1073 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1076 x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1077 if (x_versymp == NULL && verhdr->sh_size != 0)
1080 if (bfd_read ((PTR) x_versymp, 1, verhdr->sh_size, abfd)
1085 /* Skip first symbol, which is a null dummy. */
1086 for (i = 1; i < symcount; i++)
1088 elf_swap_symbol_in (abfd, x_symp + i, &i_sym);
1089 memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
1090 #ifdef ELF_KEEP_EXTSYM
1091 memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym));
1093 sym->symbol.the_bfd = abfd;
1095 sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
1099 sym->symbol.value = i_sym.st_value;
1101 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE)
1103 sym->symbol.section = section_from_elf_index (abfd,
1105 if (sym->symbol.section == NULL)
1107 /* This symbol is in a section for which we did not
1108 create a BFD section. Just use bfd_abs_section,
1109 although it is wrong. FIXME. */
1110 sym->symbol.section = bfd_abs_section_ptr;
1113 else if (i_sym.st_shndx == SHN_ABS)
1115 sym->symbol.section = bfd_abs_section_ptr;
1117 else if (i_sym.st_shndx == SHN_COMMON)
1119 sym->symbol.section = bfd_com_section_ptr;
1120 /* Elf puts the alignment into the `value' field, and
1121 the size into the `size' field. BFD wants to see the
1122 size in the value field, and doesn't care (at the
1123 moment) about the alignment. */
1124 sym->symbol.value = i_sym.st_size;
1126 else if (i_sym.st_shndx == SHN_UNDEF)
1128 sym->symbol.section = bfd_und_section_ptr;
1131 sym->symbol.section = bfd_abs_section_ptr;
1133 /* If this is a relocateable file, then the symbol value is
1134 already section relative. */
1135 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1136 sym->symbol.value -= sym->symbol.section->vma;
1138 switch (ELF_ST_BIND (i_sym.st_info))
1141 sym->symbol.flags |= BSF_LOCAL;
1144 if (i_sym.st_shndx != SHN_UNDEF
1145 && i_sym.st_shndx != SHN_COMMON)
1146 sym->symbol.flags |= BSF_GLOBAL;
1149 sym->symbol.flags |= BSF_WEAK;
1153 switch (ELF_ST_TYPE (i_sym.st_info))
1156 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1159 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1162 sym->symbol.flags |= BSF_FUNCTION;
1165 sym->symbol.flags |= BSF_OBJECT;
1170 sym->symbol.flags |= BSF_DYNAMIC;
1172 if (x_versymp != NULL)
1174 Elf_Internal_Versym iversym;
1176 _bfd_elf_swap_versym_in (abfd, x_versymp + i, &iversym);
1177 sym->version = iversym.vs_vers;
1180 /* Do some backend-specific processing on this symbol. */
1182 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1183 if (ebd->elf_backend_symbol_processing)
1184 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1191 /* Do some backend-specific processing on this symbol table. */
1193 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1194 if (ebd->elf_backend_symbol_table_processing)
1195 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1198 /* We rely on the zalloc to clear out the final symbol entry. */
1200 symcount = sym - symbase;
1202 /* Fill in the user's symbol pointer vector if needed. */
1210 *symptrs++ = &sym->symbol;
1213 *symptrs = 0; /* Final null pointer */
1216 if (x_versymp != NULL)
1222 if (x_versymp != NULL)
1229 /* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
1233 elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
1234 relents, symbols, dynamic)
1237 Elf_Internal_Shdr *rel_hdr;
1238 bfd_size_type reloc_count;
1243 struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1244 PTR allocated = NULL;
1245 bfd_byte *native_relocs;
1250 allocated = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size);
1251 if (allocated == NULL)
1254 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1255 || (bfd_read (allocated, 1, rel_hdr->sh_size, abfd)
1256 != rel_hdr->sh_size))
1259 native_relocs = (bfd_byte *) allocated;
1261 entsize = rel_hdr->sh_entsize;
1262 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1263 || entsize == sizeof (Elf_External_Rela));
1265 for (i = 0, relent = relents;
1267 i++, relent++, native_relocs += entsize)
1269 Elf_Internal_Rela rela;
1270 Elf_Internal_Rel rel;
1272 if (entsize == sizeof (Elf_External_Rela))
1273 elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela);
1276 elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel);
1277 rela.r_offset = rel.r_offset;
1278 rela.r_info = rel.r_info;
1282 /* The address of an ELF reloc is section relative for an object
1283 file, and absolute for an executable file or shared library.
1284 The address of a normal BFD reloc is always section relative,
1285 and the address of a dynamic reloc is absolute.. */
1286 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1287 relent->address = rela.r_offset;
1289 relent->address = rela.r_offset - asect->vma;
1291 if (ELF_R_SYM (rela.r_info) == 0)
1292 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1297 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1300 /* Canonicalize ELF section symbols. FIXME: Why? */
1301 if ((s->flags & BSF_SECTION_SYM) == 0)
1302 relent->sym_ptr_ptr = ps;
1304 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
1307 relent->addend = rela.r_addend;
1309 if (entsize == sizeof (Elf_External_Rela))
1310 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1312 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
1315 if (allocated != NULL)
1321 if (allocated != NULL)
1326 /* Read in and swap the external relocs. */
1329 elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
1335 struct bfd_elf_section_data * const d = elf_section_data (asect);
1336 Elf_Internal_Shdr *rel_hdr;
1337 Elf_Internal_Shdr *rel_hdr2;
1338 bfd_size_type reloc_count;
1339 bfd_size_type reloc_count2;
1342 if (asect->relocation != NULL)
1347 if ((asect->flags & SEC_RELOC) == 0
1348 || asect->reloc_count == 0)
1351 rel_hdr = &d->rel_hdr;
1352 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
1353 rel_hdr2 = d->rel_hdr2;
1354 reloc_count2 = (rel_hdr2
1355 ? (rel_hdr2->sh_size / rel_hdr2->sh_entsize)
1358 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1359 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1360 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1365 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1366 case because relocations against this section may use the
1367 dynamic symbol table, and in that case bfd_section_from_shdr
1368 in elf.c does not update the RELOC_COUNT. */
1369 if (asect->_raw_size == 0)
1372 rel_hdr = &d->this_hdr;
1373 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
1378 relents = ((arelent *)
1380 (reloc_count + reloc_count2) * sizeof (arelent)));
1381 if (relents == NULL)
1384 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1385 rel_hdr, reloc_count,
1391 && !elf_slurp_reloc_table_from_section (abfd, asect,
1392 rel_hdr2, reloc_count2,
1393 relents + reloc_count,
1398 asect->relocation = relents;
1404 elf_debug_section (num, hdr)
1406 Elf_Internal_Shdr *hdr;
1408 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1409 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1412 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1413 (long) hdr->sh_name,
1414 (long) hdr->sh_type,
1415 (long) hdr->sh_flags);
1417 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1418 (long) hdr->sh_addr,
1419 (long) hdr->sh_offset,
1420 (long) hdr->sh_size);
1422 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1423 (long) hdr->sh_link,
1424 (long) hdr->sh_info,
1425 (long) hdr->sh_addralign);
1426 fprintf (stderr, "sh_entsize = %ld\n",
1427 (long) hdr->sh_entsize);
1432 elf_debug_file (ehdrp)
1433 Elf_Internal_Ehdr *ehdrp;
1435 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1436 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1437 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1438 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1439 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1440 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1441 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1445 elf_symbol_flags (flags)
1448 static char buffer[1024];
1451 if (flags & BSF_LOCAL)
1452 strcat (buffer, " local");
1454 if (flags & BSF_GLOBAL)
1455 strcat (buffer, " global");
1457 if (flags & BSF_DEBUGGING)
1458 strcat (buffer, " debug");
1460 if (flags & BSF_FUNCTION)
1461 strcat (buffer, " function");
1463 if (flags & BSF_KEEP)
1464 strcat (buffer, " keep");
1466 if (flags & BSF_KEEP_G)
1467 strcat (buffer, " keep_g");
1469 if (flags & BSF_WEAK)
1470 strcat (buffer, " weak");
1472 if (flags & BSF_SECTION_SYM)
1473 strcat (buffer, " section-sym");
1475 if (flags & BSF_OLD_COMMON)
1476 strcat (buffer, " old-common");
1478 if (flags & BSF_NOT_AT_END)
1479 strcat (buffer, " not-at-end");
1481 if (flags & BSF_CONSTRUCTOR)
1482 strcat (buffer, " constructor");
1484 if (flags & BSF_WARNING)
1485 strcat (buffer, " warning");
1487 if (flags & BSF_INDIRECT)
1488 strcat (buffer, " indirect");
1490 if (flags & BSF_FILE)
1491 strcat (buffer, " file");
1493 if (flags & DYNAMIC)
1494 strcat (buffer, " dynamic");
1496 if (flags & ~(BSF_LOCAL
1511 strcat (buffer, " unknown-bits");
1517 #include "elfcore.h"
1518 #include "elflink.h"
1520 /* Size-dependent data and functions. */
1521 const struct elf_size_info NAME(_bfd_elf,size_info) = {
1522 sizeof (Elf_External_Ehdr),
1523 sizeof (Elf_External_Phdr),
1524 sizeof (Elf_External_Shdr),
1525 sizeof (Elf_External_Rel),
1526 sizeof (Elf_External_Rela),
1527 sizeof (Elf_External_Sym),
1528 sizeof (Elf_External_Dyn),
1529 sizeof (Elf_External_Note),
1532 ARCH_SIZE, FILE_ALIGN,
1533 ELFCLASS, EV_CURRENT,
1534 elf_write_out_phdrs,
1535 elf_write_shdrs_and_ehdr,
1537 elf_swap_symbol_out,
1538 elf_slurp_reloc_table,
1539 elf_slurp_symbol_table,