2000-03-08 H.J. Lu (hjl@gnu.org)
[binutils.git] / bfd / elfcode.h
blobc5edf9b82507c2638848c0e0075c89544fd0f062
1 /* ELF executable support for BFD.
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software
3 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 "bfdlink.h"
70 #include "libbfd.h"
71 #include "elf-bfd.h"
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)
136 #if ARCH_SIZE == 64
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
141 #define FILE_ALIGN 8
142 #define LOG_FILE_ALIGN 3
143 #endif
144 #if ARCH_SIZE == 32
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
149 #define FILE_ALIGN 4
150 #define LOG_FILE_ALIGN 2
151 #endif
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 *));
178 #ifdef DEBUG
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));
182 #endif
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". */
188 #if ARCH_SIZE == 64
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
193 #endif
194 #if ARCH_SIZE == 32
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
199 #endif
201 /* Translate an ELF symbol in external format into an ELF symbol in internal
202 format. */
204 void
205 elf_swap_symbol_in (abfd, src, dst)
206 bfd *abfd;
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);
213 if (signed_vma)
214 dst->st_value = get_signed_word (abfd, (bfd_byte *) src->st_value);
215 else
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
224 format. */
226 void
227 elf_swap_symbol_out (abfd, src, cdst)
228 bfd *abfd;
229 const Elf_Internal_Sym *src;
230 PTR cdst;
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
243 internal format. */
245 static void
246 elf_swap_ehdr_in (abfd, src, dst)
247 bfd *abfd;
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
268 external format. */
270 static void
271 elf_swap_ehdr_out (abfd, src, dst)
272 bfd *abfd;
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. */
297 static void
298 elf_swap_shdr_in (abfd, src, dst)
299 bfd *abfd;
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);
308 if (signed_vma)
309 dst->sh_addr = get_signed_word (abfd, (bfd_byte *) src->sh_addr);
310 else
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. */
325 static void
326 elf_swap_shdr_out (abfd, src, dst)
327 bfd *abfd;
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. */
348 void
349 elf_swap_phdr_in (abfd, src, dst)
350 bfd *abfd;
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);
359 if (signed_vma)
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);
364 else
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);
374 void
375 elf_swap_phdr_out (abfd, src, dst)
376 bfd *abfd;
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. */
392 INLINE void
393 elf_swap_reloc_in (abfd, src, dst)
394 bfd *abfd;
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);
402 INLINE void
403 elf_swap_reloca_in (abfd, src, dst)
404 bfd *abfd;
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. */
414 INLINE void
415 elf_swap_reloc_out (abfd, src, dst)
416 bfd *abfd;
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);
424 INLINE void
425 elf_swap_reloca_out (abfd, src, dst)
426 bfd *abfd;
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);
435 INLINE void
436 elf_swap_dyn_in (abfd, p, dst)
437 bfd *abfd;
438 const PTR p;
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);
447 INLINE void
448 elf_swap_dyn_out (abfd, src, p)
449 bfd *abfd;
450 const Elf_Internal_Dyn *src;
451 PTR p;
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
465 the magic number. */
467 static INLINE boolean
468 elf_file_p (x_ehdrp)
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
478 that ABFD points to.
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. */
485 const bfd_target *
486 elf_object_p (abfd)
487 bfd *abfd;
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;
498 asection *s;
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;
506 else
507 goto got_no_match;
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
514 file). */
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;
527 break;
528 case ELFDATA2LSB: /* Little-endian */
529 if (! bfd_header_little_endian (abfd))
530 goto got_wrong_format_error;
531 break;
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)
543 goto got_no_match;
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);
549 #if DEBUG & 1
550 elf_debug_file (i_ehdrp);
551 #endif
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)
587 continue;
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)
614 goto got_no_match;
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 **)
626 bfd_alloc (abfd,
627 sizeof (i_shdrp) * i_ehdrp->e_shnum));
628 if (!i_shdrp || !elf_elfsections (abfd))
629 goto got_no_match;
630 if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0)
631 goto got_no_match;
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))
635 goto got_no_match;
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
640 D_PAGED. */
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)
644 % ebd->maxpagesize)
645 != 0))
646 abfd->flags &= ~D_PAGED;
648 if (i_ehdrp->e_shstrndx)
650 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
651 goto got_no_match;
654 /* Read in the program headers. */
655 if (i_ehdrp->e_phnum == 0)
656 elf_tdata (abfd)->phdr = NULL;
657 else
659 Elf_Internal_Phdr *i_phdr;
660 unsigned int i;
662 elf_tdata (abfd)->phdr = ((Elf_Internal_Phdr *)
663 bfd_alloc (abfd,
664 (i_ehdrp->e_phnum
665 * sizeof (Elf_Internal_Phdr))));
666 if (elf_tdata (abfd)->phdr == NULL)
667 goto got_no_match;
668 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
669 goto got_no_match;
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)
676 != sizeof x_phdr)
677 goto got_no_match;
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);
689 if (!shstrtab)
690 goto got_no_match;
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))
699 goto got_no_match;
702 /* Let the backend double check the format and override global
703 information. */
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;
719 asection *targ_sec;
721 targ_index = elf_section_data (s)->this_hdr.sh_info;
722 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
723 if (targ_sec != NULL
724 && (targ_sec->flags & SEC_DEBUGGING) != 0)
725 s->flags |= SEC_DEBUGGING;
729 return (abfd->xvec);
731 got_wrong_format_error:
732 bfd_set_error (bfd_error_wrong_format);
733 got_no_match:
734 if (new_tdata != NULL
735 && new_tdata->elf_sect_ptr != NULL)
736 bfd_release (abfd, new_tdata->elf_sect_ptr);
737 if (i_shdrp != NULL)
738 bfd_release (abfd, i_shdrp);
739 if (new_tdata != NULL)
740 bfd_release (abfd, new_tdata);
741 elf_tdata (abfd) = preserved_tdata;
742 return (NULL);
745 /* ELF .o/exec file writing */
747 /* Write out the relocs. */
749 static void
750 write_relocs (abfd, sec, data)
751 bfd *abfd;
752 asection *sec;
753 PTR data;
755 boolean *failedp = (boolean *) data;
756 Elf_Internal_Shdr *rela_hdr;
757 Elf_External_Rela *outbound_relocas;
758 Elf_External_Rel *outbound_relocs;
759 unsigned int idx;
760 int use_rela_p;
761 asymbol *last_sym = 0;
762 int last_sym_idx = 0;
764 /* If we have already failed, don't do anything. */
765 if (*failedp)
766 return;
768 if ((sec->flags & SEC_RELOC) == 0)
769 return;
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
774 relocs. */
775 if (sec->reloc_count == 0)
776 return;
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)
784 *failedp = true;
785 return;
788 /* Figure out whether the relocations are RELA or REL relocations. */
789 if (rela_hdr->sh_type == SHT_RELA)
790 use_rela_p = true;
791 else if (rela_hdr->sh_type == SHT_REL)
792 use_rela_p = false;
793 else
794 /* Every relocation section should be either an SHT_RELA or an
795 SHT_REL section. */
796 abort ();
798 /* orelocation has the data, reloc_count has the count... */
799 if (use_rela_p)
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;
807 arelent *ptr;
808 asymbol *sym;
809 int n;
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;
819 else
820 dst_rela.r_offset = ptr->address + sec->vma;
822 sym = *ptr->sym_ptr_ptr;
823 if (sym == last_sym)
824 n = last_sym_idx;
825 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
826 n = STN_UNDEF;
827 else
829 last_sym = sym;
830 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
831 if (n < 0)
833 *failedp = true;
834 return;
836 last_sym_idx = n;
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))
843 *failedp = true;
844 return;
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);
853 else
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;
862 arelent *ptr;
863 int n;
864 asymbol *sym;
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;
875 else
876 dst_rel.r_offset = ptr->address + sec->vma;
878 if (sym == last_sym)
879 n = last_sym_idx;
880 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
881 n = STN_UNDEF;
882 else
884 last_sym = sym;
885 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
886 if (n < 0)
888 *failedp = true;
889 return;
891 last_sym_idx = n;
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))
898 *failedp = true;
899 return;
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)
913 bfd *abfd;
914 const Elf_Internal_Phdr *phdr;
915 int count;
917 while (count--)
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))
923 return -1;
924 phdr++;
926 return 0;
929 /* Write out the section headers and the ELF file header. */
931 boolean
932 elf_write_shdrs_and_ehdr (abfd)
933 bfd *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 */
939 unsigned int count;
941 i_ehdrp = elf_elfheader (abfd);
942 i_shdrp = elf_elfsections (abfd);
944 /* swap the header before spitting it out... */
946 #if DEBUG & 1
947 elf_debug_file (i_ehdrp);
948 #endif
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)
952 != sizeof (x_ehdr)))
953 return false;
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));
958 if (!x_shdrp)
959 return false;
961 for (count = 0; count < i_ehdrp->e_shnum; count++)
963 #if DEBUG & 2
964 elf_debug_section (count, i_shdrp[count]);
965 #endif
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))
971 return false;
973 /* need to dump the string table too... */
975 return true;
978 long
979 elf_slurp_symbol_table (abfd, symptrs, dynamic)
980 bfd *abfd;
981 asymbol **symptrs; /* Buffer for generated bfd symbols */
982 boolean dynamic;
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. */
1003 if (! dynamic)
1005 hdr = &elf_tdata (abfd)->symtab_hdr;
1006 verhdr = NULL;
1008 else
1010 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1011 if (elf_dynversym (abfd) == 0)
1012 verhdr = NULL;
1013 else
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))
1021 return -1;
1025 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
1026 return -1;
1028 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1030 if (symcount == 0)
1031 sym = symbase = NULL;
1032 else
1034 unsigned long i;
1036 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
1037 return -1;
1039 symbase = ((elf_symbol_type *)
1040 bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type)));
1041 if (symbase == (elf_symbol_type *) NULL)
1042 return -1;
1043 sym = symbase;
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)
1049 goto error_return;
1051 if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd)
1052 != symcount * sizeof (Elf_External_Sym))
1053 goto error_return;
1055 /* Read the raw ELF version symbol information. */
1057 if (verhdr != NULL
1058 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1060 (*_bfd_error_handler)
1061 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1062 abfd->filename,
1063 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1064 symcount);
1066 /* Slurp in the symbols without the version information,
1067 since that is more helpful than just quitting. */
1068 verhdr = NULL;
1071 if (verhdr != NULL)
1073 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1074 goto error_return;
1076 x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1077 if (x_versymp == NULL && verhdr->sh_size != 0)
1078 goto error_return;
1080 if (bfd_read ((PTR) x_versymp, 1, verhdr->sh_size, abfd)
1081 != verhdr->sh_size)
1082 goto error_return;
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));
1092 #endif
1093 sym->symbol.the_bfd = abfd;
1095 sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
1096 hdr->sh_link,
1097 i_sym.st_name);
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,
1104 i_sym.st_shndx);
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;
1130 else
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))
1140 case STB_LOCAL:
1141 sym->symbol.flags |= BSF_LOCAL;
1142 break;
1143 case STB_GLOBAL:
1144 if (i_sym.st_shndx != SHN_UNDEF
1145 && i_sym.st_shndx != SHN_COMMON)
1146 sym->symbol.flags |= BSF_GLOBAL;
1147 break;
1148 case STB_WEAK:
1149 sym->symbol.flags |= BSF_WEAK;
1150 break;
1153 switch (ELF_ST_TYPE (i_sym.st_info))
1155 case STT_SECTION:
1156 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1157 break;
1158 case STT_FILE:
1159 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1160 break;
1161 case STT_FUNC:
1162 sym->symbol.flags |= BSF_FUNCTION;
1163 break;
1164 case STT_OBJECT:
1165 sym->symbol.flags |= BSF_OBJECT;
1166 break;
1169 if (dynamic)
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);
1187 sym++;
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. */
1203 if (symptrs)
1205 long l = symcount;
1207 sym = symbase;
1208 while (l-- > 0)
1210 *symptrs++ = &sym->symbol;
1211 sym++;
1213 *symptrs = 0; /* Final null pointer */
1216 if (x_versymp != NULL)
1217 free (x_versymp);
1218 if (x_symp != NULL)
1219 free (x_symp);
1220 return symcount;
1221 error_return:
1222 if (x_versymp != NULL)
1223 free (x_versymp);
1224 if (x_symp != NULL)
1225 free (x_symp);
1226 return -1;
1229 /* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
1230 them. */
1232 static boolean
1233 elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
1234 relents, symbols, dynamic)
1235 bfd *abfd;
1236 asection *asect;
1237 Elf_Internal_Shdr *rel_hdr;
1238 bfd_size_type reloc_count;
1239 arelent *relents;
1240 asymbol **symbols;
1241 boolean dynamic;
1243 struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1244 PTR allocated = NULL;
1245 bfd_byte *native_relocs;
1246 arelent *relent;
1247 unsigned int i;
1248 int entsize;
1250 allocated = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size);
1251 if (allocated == NULL)
1252 goto error_return;
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))
1257 goto error_return;
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;
1266 i < reloc_count;
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);
1274 else
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;
1279 rela.r_addend = 0;
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;
1288 else
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;
1293 else
1295 asymbol **ps, *s;
1297 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1298 s = *ps;
1300 /* Canonicalize ELF section symbols. FIXME: Why? */
1301 if ((s->flags & BSF_SECTION_SYM) == 0)
1302 relent->sym_ptr_ptr = ps;
1303 else
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);
1311 else
1312 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
1315 if (allocated != NULL)
1316 free (allocated);
1318 return true;
1320 error_return:
1321 if (allocated != NULL)
1322 free (allocated);
1323 return false;
1326 /* Read in and swap the external relocs. */
1328 static boolean
1329 elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
1330 bfd *abfd;
1331 asection *asect;
1332 asymbol **symbols;
1333 boolean 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;
1340 arelent *relents;
1342 if (asect->relocation != NULL)
1343 return true;
1345 if (! dynamic)
1347 if ((asect->flags & SEC_RELOC) == 0
1348 || asect->reloc_count == 0)
1349 return true;
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)
1356 : 0);
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));
1363 else
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)
1370 return true;
1372 rel_hdr = &d->this_hdr;
1373 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
1374 rel_hdr2 = NULL;
1375 reloc_count2 = 0;
1378 relents = ((arelent *)
1379 bfd_alloc (abfd,
1380 (reloc_count + reloc_count2) * sizeof (arelent)));
1381 if (relents == NULL)
1382 return false;
1384 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1385 rel_hdr, reloc_count,
1386 relents,
1387 symbols, dynamic))
1388 return false;
1390 if (rel_hdr2
1391 && !elf_slurp_reloc_table_from_section (abfd, asect,
1392 rel_hdr2, reloc_count2,
1393 relents + reloc_count,
1394 symbols, dynamic))
1395 return false;
1398 asect->relocation = relents;
1399 return true;
1402 #ifdef DEBUG
1403 static void
1404 elf_debug_section (num, hdr)
1405 int num;
1406 Elf_Internal_Shdr *hdr;
1408 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1409 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1410 (long) hdr);
1411 fprintf (stderr,
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);
1416 fprintf (stderr,
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);
1421 fprintf (stderr,
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);
1428 fflush (stderr);
1431 static void
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);
1444 static char *
1445 elf_symbol_flags (flags)
1446 flagword flags;
1448 static char buffer[1024];
1450 buffer[0] = '\0';
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
1497 | BSF_GLOBAL
1498 | BSF_DEBUGGING
1499 | BSF_FUNCTION
1500 | BSF_KEEP
1501 | BSF_KEEP_G
1502 | BSF_WEAK
1503 | BSF_SECTION_SYM
1504 | BSF_OLD_COMMON
1505 | BSF_NOT_AT_END
1506 | BSF_CONSTRUCTOR
1507 | BSF_WARNING
1508 | BSF_INDIRECT
1509 | BSF_FILE
1510 | BSF_DYNAMIC))
1511 strcat (buffer, " unknown-bits");
1513 return buffer;
1515 #endif
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),
1530 ARCH_SIZE / 8,
1532 ARCH_SIZE, FILE_ALIGN,
1533 ELFCLASS, EV_CURRENT,
1534 elf_write_out_phdrs,
1535 elf_write_shdrs_and_ehdr,
1536 write_relocs,
1537 elf_swap_symbol_out,
1538 elf_slurp_reloc_table,
1539 elf_slurp_symbol_table,
1540 elf_swap_dyn_in,
1541 elf_swap_dyn_out,
1542 NULL,
1543 NULL,
1544 NULL,
1545 NULL