]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfcode.h
* alphabsd-nat.c, i386-linux-nat.c, i386bsd-nat.c: Fix typo in comment.
[thirdparty/binutils-gdb.git] / bfd / elfcode.h
CommitLineData
252b5132 1/* ELF executable support for BFD.
448cafa4
AC
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999, 2000 Free
3 Software Foundation, Inc.
252b5132
RH
4
5 Written by Fred Fish @ Cygnus Support, from information published
6 in "UNIX System V Release 4, Programmers Guide: ANSI C and
7 Programming Support Tools". Sufficient support for gdb.
8
9 Rewritten by Mark Eichin @ Cygnus Support, from information
10 published in "System V Application Binary Interface", chapters 4
11 and 5, as well as the various "Processor Supplement" documents
12 derived from it. Added support for assembler and other object file
13 utilities. Further work done by Ken Raeburn (Cygnus Support), Michael
14 Meissner (Open Software Foundation), and Peter Hoogenboom (University
15 of Utah) to finish and extend this.
16
17This file is part of BFD, the Binary File Descriptor library.
18
19This program is free software; you can redistribute it and/or modify
20it under the terms of the GNU General Public License as published by
21the Free Software Foundation; either version 2 of the License, or
22(at your option) any later version.
23
24This program is distributed in the hope that it will be useful,
25but WITHOUT ANY WARRANTY; without even the implied warranty of
26MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27GNU General Public License for more details.
28
29You should have received a copy of the GNU General Public License
30along with this program; if not, write to the Free Software
31Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
32
33/* Problems and other issues to resolve.
34
35 (1) BFD expects there to be some fixed number of "sections" in
36 the object file. I.E. there is a "section_count" variable in the
37 bfd structure which contains the number of sections. However, ELF
38 supports multiple "views" of a file. In particular, with current
39 implementations, executable files typically have two tables, a
40 program header table and a section header table, both of which
41 partition the executable.
42
43 In ELF-speak, the "linking view" of the file uses the section header
44 table to access "sections" within the file, and the "execution view"
45 uses the program header table to access "segments" within the file.
46 "Segments" typically may contain all the data from one or more
47 "sections".
48
49 Note that the section header table is optional in ELF executables,
50 but it is this information that is most useful to gdb. If the
51 section header table is missing, then gdb should probably try
52 to make do with the program header table. (FIXME)
53
54 (2) The code in this file is compiled twice, once in 32-bit mode and
55 once in 64-bit mode. More of it should be made size-independent
56 and moved into elf.c.
57
58 (3) ELF section symbols are handled rather sloppily now. This should
59 be cleaned up, and ELF section symbols reconciled with BFD section
60 symbols.
61
62 (4) We need a published spec for 64-bit ELF. We've got some stuff here
63 that we're using for SPARC V9 64-bit chips, but don't assume that
64 it's cast in stone.
65 */
66
67#include "bfd.h"
68#include "sysdep.h"
69#include "bfdlink.h"
70#include "libbfd.h"
71#include "elf-bfd.h"
72
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)
81
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)
b9f66672
JL
121#define elf_write_relocs NAME(bfd_elf,write_relocs)
122#define elf_slurp_reloc_table NAME(bfd_elf,slurp_reloc_table)
252b5132
RH
123#define elf_link_create_dynamic_sections \
124 NAME(bfd_elf,link_create_dynamic_sections)
125#define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
126#define elf_bfd_final_link NAME(bfd_elf,bfd_final_link)
127#define elf_create_pointer_linker_section NAME(bfd_elf,create_pointer_linker_section)
128#define elf_finish_pointer_linker_section NAME(bfd_elf,finish_pointer_linker_section)
129#define elf_gc_sections NAME(_bfd_elf,gc_sections)
130#define elf_gc_common_finalize_got_offsets \
131 NAME(_bfd_elf,gc_common_finalize_got_offsets)
132#define elf_gc_common_final_link NAME(_bfd_elf,gc_common_final_link)
133#define elf_gc_record_vtinherit NAME(_bfd_elf,gc_record_vtinherit)
134#define elf_gc_record_vtentry NAME(_bfd_elf,gc_record_vtentry)
30b30c21
RH
135#define elf_link_record_local_dynamic_symbol \
136 NAME(_bfd_elf,link_record_local_dynamic_symbol)
252b5132
RH
137
138#if ARCH_SIZE == 64
139#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
140#define ELF_R_SYM(X) ELF64_R_SYM(X)
141#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
142#define ELFCLASS ELFCLASS64
143#define FILE_ALIGN 8
144#define LOG_FILE_ALIGN 3
145#endif
146#if ARCH_SIZE == 32
147#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
148#define ELF_R_SYM(X) ELF32_R_SYM(X)
149#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
150#define ELFCLASS ELFCLASS32
151#define FILE_ALIGN 4
152#define LOG_FILE_ALIGN 2
153#endif
154
155/* Static functions */
156
157static void elf_swap_ehdr_in
158 PARAMS ((bfd *, const Elf_External_Ehdr *, Elf_Internal_Ehdr *));
159static void elf_swap_ehdr_out
160 PARAMS ((bfd *, const Elf_Internal_Ehdr *, Elf_External_Ehdr *));
161static void elf_swap_shdr_in
162 PARAMS ((bfd *, const Elf_External_Shdr *, Elf_Internal_Shdr *));
163static void elf_swap_shdr_out
164 PARAMS ((bfd *, const Elf_Internal_Shdr *, Elf_External_Shdr *));
165
166#define elf_stringtab_init _bfd_elf_stringtab_init
167
168#define section_from_elf_index bfd_section_from_elf_index
169
60bcf0fa 170static boolean elf_slurp_reloc_table_from_section
42fdc509
MM
171 PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type,
172 arelent *, asymbol **, boolean));
252b5132
RH
173
174static boolean elf_file_p PARAMS ((Elf_External_Ehdr *));
175
176#ifdef DEBUG
177static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *));
178static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *));
179static char *elf_symbol_flags PARAMS ((flagword));
180#endif
181\f
182/* Structure swapping routines */
183
184/* Should perhaps use put_offset, put_word, etc. For now, the two versions
185 can be handled by explicitly specifying 32 bits or "the long type". */
186#if ARCH_SIZE == 64
187#define put_word bfd_h_put_64
188#define put_signed_word bfd_h_put_signed_64
189#define get_word bfd_h_get_64
190#define get_signed_word bfd_h_get_signed_64
191#endif
192#if ARCH_SIZE == 32
193#define put_word bfd_h_put_32
194#define put_signed_word bfd_h_put_signed_32
195#define get_word bfd_h_get_32
196#define get_signed_word bfd_h_get_signed_32
197#endif
198
199/* Translate an ELF symbol in external format into an ELF symbol in internal
200 format. */
201
202void
203elf_swap_symbol_in (abfd, src, dst)
204 bfd *abfd;
205 const Elf_External_Sym *src;
206 Elf_Internal_Sym *dst;
207{
86dc0f79
RH
208 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
209
252b5132 210 dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name);
86dc0f79
RH
211 if (signed_vma)
212 dst->st_value = get_signed_word (abfd, (bfd_byte *) src->st_value);
213 else
214 dst->st_value = get_word (abfd, (bfd_byte *) src->st_value);
252b5132
RH
215 dst->st_size = get_word (abfd, (bfd_byte *) src->st_size);
216 dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info);
217 dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other);
218 dst->st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src->st_shndx);
219}
220
221/* Translate an ELF symbol in internal format into an ELF symbol in external
222 format. */
223
224void
225elf_swap_symbol_out (abfd, src, cdst)
226 bfd *abfd;
227 const Elf_Internal_Sym *src;
228 PTR cdst;
229{
230 Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
231 bfd_h_put_32 (abfd, src->st_name, dst->st_name);
232 put_word (abfd, src->st_value, dst->st_value);
233 put_word (abfd, src->st_size, dst->st_size);
234 bfd_h_put_8 (abfd, src->st_info, dst->st_info);
235 bfd_h_put_8 (abfd, src->st_other, dst->st_other);
236 bfd_h_put_16 (abfd, src->st_shndx, dst->st_shndx);
237}
238
239
240/* Translate an ELF file header in external format into an ELF file header in
241 internal format. */
242
243static void
244elf_swap_ehdr_in (abfd, src, dst)
245 bfd *abfd;
246 const Elf_External_Ehdr *src;
247 Elf_Internal_Ehdr *dst;
248{
448cafa4 249 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252b5132
RH
250 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
251 dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type);
252 dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine);
253 dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version);
448cafa4
AC
254 if (signed_vma)
255 dst->e_entry = get_signed_word (abfd, (bfd_byte *) src->e_entry);
256 else
257 dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry);
252b5132
RH
258 dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff);
259 dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff);
260 dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags);
261 dst->e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_ehsize);
262 dst->e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phentsize);
263 dst->e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phnum);
264 dst->e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shentsize);
265 dst->e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shnum);
266 dst->e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shstrndx);
267}
268
269/* Translate an ELF file header in internal format into an ELF file header in
270 external format. */
271
272static void
273elf_swap_ehdr_out (abfd, src, dst)
274 bfd *abfd;
275 const Elf_Internal_Ehdr *src;
276 Elf_External_Ehdr *dst;
277{
448cafa4 278 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252b5132
RH
279 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
280 /* note that all elements of dst are *arrays of unsigned char* already... */
281 bfd_h_put_16 (abfd, src->e_type, dst->e_type);
282 bfd_h_put_16 (abfd, src->e_machine, dst->e_machine);
283 bfd_h_put_32 (abfd, src->e_version, dst->e_version);
448cafa4
AC
284 if (signed_vma)
285 put_signed_word (abfd, src->e_entry, dst->e_entry);
286 else
287 put_word (abfd, src->e_entry, dst->e_entry);
252b5132
RH
288 put_word (abfd, src->e_phoff, dst->e_phoff);
289 put_word (abfd, src->e_shoff, dst->e_shoff);
290 bfd_h_put_32 (abfd, src->e_flags, dst->e_flags);
291 bfd_h_put_16 (abfd, src->e_ehsize, dst->e_ehsize);
292 bfd_h_put_16 (abfd, src->e_phentsize, dst->e_phentsize);
293 bfd_h_put_16 (abfd, src->e_phnum, dst->e_phnum);
294 bfd_h_put_16 (abfd, src->e_shentsize, dst->e_shentsize);
295 bfd_h_put_16 (abfd, src->e_shnum, dst->e_shnum);
296 bfd_h_put_16 (abfd, src->e_shstrndx, dst->e_shstrndx);
297}
298
299
300/* Translate an ELF section header table entry in external format into an
301 ELF section header table entry in internal format. */
302
303static void
304elf_swap_shdr_in (abfd, src, dst)
305 bfd *abfd;
306 const Elf_External_Shdr *src;
307 Elf_Internal_Shdr *dst;
308{
86dc0f79
RH
309 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
310
252b5132
RH
311 dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name);
312 dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type);
313 dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags);
86dc0f79
RH
314 if (signed_vma)
315 dst->sh_addr = get_signed_word (abfd, (bfd_byte *) src->sh_addr);
316 else
317 dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr);
252b5132
RH
318 dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset);
319 dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size);
320 dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link);
321 dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info);
322 dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign);
323 dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize);
324 dst->bfd_section = NULL;
325 dst->contents = NULL;
326}
327
328/* Translate an ELF section header table entry in internal format into an
329 ELF section header table entry in external format. */
330
331static void
332elf_swap_shdr_out (abfd, src, dst)
333 bfd *abfd;
334 const Elf_Internal_Shdr *src;
335 Elf_External_Shdr *dst;
336{
337 /* note that all elements of dst are *arrays of unsigned char* already... */
338 bfd_h_put_32 (abfd, src->sh_name, dst->sh_name);
339 bfd_h_put_32 (abfd, src->sh_type, dst->sh_type);
340 put_word (abfd, src->sh_flags, dst->sh_flags);
341 put_word (abfd, src->sh_addr, dst->sh_addr);
342 put_word (abfd, src->sh_offset, dst->sh_offset);
343 put_word (abfd, src->sh_size, dst->sh_size);
344 bfd_h_put_32 (abfd, src->sh_link, dst->sh_link);
345 bfd_h_put_32 (abfd, src->sh_info, dst->sh_info);
346 put_word (abfd, src->sh_addralign, dst->sh_addralign);
347 put_word (abfd, src->sh_entsize, dst->sh_entsize);
348}
349
350
351/* Translate an ELF program header table entry in external format into an
352 ELF program header table entry in internal format. */
353
354void
355elf_swap_phdr_in (abfd, src, dst)
356 bfd *abfd;
357 const Elf_External_Phdr *src;
358 Elf_Internal_Phdr *dst;
359{
86dc0f79
RH
360 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
361
252b5132
RH
362 dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type);
363 dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags);
364 dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset);
86dc0f79
RH
365 if (signed_vma)
366 {
367 dst->p_vaddr = get_signed_word (abfd, (bfd_byte *) src->p_vaddr);
368 dst->p_paddr = get_signed_word (abfd, (bfd_byte *) src->p_paddr);
369 }
370 else
371 {
372 dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr);
373 dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr);
374 }
252b5132
RH
375 dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz);
376 dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz);
377 dst->p_align = get_word (abfd, (bfd_byte *) src->p_align);
378}
379
380void
381elf_swap_phdr_out (abfd, src, dst)
382 bfd *abfd;
383 const Elf_Internal_Phdr *src;
384 Elf_External_Phdr *dst;
385{
386 /* note that all elements of dst are *arrays of unsigned char* already... */
387 bfd_h_put_32 (abfd, src->p_type, dst->p_type);
388 put_word (abfd, src->p_offset, dst->p_offset);
389 put_word (abfd, src->p_vaddr, dst->p_vaddr);
390 put_word (abfd, src->p_paddr, dst->p_paddr);
391 put_word (abfd, src->p_filesz, dst->p_filesz);
392 put_word (abfd, src->p_memsz, dst->p_memsz);
393 bfd_h_put_32 (abfd, src->p_flags, dst->p_flags);
394 put_word (abfd, src->p_align, dst->p_align);
395}
396
397/* Translate an ELF reloc from external format to internal format. */
398INLINE void
399elf_swap_reloc_in (abfd, src, dst)
400 bfd *abfd;
401 const Elf_External_Rel *src;
402 Elf_Internal_Rel *dst;
403{
404 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
405 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
406}
407
408INLINE void
409elf_swap_reloca_in (abfd, src, dst)
410 bfd *abfd;
411 const Elf_External_Rela *src;
412 Elf_Internal_Rela *dst;
413{
414 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
415 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
416 dst->r_addend = get_signed_word (abfd, (bfd_byte *) src->r_addend);
417}
418
419/* Translate an ELF reloc from internal format to external format. */
420INLINE void
421elf_swap_reloc_out (abfd, src, dst)
422 bfd *abfd;
423 const Elf_Internal_Rel *src;
424 Elf_External_Rel *dst;
425{
426 put_word (abfd, src->r_offset, dst->r_offset);
427 put_word (abfd, src->r_info, dst->r_info);
428}
429
430INLINE void
431elf_swap_reloca_out (abfd, src, dst)
432 bfd *abfd;
433 const Elf_Internal_Rela *src;
434 Elf_External_Rela *dst;
435{
436 put_word (abfd, src->r_offset, dst->r_offset);
437 put_word (abfd, src->r_info, dst->r_info);
438 put_signed_word (abfd, src->r_addend, dst->r_addend);
439}
440
441INLINE void
442elf_swap_dyn_in (abfd, p, dst)
443 bfd *abfd;
444 const PTR p;
445 Elf_Internal_Dyn *dst;
446{
447 const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
448
449 dst->d_tag = get_word (abfd, src->d_tag);
450 dst->d_un.d_val = get_word (abfd, src->d_un.d_val);
451}
452
453INLINE void
c7ac6ff8 454elf_swap_dyn_out (abfd, src, p)
252b5132
RH
455 bfd *abfd;
456 const Elf_Internal_Dyn *src;
c7ac6ff8 457 PTR p;
252b5132 458{
c7ac6ff8
MM
459 Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
460
252b5132
RH
461 put_word (abfd, src->d_tag, dst->d_tag);
462 put_word (abfd, src->d_un.d_val, dst->d_un.d_val);
463}
464\f
465/* ELF .o/exec file reading */
466
467
468/* Begin processing a given object.
469
470 First we validate the file by reading in the ELF header and checking
471 the magic number. */
472
473static INLINE boolean
474elf_file_p (x_ehdrp)
475 Elf_External_Ehdr *x_ehdrp;
476{
477 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
478 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
479 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
480 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
481}
482
483/* Check to see if the file associated with ABFD matches the target vector
484 that ABFD points to.
485
486 Note that we may be called several times with the same ABFD, but different
487 target vectors, most of which will not match. We have to avoid leaving
488 any side effects in ABFD, or any data it points to (like tdata), if the
489 file does not match the target vector. */
490
491const bfd_target *
492elf_object_p (abfd)
493 bfd *abfd;
494{
495 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
496 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
497 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
498 Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */
499 unsigned int shindex;
500 char *shstrtab; /* Internal copy of section header stringtab */
501 struct elf_backend_data *ebd;
502 struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd);
a17cc40f
HPN
503 struct sec *preserved_sections = abfd->sections;
504 unsigned int preserved_section_count = abfd->section_count;
a77a9fef
HPN
505 enum bfd_architecture previous_arch = bfd_get_arch (abfd);
506 unsigned long previous_mach = bfd_get_mach (abfd);
252b5132
RH
507 struct elf_obj_tdata *new_tdata = NULL;
508 asection *s;
509
a17cc40f
HPN
510 /* Clear section information, since there might be a recognized bfd that
511 we now check if we can replace, and we don't want to append to it. */
512 abfd->sections = NULL;
513 abfd->section_count = 0;
514
252b5132
RH
515 /* Read in the ELF header in external format. */
516
517 if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
518 {
519 if (bfd_get_error () != bfd_error_system_call)
520 goto got_wrong_format_error;
521 else
522 goto got_no_match;
523 }
524
525 /* Now check to see if we have a valid ELF file, and one that BFD can
526 make use of. The magic number must match, the address size ('class')
527 and byte-swapping must match our XVEC entry, and it must have a
528 section header table (FIXME: See comments re sections at top of this
529 file). */
530
531 if ((elf_file_p (&x_ehdr) == false) ||
532 (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) ||
533 (x_ehdr.e_ident[EI_CLASS] != ELFCLASS))
534 goto got_wrong_format_error;
535
536 /* Check that file's byte order matches xvec's */
537 switch (x_ehdr.e_ident[EI_DATA])
538 {
539 case ELFDATA2MSB: /* Big-endian */
540 if (! bfd_header_big_endian (abfd))
541 goto got_wrong_format_error;
542 break;
543 case ELFDATA2LSB: /* Little-endian */
544 if (! bfd_header_little_endian (abfd))
545 goto got_wrong_format_error;
546 break;
547 case ELFDATANONE: /* No data encoding specified */
548 default: /* Unknown data encoding specified */
549 goto got_wrong_format_error;
550 }
551
552 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
553 the tdata pointer in the bfd. */
554
555 new_tdata = ((struct elf_obj_tdata *)
556 bfd_zalloc (abfd, sizeof (struct elf_obj_tdata)));
557 if (new_tdata == NULL)
558 goto got_no_match;
559 elf_tdata (abfd) = new_tdata;
560
561 /* Now that we know the byte order, swap in the rest of the header */
562 i_ehdrp = elf_elfheader (abfd);
563 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
564#if DEBUG & 1
565 elf_debug_file (i_ehdrp);
566#endif
567
568 /* Reject ET_CORE (header indicates core file, not object file) */
569 if (i_ehdrp->e_type == ET_CORE)
570 goto got_wrong_format_error;
571
572 /* If there is no section header table, we're hosed. */
573 if (i_ehdrp->e_shoff == 0)
574 goto got_wrong_format_error;
575
576 /* As a simple sanity check, verify that the what BFD thinks is the
577 size of each section header table entry actually matches the size
578 recorded in the file. */
579 if (i_ehdrp->e_shentsize != sizeof (x_shdr))
580 goto got_wrong_format_error;
581
582 ebd = get_elf_backend_data (abfd);
583
584 /* Check that the ELF e_machine field matches what this particular
585 BFD format expects. */
586 if (ebd->elf_machine_code != i_ehdrp->e_machine
587 && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
588 && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
589 {
590 const bfd_target * const *target_ptr;
591
592 if (ebd->elf_machine_code != EM_NONE)
593 goto got_wrong_format_error;
594
595 /* This is the generic ELF target. Let it match any ELF target
596 for which we do not have a specific backend. */
597 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
598 {
599 struct elf_backend_data *back;
600
601 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
602 continue;
603 back = (struct elf_backend_data *) (*target_ptr)->backend_data;
604 if (back->elf_machine_code == i_ehdrp->e_machine
605 || (back->elf_machine_alt1 != 0
606 && back->elf_machine_alt1 == i_ehdrp->e_machine)
607 || (back->elf_machine_alt2 != 0
608 && back->elf_machine_alt2 == i_ehdrp->e_machine))
609 {
610 /* target_ptr is an ELF backend which matches this
611 object file, so reject the generic ELF target. */
612 goto got_wrong_format_error;
613 }
614 }
615 }
616
617 if (i_ehdrp->e_type == ET_EXEC)
618 abfd->flags |= EXEC_P;
619 else if (i_ehdrp->e_type == ET_DYN)
620 abfd->flags |= DYNAMIC;
621
622 if (i_ehdrp->e_phnum > 0)
623 abfd->flags |= D_PAGED;
624
625 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
626 {
627 /* It's OK if this fails for the generic target. */
628 if (ebd->elf_machine_code != EM_NONE)
629 goto got_no_match;
630 }
631
632 /* Remember the entry point specified in the ELF file header. */
448cafa4 633 bfd_set_start_address (abfd, i_ehdrp->e_entry);
252b5132
RH
634
635 /* Allocate space for a copy of the section header table in
636 internal form, seek to the section header table in the file,
637 read it in, and convert it to internal form. */
638 i_shdrp = ((Elf_Internal_Shdr *)
639 bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
640 elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
641 bfd_alloc (abfd,
642 sizeof (i_shdrp) * i_ehdrp->e_shnum));
643 if (!i_shdrp || !elf_elfsections (abfd))
644 goto got_no_match;
645 if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0)
646 goto got_no_match;
647 for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++)
648 {
649 if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr))
650 goto got_no_match;
651 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
652 elf_elfsections (abfd)[shindex] = i_shdrp + shindex;
653
654 /* If the section is loaded, but not page aligned, clear
655 D_PAGED. */
656 if ((i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
657 && i_shdrp[shindex].sh_type != SHT_NOBITS
658 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
659 % ebd->maxpagesize)
660 != 0))
661 abfd->flags &= ~D_PAGED;
662 }
663 if (i_ehdrp->e_shstrndx)
664 {
665 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
666 goto got_no_match;
667 }
668
669 /* Read in the program headers. */
670 if (i_ehdrp->e_phnum == 0)
671 elf_tdata (abfd)->phdr = NULL;
672 else
673 {
674 Elf_Internal_Phdr *i_phdr;
675 unsigned int i;
676
677 elf_tdata (abfd)->phdr = ((Elf_Internal_Phdr *)
678 bfd_alloc (abfd,
679 (i_ehdrp->e_phnum
680 * sizeof (Elf_Internal_Phdr))));
681 if (elf_tdata (abfd)->phdr == NULL)
682 goto got_no_match;
683 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
684 goto got_no_match;
685 i_phdr = elf_tdata (abfd)->phdr;
686 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
687 {
688 Elf_External_Phdr x_phdr;
689
690 if (bfd_read ((PTR) &x_phdr, sizeof x_phdr, 1, abfd)
691 != sizeof x_phdr)
692 goto got_no_match;
693 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
694 }
695 }
696
697 /* Read in the string table containing the names of the sections. We
698 will need the base pointer to this table later. */
699 /* We read this inline now, so that we don't have to go through
700 bfd_section_from_shdr with it (since this particular strtab is
701 used to find all of the ELF section names.) */
702
703 shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
704 if (!shstrtab)
705 goto got_no_match;
706
707 /* Once all of the section headers have been read and converted, we
708 can start processing them. Note that the first section header is
709 a dummy placeholder entry, so we ignore it. */
710
711 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
712 {
713 if (! bfd_section_from_shdr (abfd, shindex))
714 goto got_no_match;
715 }
716
717 /* Let the backend double check the format and override global
718 information. */
719 if (ebd->elf_backend_object_p)
720 {
721 if ((*ebd->elf_backend_object_p) (abfd) == false)
722 goto got_wrong_format_error;
723 }
724
725 /* If we have created any reloc sections that are associated with
726 debugging sections, mark the reloc sections as debugging as well. */
727 for (s = abfd->sections; s != NULL; s = s->next)
728 {
729 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
730 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
731 && elf_section_data (s)->this_hdr.sh_info > 0)
732 {
733 unsigned long targ_index;
734 asection *targ_sec;
735
736 targ_index = elf_section_data (s)->this_hdr.sh_info;
737 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
738 if (targ_sec != NULL
739 && (targ_sec->flags & SEC_DEBUGGING) != 0)
740 s->flags |= SEC_DEBUGGING;
741 }
742 }
743
744 return (abfd->xvec);
745
746 got_wrong_format_error:
a77a9fef
HPN
747 /* There is way too much undoing of half-known state here. The caller,
748 bfd_check_format_matches, really shouldn't iterate on live bfd's to
749 check match/no-match like it does. We have to rely on that a call to
750 bfd_default_set_arch_mach with the previously known mach, undoes what
751 was done by the first bfd_default_set_arch_mach (with mach 0) here.
752 For this to work, only elf-data and the mach may be changed by the
753 target-specific elf_backend_object_p function. Note that saving the
754 whole bfd here and restoring it would be even worse; the first thing
755 you notice is that the cached bfd file position gets out of sync. */
756 bfd_default_set_arch_mach (abfd, previous_arch, previous_mach);
252b5132
RH
757 bfd_set_error (bfd_error_wrong_format);
758 got_no_match:
759 if (new_tdata != NULL
760 && new_tdata->elf_sect_ptr != NULL)
761 bfd_release (abfd, new_tdata->elf_sect_ptr);
762 if (i_shdrp != NULL)
763 bfd_release (abfd, i_shdrp);
764 if (new_tdata != NULL)
765 bfd_release (abfd, new_tdata);
766 elf_tdata (abfd) = preserved_tdata;
a17cc40f
HPN
767 abfd->sections = preserved_sections;
768 abfd->section_count = preserved_section_count;
252b5132
RH
769 return (NULL);
770}
771\f
772/* ELF .o/exec file writing */
773
774/* Write out the relocs. */
775
b9f66672
JL
776void
777elf_write_relocs (abfd, sec, data)
252b5132
RH
778 bfd *abfd;
779 asection *sec;
780 PTR data;
781{
782 boolean *failedp = (boolean *) data;
783 Elf_Internal_Shdr *rela_hdr;
784 Elf_External_Rela *outbound_relocas;
785 Elf_External_Rel *outbound_relocs;
786 unsigned int idx;
bf572ba0 787 int use_rela_p;
252b5132
RH
788 asymbol *last_sym = 0;
789 int last_sym_idx = 0;
790
791 /* If we have already failed, don't do anything. */
792 if (*failedp)
793 return;
794
795 if ((sec->flags & SEC_RELOC) == 0)
796 return;
797
798 /* The linker backend writes the relocs out itself, and sets the
799 reloc_count field to zero to inhibit writing them here. Also,
800 sometimes the SEC_RELOC flag gets set even when there aren't any
801 relocs. */
802 if (sec->reloc_count == 0)
803 return;
804
805 rela_hdr = &elf_section_data (sec)->rel_hdr;
806
807 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
808 rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
809 if (rela_hdr->contents == NULL)
810 {
811 *failedp = true;
812 return;
813 }
814
bf572ba0
MM
815 /* Figure out whether the relocations are RELA or REL relocations. */
816 if (rela_hdr->sh_type == SHT_RELA)
817 use_rela_p = true;
818 else if (rela_hdr->sh_type == SHT_REL)
819 use_rela_p = false;
820 else
821 /* Every relocation section should be either an SHT_RELA or an
822 SHT_REL section. */
823 abort ();
824
252b5132
RH
825 /* orelocation has the data, reloc_count has the count... */
826 if (use_rela_p)
827 {
828 outbound_relocas = (Elf_External_Rela *) rela_hdr->contents;
829
830 for (idx = 0; idx < sec->reloc_count; idx++)
831 {
832 Elf_Internal_Rela dst_rela;
833 Elf_External_Rela *src_rela;
834 arelent *ptr;
835 asymbol *sym;
836 int n;
837
838 ptr = sec->orelocation[idx];
839 src_rela = outbound_relocas + idx;
840
841 /* The address of an ELF reloc is section relative for an object
842 file, and absolute for an executable file or shared library.
843 The address of a BFD reloc is always section relative. */
844 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
845 dst_rela.r_offset = ptr->address;
846 else
847 dst_rela.r_offset = ptr->address + sec->vma;
848
849 sym = *ptr->sym_ptr_ptr;
850 if (sym == last_sym)
851 n = last_sym_idx;
852 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
853 n = STN_UNDEF;
854 else
855 {
856 last_sym = sym;
857 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
858 if (n < 0)
859 {
860 *failedp = true;
861 return;
862 }
863 last_sym_idx = n;
864 }
865
866 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
867 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
868 && ! _bfd_elf_validate_reloc (abfd, ptr))
869 {
870 *failedp = true;
871 return;
872 }
873
874 dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
875
876 dst_rela.r_addend = ptr->addend;
877 elf_swap_reloca_out (abfd, &dst_rela, src_rela);
878 }
879 }
880 else
881 /* REL relocations */
882 {
883 outbound_relocs = (Elf_External_Rel *) rela_hdr->contents;
884
885 for (idx = 0; idx < sec->reloc_count; idx++)
886 {
887 Elf_Internal_Rel dst_rel;
888 Elf_External_Rel *src_rel;
889 arelent *ptr;
890 int n;
891 asymbol *sym;
892
893 ptr = sec->orelocation[idx];
894 sym = *ptr->sym_ptr_ptr;
895 src_rel = outbound_relocs + idx;
896
897 /* The address of an ELF reloc is section relative for an object
898 file, and absolute for an executable file or shared library.
899 The address of a BFD reloc is always section relative. */
900 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
901 dst_rel.r_offset = ptr->address;
902 else
903 dst_rel.r_offset = ptr->address + sec->vma;
904
905 if (sym == last_sym)
906 n = last_sym_idx;
eeaf533e
ILT
907 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
908 n = STN_UNDEF;
252b5132
RH
909 else
910 {
911 last_sym = sym;
912 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
913 if (n < 0)
914 {
915 *failedp = true;
916 return;
917 }
918 last_sym_idx = n;
919 }
920
2f66722d
AM
921 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
922 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
252b5132
RH
923 && ! _bfd_elf_validate_reloc (abfd, ptr))
924 {
925 *failedp = true;
926 return;
927 }
928
929 dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type);
930
931 elf_swap_reloc_out (abfd, &dst_rel, src_rel);
932 }
933 }
934}
935
936/* Write out the program headers. */
937
938int
939elf_write_out_phdrs (abfd, phdr, count)
940 bfd *abfd;
941 const Elf_Internal_Phdr *phdr;
942 int count;
943{
944 while (count--)
945 {
946 Elf_External_Phdr extphdr;
947 elf_swap_phdr_out (abfd, phdr, &extphdr);
948 if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), 1, abfd)
949 != sizeof (Elf_External_Phdr))
950 return -1;
951 phdr++;
952 }
953 return 0;
954}
955
956/* Write out the section headers and the ELF file header. */
957
958boolean
959elf_write_shdrs_and_ehdr (abfd)
960 bfd *abfd;
961{
962 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
963 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
964 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
965 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
966 unsigned int count;
967
968 i_ehdrp = elf_elfheader (abfd);
969 i_shdrp = elf_elfsections (abfd);
970
971 /* swap the header before spitting it out... */
972
973#if DEBUG & 1
974 elf_debug_file (i_ehdrp);
975#endif
976 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
977 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
978 || (bfd_write ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd)
979 != sizeof (x_ehdr)))
980 return false;
981
982 /* at this point we've concocted all the ELF sections... */
983 x_shdrp = (Elf_External_Shdr *)
984 bfd_alloc (abfd, sizeof (*x_shdrp) * (i_ehdrp->e_shnum));
985 if (!x_shdrp)
986 return false;
987
988 for (count = 0; count < i_ehdrp->e_shnum; count++)
989 {
990#if DEBUG & 2
991 elf_debug_section (count, i_shdrp[count]);
992#endif
993 elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count);
994 }
995 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
996 || (bfd_write ((PTR) x_shdrp, sizeof (*x_shdrp), i_ehdrp->e_shnum, abfd)
997 != sizeof (*x_shdrp) * i_ehdrp->e_shnum))
998 return false;
999
1000 /* need to dump the string table too... */
1001
1002 return true;
1003}
1004
1005long
1006elf_slurp_symbol_table (abfd, symptrs, dynamic)
1007 bfd *abfd;
1008 asymbol **symptrs; /* Buffer for generated bfd symbols */
1009 boolean dynamic;
1010{
1011 Elf_Internal_Shdr *hdr;
1012 Elf_Internal_Shdr *verhdr;
1013 unsigned long symcount; /* Number of external ELF symbols */
1014 elf_symbol_type *sym; /* Pointer to current bfd symbol */
1015 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1016 Elf_Internal_Sym i_sym;
1017 Elf_External_Sym *x_symp = NULL;
1018 Elf_External_Versym *x_versymp = NULL;
1019
1020 /* Read each raw ELF symbol, converting from external ELF form to
1021 internal ELF form, and then using the information to create a
1022 canonical bfd symbol table entry.
1023
1024 Note that we allocate the initial bfd canonical symbol buffer
1025 based on a one-to-one mapping of the ELF symbols to canonical
1026 symbols. We actually use all the ELF symbols, so there will be no
1027 space left over at the end. When we have all the symbols, we
1028 build the caller's pointer vector. */
1029
1030 if (! dynamic)
1031 {
1032 hdr = &elf_tdata (abfd)->symtab_hdr;
1033 verhdr = NULL;
1034 }
1035 else
1036 {
1037 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1038 if (elf_dynversym (abfd) == 0)
1039 verhdr = NULL;
1040 else
1041 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1042 if ((elf_tdata (abfd)->dynverdef_section != 0
1043 && elf_tdata (abfd)->verdef == NULL)
1044 || (elf_tdata (abfd)->dynverref_section != 0
1045 && elf_tdata (abfd)->verref == NULL))
1046 {
1047 if (! _bfd_elf_slurp_version_tables (abfd))
1048 return -1;
1049 }
1050 }
1051
1052 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
1053 return -1;
1054
1055 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1056
1057 if (symcount == 0)
1058 sym = symbase = NULL;
1059 else
1060 {
1061 unsigned long i;
1062
1063 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
1064 return -1;
1065
1066 symbase = ((elf_symbol_type *)
1067 bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type)));
1068 if (symbase == (elf_symbol_type *) NULL)
1069 return -1;
1070 sym = symbase;
1071
1072 /* Temporarily allocate room for the raw ELF symbols. */
1073 x_symp = ((Elf_External_Sym *)
1074 bfd_malloc (symcount * sizeof (Elf_External_Sym)));
1075 if (x_symp == NULL && symcount != 0)
1076 goto error_return;
1077
1078 if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd)
1079 != symcount * sizeof (Elf_External_Sym))
1080 goto error_return;
1081
1082 /* Read the raw ELF version symbol information. */
1083
1084 if (verhdr != NULL
1085 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1086 {
1087 (*_bfd_error_handler)
1088 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1089 abfd->filename,
1090 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1091 symcount);
1092
1093 /* Slurp in the symbols without the version information,
1094 since that is more helpful than just quitting. */
1095 verhdr = NULL;
1096 }
1097
1098 if (verhdr != NULL)
1099 {
1100 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1101 goto error_return;
1102
1103 x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1104 if (x_versymp == NULL && verhdr->sh_size != 0)
1105 goto error_return;
1106
1107 if (bfd_read ((PTR) x_versymp, 1, verhdr->sh_size, abfd)
1108 != verhdr->sh_size)
1109 goto error_return;
1110 }
1111
1112 /* Skip first symbol, which is a null dummy. */
1113 for (i = 1; i < symcount; i++)
1114 {
1115 elf_swap_symbol_in (abfd, x_symp + i, &i_sym);
1116 memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
1117#ifdef ELF_KEEP_EXTSYM
1118 memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym));
1119#endif
1120 sym->symbol.the_bfd = abfd;
1121
1122 sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
1123 hdr->sh_link,
1124 i_sym.st_name);
1125
1126 sym->symbol.value = i_sym.st_value;
1127
1128 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE)
1129 {
1130 sym->symbol.section = section_from_elf_index (abfd,
1131 i_sym.st_shndx);
1132 if (sym->symbol.section == NULL)
1133 {
1134 /* This symbol is in a section for which we did not
1135 create a BFD section. Just use bfd_abs_section,
1136 although it is wrong. FIXME. */
1137 sym->symbol.section = bfd_abs_section_ptr;
1138 }
1139 }
1140 else if (i_sym.st_shndx == SHN_ABS)
1141 {
1142 sym->symbol.section = bfd_abs_section_ptr;
1143 }
1144 else if (i_sym.st_shndx == SHN_COMMON)
1145 {
1146 sym->symbol.section = bfd_com_section_ptr;
1147 /* Elf puts the alignment into the `value' field, and
1148 the size into the `size' field. BFD wants to see the
1149 size in the value field, and doesn't care (at the
1150 moment) about the alignment. */
1151 sym->symbol.value = i_sym.st_size;
1152 }
1153 else if (i_sym.st_shndx == SHN_UNDEF)
1154 {
1155 sym->symbol.section = bfd_und_section_ptr;
1156 }
1157 else
1158 sym->symbol.section = bfd_abs_section_ptr;
1159
1160 /* If this is a relocateable file, then the symbol value is
1161 already section relative. */
1162 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1163 sym->symbol.value -= sym->symbol.section->vma;
1164
1165 switch (ELF_ST_BIND (i_sym.st_info))
1166 {
1167 case STB_LOCAL:
1168 sym->symbol.flags |= BSF_LOCAL;
1169 break;
1170 case STB_GLOBAL:
1171 if (i_sym.st_shndx != SHN_UNDEF
1172 && i_sym.st_shndx != SHN_COMMON)
1173 sym->symbol.flags |= BSF_GLOBAL;
1174 break;
1175 case STB_WEAK:
1176 sym->symbol.flags |= BSF_WEAK;
1177 break;
1178 }
1179
1180 switch (ELF_ST_TYPE (i_sym.st_info))
1181 {
1182 case STT_SECTION:
1183 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1184 break;
1185 case STT_FILE:
1186 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1187 break;
1188 case STT_FUNC:
1189 sym->symbol.flags |= BSF_FUNCTION;
1190 break;
1191 case STT_OBJECT:
1192 sym->symbol.flags |= BSF_OBJECT;
1193 break;
1194 }
1195
1196 if (dynamic)
1197 sym->symbol.flags |= BSF_DYNAMIC;
1198
1199 if (x_versymp != NULL)
1200 {
1201 Elf_Internal_Versym iversym;
1202
1203 _bfd_elf_swap_versym_in (abfd, x_versymp + i, &iversym);
1204 sym->version = iversym.vs_vers;
1205 }
1206
1207 /* Do some backend-specific processing on this symbol. */
1208 {
1209 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1210 if (ebd->elf_backend_symbol_processing)
1211 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1212 }
1213
1214 sym++;
1215 }
1216 }
1217
1218 /* Do some backend-specific processing on this symbol table. */
1219 {
1220 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1221 if (ebd->elf_backend_symbol_table_processing)
1222 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1223 }
1224
1225 /* We rely on the zalloc to clear out the final symbol entry. */
1226
1227 symcount = sym - symbase;
1228
1229 /* Fill in the user's symbol pointer vector if needed. */
1230 if (symptrs)
1231 {
1232 long l = symcount;
1233
1234 sym = symbase;
1235 while (l-- > 0)
1236 {
1237 *symptrs++ = &sym->symbol;
1238 sym++;
1239 }
1240 *symptrs = 0; /* Final null pointer */
1241 }
1242
1243 if (x_versymp != NULL)
1244 free (x_versymp);
1245 if (x_symp != NULL)
1246 free (x_symp);
1247 return symcount;
1248error_return:
1249 if (x_versymp != NULL)
1250 free (x_versymp);
1251 if (x_symp != NULL)
1252 free (x_symp);
1253 return -1;
1254}
1255
60bcf0fa 1256/* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
42fdc509 1257 them. */
252b5132
RH
1258
1259static boolean
42fdc509
MM
1260elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
1261 relents, symbols, dynamic)
252b5132
RH
1262 bfd *abfd;
1263 asection *asect;
42fdc509
MM
1264 Elf_Internal_Shdr *rel_hdr;
1265 bfd_size_type reloc_count;
1266 arelent *relents;
252b5132
RH
1267 asymbol **symbols;
1268 boolean dynamic;
1269{
1270 struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
252b5132
RH
1271 PTR allocated = NULL;
1272 bfd_byte *native_relocs;
252b5132
RH
1273 arelent *relent;
1274 unsigned int i;
1275 int entsize;
1276
252b5132
RH
1277 allocated = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size);
1278 if (allocated == NULL)
1279 goto error_return;
1280
1281 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1282 || (bfd_read (allocated, 1, rel_hdr->sh_size, abfd)
1283 != rel_hdr->sh_size))
1284 goto error_return;
1285
1286 native_relocs = (bfd_byte *) allocated;
1287
252b5132
RH
1288 entsize = rel_hdr->sh_entsize;
1289 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1290 || entsize == sizeof (Elf_External_Rela));
1291
1292 for (i = 0, relent = relents;
1293 i < reloc_count;
1294 i++, relent++, native_relocs += entsize)
1295 {
1296 Elf_Internal_Rela rela;
1297 Elf_Internal_Rel rel;
1298
1299 if (entsize == sizeof (Elf_External_Rela))
1300 elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela);
1301 else
1302 {
1303 elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel);
1304 rela.r_offset = rel.r_offset;
1305 rela.r_info = rel.r_info;
1306 rela.r_addend = 0;
1307 }
1308
1309 /* The address of an ELF reloc is section relative for an object
1310 file, and absolute for an executable file or shared library.
1311 The address of a normal BFD reloc is always section relative,
1312 and the address of a dynamic reloc is absolute.. */
1313 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1314 relent->address = rela.r_offset;
1315 else
1316 relent->address = rela.r_offset - asect->vma;
1317
1318 if (ELF_R_SYM (rela.r_info) == 0)
1319 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1320 else
1321 {
1322 asymbol **ps, *s;
1323
1324 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1325 s = *ps;
1326
1327 /* Canonicalize ELF section symbols. FIXME: Why? */
1328 if ((s->flags & BSF_SECTION_SYM) == 0)
1329 relent->sym_ptr_ptr = ps;
1330 else
1331 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
1332 }
1333
1334 relent->addend = rela.r_addend;
1335
1336 if (entsize == sizeof (Elf_External_Rela))
1337 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1338 else
1339 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
1340 }
1341
252b5132
RH
1342 if (allocated != NULL)
1343 free (allocated);
1344
1345 return true;
1346
1347 error_return:
1348 if (allocated != NULL)
1349 free (allocated);
1350 return false;
1351}
1352
42fdc509
MM
1353/* Read in and swap the external relocs. */
1354
b9f66672 1355boolean
42fdc509
MM
1356elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
1357 bfd *abfd;
1358 asection *asect;
1359 asymbol **symbols;
1360 boolean dynamic;
1361{
1362 struct bfd_elf_section_data * const d = elf_section_data (asect);
1363 Elf_Internal_Shdr *rel_hdr;
1364 Elf_Internal_Shdr *rel_hdr2;
1365 bfd_size_type reloc_count;
1366 bfd_size_type reloc_count2;
1367 arelent *relents;
1368
1369 if (asect->relocation != NULL)
1370 return true;
1371
1372 if (! dynamic)
1373 {
1374 if ((asect->flags & SEC_RELOC) == 0
1375 || asect->reloc_count == 0)
1376 return true;
1377
1378 rel_hdr = &d->rel_hdr;
1379 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
1380 rel_hdr2 = d->rel_hdr2;
60bcf0fa 1381 reloc_count2 = (rel_hdr2
42fdc509
MM
1382 ? (rel_hdr2->sh_size / rel_hdr2->sh_entsize)
1383 : 0);
1384
1385 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1386 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1387 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1388
1389 }
1390 else
1391 {
57e21bef
MM
1392 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1393 case because relocations against this section may use the
1394 dynamic symbol table, and in that case bfd_section_from_shdr
1395 in elf.c does not update the RELOC_COUNT. */
42fdc509
MM
1396 if (asect->_raw_size == 0)
1397 return true;
1398
1399 rel_hdr = &d->this_hdr;
1400 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
1401 rel_hdr2 = NULL;
57e21bef 1402 reloc_count2 = 0;
42fdc509
MM
1403 }
1404
60bcf0fa
NC
1405 relents = ((arelent *)
1406 bfd_alloc (abfd,
57e21bef 1407 (reloc_count + reloc_count2) * sizeof (arelent)));
42fdc509
MM
1408 if (relents == NULL)
1409 return false;
1410
1411 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1412 rel_hdr, reloc_count,
1413 relents,
1414 symbols, dynamic))
1415 return false;
60bcf0fa
NC
1416
1417 if (rel_hdr2
42fdc509
MM
1418 && !elf_slurp_reloc_table_from_section (abfd, asect,
1419 rel_hdr2, reloc_count2,
1420 relents + reloc_count,
1421 symbols, dynamic))
1422 return false;
1423
60bcf0fa 1424
42fdc509
MM
1425 asect->relocation = relents;
1426 return true;
1427}
1428
252b5132
RH
1429#ifdef DEBUG
1430static void
1431elf_debug_section (num, hdr)
1432 int num;
1433 Elf_Internal_Shdr *hdr;
1434{
1435 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1436 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1437 (long) hdr);
1438 fprintf (stderr,
1439 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1440 (long) hdr->sh_name,
1441 (long) hdr->sh_type,
1442 (long) hdr->sh_flags);
1443 fprintf (stderr,
1444 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1445 (long) hdr->sh_addr,
1446 (long) hdr->sh_offset,
1447 (long) hdr->sh_size);
1448 fprintf (stderr,
1449 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1450 (long) hdr->sh_link,
1451 (long) hdr->sh_info,
1452 (long) hdr->sh_addralign);
1453 fprintf (stderr, "sh_entsize = %ld\n",
1454 (long) hdr->sh_entsize);
1455 fflush (stderr);
1456}
1457
1458static void
1459elf_debug_file (ehdrp)
1460 Elf_Internal_Ehdr *ehdrp;
1461{
1462 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1463 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1464 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1465 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1466 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1467 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1468 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1469}
1470
1471static char *
1472elf_symbol_flags (flags)
1473 flagword flags;
1474{
1475 static char buffer[1024];
1476
1477 buffer[0] = '\0';
1478 if (flags & BSF_LOCAL)
1479 strcat (buffer, " local");
1480
1481 if (flags & BSF_GLOBAL)
1482 strcat (buffer, " global");
1483
1484 if (flags & BSF_DEBUGGING)
1485 strcat (buffer, " debug");
1486
1487 if (flags & BSF_FUNCTION)
1488 strcat (buffer, " function");
1489
1490 if (flags & BSF_KEEP)
1491 strcat (buffer, " keep");
1492
1493 if (flags & BSF_KEEP_G)
1494 strcat (buffer, " keep_g");
1495
1496 if (flags & BSF_WEAK)
1497 strcat (buffer, " weak");
1498
1499 if (flags & BSF_SECTION_SYM)
1500 strcat (buffer, " section-sym");
1501
1502 if (flags & BSF_OLD_COMMON)
1503 strcat (buffer, " old-common");
1504
1505 if (flags & BSF_NOT_AT_END)
1506 strcat (buffer, " not-at-end");
1507
1508 if (flags & BSF_CONSTRUCTOR)
1509 strcat (buffer, " constructor");
1510
1511 if (flags & BSF_WARNING)
1512 strcat (buffer, " warning");
1513
1514 if (flags & BSF_INDIRECT)
1515 strcat (buffer, " indirect");
1516
1517 if (flags & BSF_FILE)
1518 strcat (buffer, " file");
1519
1520 if (flags & DYNAMIC)
1521 strcat (buffer, " dynamic");
1522
1523 if (flags & ~(BSF_LOCAL
1524 | BSF_GLOBAL
1525 | BSF_DEBUGGING
1526 | BSF_FUNCTION
1527 | BSF_KEEP
1528 | BSF_KEEP_G
1529 | BSF_WEAK
1530 | BSF_SECTION_SYM
1531 | BSF_OLD_COMMON
1532 | BSF_NOT_AT_END
1533 | BSF_CONSTRUCTOR
1534 | BSF_WARNING
1535 | BSF_INDIRECT
1536 | BSF_FILE
1537 | BSF_DYNAMIC))
1538 strcat (buffer, " unknown-bits");
1539
1540 return buffer;
1541}
1542#endif
1543\f
1544#include "elfcore.h"
1545#include "elflink.h"
1546\f
1547/* Size-dependent data and functions. */
1548const struct elf_size_info NAME(_bfd_elf,size_info) = {
1549 sizeof (Elf_External_Ehdr),
1550 sizeof (Elf_External_Phdr),
1551 sizeof (Elf_External_Shdr),
1552 sizeof (Elf_External_Rel),
1553 sizeof (Elf_External_Rela),
1554 sizeof (Elf_External_Sym),
1555 sizeof (Elf_External_Dyn),
1556 sizeof (Elf_External_Note),
70bcb145 1557 4,
c7ac6ff8 1558 1,
252b5132
RH
1559 ARCH_SIZE, FILE_ALIGN,
1560 ELFCLASS, EV_CURRENT,
1561 elf_write_out_phdrs,
1562 elf_write_shdrs_and_ehdr,
b9f66672 1563 elf_write_relocs,
252b5132
RH
1564 elf_swap_symbol_out,
1565 elf_slurp_reloc_table,
1566 elf_slurp_symbol_table,
c7ac6ff8
MM
1567 elf_swap_dyn_in,
1568 elf_swap_dyn_out,
1569 NULL,
1570 NULL,
1571 NULL,
1572 NULL
252b5132 1573};