Merge in stuff accidently commited to sh3e branch
[deliverable/binutils-gdb.git] / bfd / elfcode.h
CommitLineData
244ffee7 1/* ELF executable support for BFD.
51fbf454 2 Copyright 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
244ffee7
JK
3
4 Written by Fred Fish @ Cygnus Support, from information published
5 in "UNIX System V Release 4, Programmers Guide: ANSI C and
6 Programming Support Tools". Sufficient support for gdb.
7
8 Rewritten by Mark Eichin @ Cygnus Support, from information
9 published in "System V Application Binary Interface", chapters 4
10 and 5, as well as the various "Processor Supplement" documents
11 derived from it. Added support for assembler and other object file
12 utilities. Further work done by Ken Raeburn (Cygnus Support), Michael
13 Meissner (Open Software Foundation), and Peter Hoogenboom (University
14 of Utah) to finish and extend this.
15
16This file is part of BFD, the Binary File Descriptor library.
17
18This program is free software; you can redistribute it and/or modify
19it under the terms of the GNU General Public License as published by
20the Free Software Foundation; either version 2 of the License, or
21(at your option) any later version.
22
23This program is distributed in the hope that it will be useful,
24but WITHOUT ANY WARRANTY; without even the implied warranty of
25MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26GNU General Public License for more details.
27
28You should have received a copy of the GNU General Public License
29along with this program; if not, write to the Free Software
b818a325 30Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
244ffee7 31
244ffee7
JK
32/* Problems and other issues to resolve.
33
34 (1) BFD expects there to be some fixed number of "sections" in
35 the object file. I.E. there is a "section_count" variable in the
36 bfd structure which contains the number of sections. However, ELF
37 supports multiple "views" of a file. In particular, with current
38 implementations, executable files typically have two tables, a
39 program header table and a section header table, both of which
40 partition the executable.
41
42 In ELF-speak, the "linking view" of the file uses the section header
43 table to access "sections" within the file, and the "execution view"
44 uses the program header table to access "segments" within the file.
45 "Segments" typically may contain all the data from one or more
46 "sections".
47
48 Note that the section header table is optional in ELF executables,
49 but it is this information that is most useful to gdb. If the
50 section header table is missing, then gdb should probably try
51 to make do with the program header table. (FIXME)
52
6a3eb9b6
KR
53 (2) The code in this file is compiled twice, once in 32-bit mode and
54 once in 64-bit mode. More of it should be made size-independent
55 and moved into elf.c.
56
d24928c0
KR
57 (3) ELF section symbols are handled rather sloppily now. This should
58 be cleaned up, and ELF section symbols reconciled with BFD section
59 symbols.
5546cc7e
KR
60
61 (4) We need a published spec for 64-bit ELF. We've got some stuff here
62 that we're using for SPARC V9 64-bit chips, but don't assume that
63 it's cast in stone.
d24928c0 64 */
244ffee7
JK
65
66#include <string.h> /* For strrchr and friends */
67#include "bfd.h"
68#include "sysdep.h"
6ec3bb6a 69#include "bfdlink.h"
244ffee7 70#include "libbfd.h"
6ab826bd 71#include "elf-bfd.h"
244ffee7 72
32090b8e 73/* Renaming structures, typedefs, macros and functions to be size-specific. */
244ffee7 74#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
244ffee7 75#define Elf_External_Sym NAME(Elf,External_Sym)
244ffee7 76#define Elf_External_Shdr NAME(Elf,External_Shdr)
244ffee7 77#define Elf_External_Phdr NAME(Elf,External_Phdr)
244ffee7
JK
78#define Elf_External_Rel NAME(Elf,External_Rel)
79#define Elf_External_Rela NAME(Elf,External_Rela)
013dec1a 80#define Elf_External_Dyn NAME(Elf,External_Dyn)
244ffee7 81
244ffee7
JK
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)
cb71adf1
PS
84#define elf_core_file_matches_executable_p \
85 NAME(bfd_elf,core_file_matches_executable_p)
244ffee7
JK
86#define elf_object_p NAME(bfd_elf,object_p)
87#define elf_core_file_p NAME(bfd_elf,core_file_p)
244ffee7 88#define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound)
cb71adf1
PS
89#define elf_get_dynamic_symtab_upper_bound \
90 NAME(bfd_elf,get_dynamic_symtab_upper_bound)
013dec1a
ILT
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)
71edd06d
ILT
95#define elf_swap_symbol_in NAME(bfd_elf,swap_symbol_in)
96#define elf_swap_symbol_out NAME(bfd_elf,swap_symbol_out)
2b71e1e4
ILT
97#define elf_swap_phdr_in NAME(bfd_elf,swap_phdr_in)
98#define elf_swap_phdr_out NAME(bfd_elf,swap_phdr_out)
013dec1a
ILT
99#define elf_swap_dyn_in NAME(bfd_elf,swap_dyn_in)
100#define elf_swap_dyn_out NAME(bfd_elf,swap_dyn_out)
244ffee7
JK
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_get_symtab NAME(bfd_elf,get_symtab)
cb71adf1
PS
104#define elf_canonicalize_dynamic_symtab \
105 NAME(bfd_elf,canonicalize_dynamic_symtab)
244ffee7
JK
106#define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol)
107#define elf_get_symbol_info NAME(bfd_elf,get_symbol_info)
244ffee7
JK
108#define elf_get_lineno NAME(bfd_elf,get_lineno)
109#define elf_set_arch_mach NAME(bfd_elf,set_arch_mach)
110#define elf_find_nearest_line NAME(bfd_elf,find_nearest_line)
111#define elf_sizeof_headers NAME(bfd_elf,sizeof_headers)
112#define elf_set_section_contents NAME(bfd_elf,set_section_contents)
113#define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto)
114#define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel)
f035cc47 115#define elf_find_section NAME(bfd_elf,find_section)
6ec3bb6a 116#define elf_bfd_link_add_symbols NAME(bfd_elf,bfd_link_add_symbols)
013dec1a 117#define elf_add_dynamic_entry NAME(bfd_elf,add_dynamic_entry)
374d2ef9
ILT
118#define elf_link_create_dynamic_sections \
119 NAME(bfd_elf,link_create_dynamic_sections)
ede4eed4 120#define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
6ec3bb6a 121#define elf_bfd_final_link NAME(bfd_elf,bfd_final_link)
244ffee7 122
6a3eb9b6
KR
123#if ARCH_SIZE == 64
124#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
125#define ELF_R_SYM(X) ELF64_R_SYM(X)
6ec3bb6a 126#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
32090b8e 127#define ELFCLASS ELFCLASS64
f035cc47 128#define FILE_ALIGN 8
013dec1a 129#define LOG_FILE_ALIGN 3
6a3eb9b6
KR
130#endif
131#if ARCH_SIZE == 32
132#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
133#define ELF_R_SYM(X) ELF32_R_SYM(X)
6ec3bb6a 134#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
32090b8e 135#define ELFCLASS ELFCLASS32
f035cc47 136#define FILE_ALIGN 4
013dec1a 137#define LOG_FILE_ALIGN 2
244ffee7
JK
138#endif
139
244ffee7
JK
140/* Forward declarations of static functions */
141
ede4eed4 142#define elf_stringtab_init _bfd_elf_stringtab_init
244ffee7 143
ede4eed4
KR
144extern struct bfd_strtab_hash *_bfd_elf_stringtab_init PARAMS ((void));
145#define section_from_elf_index bfd_section_from_elf_index
146extern boolean bfd_section_from_phdr PARAMS ((bfd *, Elf_Internal_Phdr *,
147 int));
148
149 int _bfd_elf_section_from_bfd_section PARAMS ((bfd *, struct sec *));
244ffee7 150
cb71adf1 151static long elf_slurp_symbol_table PARAMS ((bfd *, asymbol **, boolean));
244ffee7 152
ea617174
ILT
153static boolean elf_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
154
ede4eed4 155 int _bfd_elf_symbol_from_bfd_symbol PARAMS ((bfd *,
1c6042ee 156 struct symbol_cache_entry **));
244ffee7 157
0ef449df 158static void write_relocs PARAMS ((bfd *, asection *, PTR));
ede4eed4
KR
159
160 boolean bfd_section_from_shdr PARAMS ((bfd *, unsigned int shindex));
2e03ce18 161
6a3eb9b6 162#ifdef DEBUG
eb4267a3 163static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *));
6a3eb9b6 164static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *));
0ef449df 165static char *elf_symbol_flags PARAMS ((flagword));
6a3eb9b6 166#endif
32090b8e
KR
167\f
168/* Structure swapping routines */
169
6a3eb9b6
KR
170/* Should perhaps use put_offset, put_word, etc. For now, the two versions
171 can be handled by explicitly specifying 32 bits or "the long type". */
238ac6ec
KR
172#if ARCH_SIZE == 64
173#define put_word bfd_h_put_64
174#define get_word bfd_h_get_64
175#endif
176#if ARCH_SIZE == 32
177#define put_word bfd_h_put_32
178#define get_word bfd_h_get_32
179#endif
180
244ffee7
JK
181/* Translate an ELF symbol in external format into an ELF symbol in internal
182 format. */
183
71edd06d 184void
1c6042ee
ILT
185elf_swap_symbol_in (abfd, src, dst)
186 bfd *abfd;
187 Elf_External_Sym *src;
188 Elf_Internal_Sym *dst;
244ffee7
JK
189{
190 dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name);
238ac6ec
KR
191 dst->st_value = get_word (abfd, (bfd_byte *) src->st_value);
192 dst->st_size = get_word (abfd, (bfd_byte *) src->st_size);
244ffee7
JK
193 dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info);
194 dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other);
195 dst->st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src->st_shndx);
196}
197
198/* Translate an ELF symbol in internal format into an ELF symbol in external
199 format. */
200
71edd06d 201void
ede4eed4 202elf_swap_symbol_out (abfd, src, cdst)
1c6042ee
ILT
203 bfd *abfd;
204 Elf_Internal_Sym *src;
b818a325 205 PTR cdst;
244ffee7 206{
ede4eed4 207 Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
244ffee7 208 bfd_h_put_32 (abfd, src->st_name, dst->st_name);
238ac6ec
KR
209 put_word (abfd, src->st_value, dst->st_value);
210 put_word (abfd, src->st_size, dst->st_size);
244ffee7
JK
211 bfd_h_put_8 (abfd, src->st_info, dst->st_info);
212 bfd_h_put_8 (abfd, src->st_other, dst->st_other);
213 bfd_h_put_16 (abfd, src->st_shndx, dst->st_shndx);
214}
215
216
217/* Translate an ELF file header in external format into an ELF file header in
218 internal format. */
219
220static void
1c6042ee
ILT
221elf_swap_ehdr_in (abfd, src, dst)
222 bfd *abfd;
223 Elf_External_Ehdr *src;
224 Elf_Internal_Ehdr *dst;
244ffee7
JK
225{
226 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
227 dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type);
228 dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine);
229 dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version);
238ac6ec
KR
230 dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry);
231 dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff);
232 dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff);
244ffee7
JK
233 dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags);
234 dst->e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_ehsize);
235 dst->e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phentsize);
236 dst->e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phnum);
237 dst->e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shentsize);
238 dst->e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shnum);
239 dst->e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shstrndx);
240}
241
242/* Translate an ELF file header in internal format into an ELF file header in
243 external format. */
244
245static void
1c6042ee
ILT
246elf_swap_ehdr_out (abfd, src, dst)
247 bfd *abfd;
248 Elf_Internal_Ehdr *src;
249 Elf_External_Ehdr *dst;
244ffee7
JK
250{
251 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
252 /* note that all elements of dst are *arrays of unsigned char* already... */
253 bfd_h_put_16 (abfd, src->e_type, dst->e_type);
254 bfd_h_put_16 (abfd, src->e_machine, dst->e_machine);
255 bfd_h_put_32 (abfd, src->e_version, dst->e_version);
238ac6ec
KR
256 put_word (abfd, src->e_entry, dst->e_entry);
257 put_word (abfd, src->e_phoff, dst->e_phoff);
258 put_word (abfd, src->e_shoff, dst->e_shoff);
244ffee7
JK
259 bfd_h_put_32 (abfd, src->e_flags, dst->e_flags);
260 bfd_h_put_16 (abfd, src->e_ehsize, dst->e_ehsize);
261 bfd_h_put_16 (abfd, src->e_phentsize, dst->e_phentsize);
262 bfd_h_put_16 (abfd, src->e_phnum, dst->e_phnum);
263 bfd_h_put_16 (abfd, src->e_shentsize, dst->e_shentsize);
264 bfd_h_put_16 (abfd, src->e_shnum, dst->e_shnum);
265 bfd_h_put_16 (abfd, src->e_shstrndx, dst->e_shstrndx);
266}
267
268
269/* Translate an ELF section header table entry in external format into an
270 ELF section header table entry in internal format. */
271
272static void
1c6042ee
ILT
273elf_swap_shdr_in (abfd, src, dst)
274 bfd *abfd;
275 Elf_External_Shdr *src;
276 Elf_Internal_Shdr *dst;
244ffee7
JK
277{
278 dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name);
279 dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type);
238ac6ec
KR
280 dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags);
281 dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr);
282 dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset);
283 dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size);
244ffee7
JK
284 dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link);
285 dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info);
238ac6ec
KR
286 dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign);
287 dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize);
24f13b03
ILT
288 dst->bfd_section = NULL;
289 dst->contents = NULL;
244ffee7
JK
290}
291
292/* Translate an ELF section header table entry in internal format into an
293 ELF section header table entry in external format. */
294
295static void
1c6042ee
ILT
296elf_swap_shdr_out (abfd, src, dst)
297 bfd *abfd;
298 Elf_Internal_Shdr *src;
299 Elf_External_Shdr *dst;
244ffee7
JK
300{
301 /* note that all elements of dst are *arrays of unsigned char* already... */
302 bfd_h_put_32 (abfd, src->sh_name, dst->sh_name);
303 bfd_h_put_32 (abfd, src->sh_type, dst->sh_type);
238ac6ec
KR
304 put_word (abfd, src->sh_flags, dst->sh_flags);
305 put_word (abfd, src->sh_addr, dst->sh_addr);
306 put_word (abfd, src->sh_offset, dst->sh_offset);
307 put_word (abfd, src->sh_size, dst->sh_size);
244ffee7
JK
308 bfd_h_put_32 (abfd, src->sh_link, dst->sh_link);
309 bfd_h_put_32 (abfd, src->sh_info, dst->sh_info);
238ac6ec
KR
310 put_word (abfd, src->sh_addralign, dst->sh_addralign);
311 put_word (abfd, src->sh_entsize, dst->sh_entsize);
244ffee7
JK
312}
313
314
315/* Translate an ELF program header table entry in external format into an
316 ELF program header table entry in internal format. */
317
2b71e1e4 318void
1c6042ee
ILT
319elf_swap_phdr_in (abfd, src, dst)
320 bfd *abfd;
321 Elf_External_Phdr *src;
322 Elf_Internal_Phdr *dst;
244ffee7
JK
323{
324 dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type);
244ffee7 325 dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags);
238ac6ec
KR
326 dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset);
327 dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr);
328 dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr);
329 dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz);
330 dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz);
331 dst->p_align = get_word (abfd, (bfd_byte *) src->p_align);
244ffee7
JK
332}
333
2b71e1e4 334void
1c6042ee
ILT
335elf_swap_phdr_out (abfd, src, dst)
336 bfd *abfd;
337 Elf_Internal_Phdr *src;
338 Elf_External_Phdr *dst;
244ffee7
JK
339{
340 /* note that all elements of dst are *arrays of unsigned char* already... */
341 bfd_h_put_32 (abfd, src->p_type, dst->p_type);
94dbb655
KR
342 put_word (abfd, src->p_offset, dst->p_offset);
343 put_word (abfd, src->p_vaddr, dst->p_vaddr);
344 put_word (abfd, src->p_paddr, dst->p_paddr);
345 put_word (abfd, src->p_filesz, dst->p_filesz);
346 put_word (abfd, src->p_memsz, dst->p_memsz);
244ffee7 347 bfd_h_put_32 (abfd, src->p_flags, dst->p_flags);
94dbb655 348 put_word (abfd, src->p_align, dst->p_align);
244ffee7
JK
349}
350
351/* Translate an ELF reloc from external format to internal format. */
013dec1a 352INLINE void
1c6042ee
ILT
353elf_swap_reloc_in (abfd, src, dst)
354 bfd *abfd;
355 Elf_External_Rel *src;
356 Elf_Internal_Rel *dst;
244ffee7 357{
94dbb655
KR
358 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
359 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
244ffee7
JK
360}
361
013dec1a 362INLINE void
1c6042ee
ILT
363elf_swap_reloca_in (abfd, src, dst)
364 bfd *abfd;
365 Elf_External_Rela *src;
366 Elf_Internal_Rela *dst;
244ffee7 367{
94dbb655
KR
368 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
369 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
370 dst->r_addend = get_word (abfd, (bfd_byte *) src->r_addend);
244ffee7
JK
371}
372
373/* Translate an ELF reloc from internal format to external format. */
013dec1a 374INLINE void
1c6042ee
ILT
375elf_swap_reloc_out (abfd, src, dst)
376 bfd *abfd;
377 Elf_Internal_Rel *src;
378 Elf_External_Rel *dst;
244ffee7 379{
94dbb655
KR
380 put_word (abfd, src->r_offset, dst->r_offset);
381 put_word (abfd, src->r_info, dst->r_info);
244ffee7
JK
382}
383
013dec1a 384INLINE void
1c6042ee
ILT
385elf_swap_reloca_out (abfd, src, dst)
386 bfd *abfd;
387 Elf_Internal_Rela *src;
388 Elf_External_Rela *dst;
244ffee7 389{
94dbb655
KR
390 put_word (abfd, src->r_offset, dst->r_offset);
391 put_word (abfd, src->r_info, dst->r_info);
392 put_word (abfd, src->r_addend, dst->r_addend);
244ffee7 393}
32090b8e 394
013dec1a
ILT
395INLINE void
396elf_swap_dyn_in (abfd, src, dst)
397 bfd *abfd;
398 const Elf_External_Dyn *src;
399 Elf_Internal_Dyn *dst;
400{
401 dst->d_tag = get_word (abfd, src->d_tag);
402 dst->d_un.d_val = get_word (abfd, src->d_un.d_val);
403}
1c6042ee 404
013dec1a
ILT
405INLINE void
406elf_swap_dyn_out (abfd, src, dst)
407 bfd *abfd;
408 const Elf_Internal_Dyn *src;
409 Elf_External_Dyn *dst;
410{
411 put_word (abfd, src->d_tag, dst->d_tag);
412 put_word (abfd, src->d_un.d_val, dst->d_un.d_val);
413}
414\f
32090b8e
KR
415/* ELF .o/exec file reading */
416
244ffee7 417
32090b8e 418/* Begin processing a given object.
244ffee7 419
32090b8e
KR
420 First we validate the file by reading in the ELF header and checking
421 the magic number. */
422
423static INLINE boolean
1c6042ee
ILT
424elf_file_p (x_ehdrp)
425 Elf_External_Ehdr *x_ehdrp;
244ffee7 426{
32090b8e
KR
427 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
428 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
429 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
430 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
431}
244ffee7 432
d24928c0
KR
433/* Check to see if the file associated with ABFD matches the target vector
434 that ABFD points to.
435
436 Note that we may be called several times with the same ABFD, but different
437 target vectors, most of which will not match. We have to avoid leaving
438 any side effects in ABFD, or any data it points to (like tdata), if the
6ec3bb6a 439 file does not match the target vector. */
d24928c0 440
2f3508ad 441const bfd_target *
1c6042ee
ILT
442elf_object_p (abfd)
443 bfd *abfd;
244ffee7 444{
32090b8e
KR
445 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
446 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
447 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
6ec3bb6a 448 Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */
68241b2b 449 unsigned int shindex;
32090b8e 450 char *shstrtab; /* Internal copy of section header stringtab */
062189c6 451 struct elf_backend_data *ebd;
d24928c0 452 struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd);
6ec3bb6a 453 struct elf_obj_tdata *new_tdata = NULL;
244ffee7 454
32090b8e
KR
455 /* Read in the ELF header in external format. */
456
457 if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
25057836
JL
458 {
459 if (bfd_get_error () != bfd_error_system_call)
460 goto got_wrong_format_error;
461 else
462 goto got_no_match;
463 }
244ffee7 464
32090b8e
KR
465 /* Now check to see if we have a valid ELF file, and one that BFD can
466 make use of. The magic number must match, the address size ('class')
467 and byte-swapping must match our XVEC entry, and it must have a
468 section header table (FIXME: See comments re sections at top of this
469 file). */
244ffee7 470
d24928c0
KR
471 if ((elf_file_p (&x_ehdr) == false) ||
472 (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) ||
473 (x_ehdr.e_ident[EI_CLASS] != ELFCLASS))
474 goto got_wrong_format_error;
244ffee7 475
d24928c0 476 /* Check that file's byte order matches xvec's */
32090b8e 477 switch (x_ehdr.e_ident[EI_DATA])
244ffee7 478 {
32090b8e
KR
479 case ELFDATA2MSB: /* Big-endian */
480 if (!abfd->xvec->header_byteorder_big_p)
d24928c0 481 goto got_wrong_format_error;
32090b8e
KR
482 break;
483 case ELFDATA2LSB: /* Little-endian */
484 if (abfd->xvec->header_byteorder_big_p)
d24928c0 485 goto got_wrong_format_error;
32090b8e
KR
486 break;
487 case ELFDATANONE: /* No data encoding specified */
488 default: /* Unknown data encoding specified */
d24928c0 489 goto got_wrong_format_error;
244ffee7 490 }
244ffee7 491
32090b8e 492 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
6ec3bb6a 493 the tdata pointer in the bfd. */
244ffee7 494
6ec3bb6a
ILT
495 new_tdata = ((struct elf_obj_tdata *)
496 bfd_zalloc (abfd, sizeof (struct elf_obj_tdata)));
497 if (new_tdata == NULL)
d24928c0 498 goto got_no_memory_error;
6ec3bb6a 499 elf_tdata (abfd) = new_tdata;
244ffee7 500
32090b8e
KR
501 /* Now that we know the byte order, swap in the rest of the header */
502 i_ehdrp = elf_elfheader (abfd);
503 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
504#if DEBUG & 1
505 elf_debug_file (i_ehdrp);
244ffee7
JK
506#endif
507
32090b8e
KR
508 /* If there is no section header table, we're hosed. */
509 if (i_ehdrp->e_shoff == 0)
d24928c0 510 goto got_wrong_format_error;
244ffee7 511
062189c6
ILT
512 /* As a simple sanity check, verify that the what BFD thinks is the
513 size of each section header table entry actually matches the size
514 recorded in the file. */
515 if (i_ehdrp->e_shentsize != sizeof (x_shdr))
516 goto got_wrong_format_error;
517
518 ebd = get_elf_backend_data (abfd);
519
520 /* Check that the ELF e_machine field matches what this particular
521 BFD format expects. */
df168c35
DE
522 if (ebd->elf_machine_code != i_ehdrp->e_machine
523 && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
524 && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
062189c6 525 {
2f3508ad 526 const bfd_target * const *target_ptr;
062189c6
ILT
527
528 if (ebd->elf_machine_code != EM_NONE)
529 goto got_wrong_format_error;
530
531 /* This is the generic ELF target. Let it match any ELF target
532 for which we do not have a specific backend. */
f4bd7a8f 533 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
062189c6
ILT
534 {
535 struct elf_backend_data *back;
536
537 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
538 continue;
539 back = (struct elf_backend_data *) (*target_ptr)->backend_data;
540 if (back->elf_machine_code == i_ehdrp->e_machine)
541 {
542 /* target_ptr is an ELF backend which matches this
543 object file, so reject the generic ELF target. */
544 goto got_wrong_format_error;
545 }
546 }
547 }
548
7b8106b4 549 if (i_ehdrp->e_type == ET_EXEC)
32090b8e 550 abfd->flags |= EXEC_P;
7b8106b4
ILT
551 else if (i_ehdrp->e_type == ET_DYN)
552 abfd->flags |= DYNAMIC;
244ffee7 553
fa15568a
ILT
554 if (i_ehdrp->e_phnum > 0)
555 abfd->flags |= D_PAGED;
556
6ec3bb6a
ILT
557 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
558 goto got_no_match;
32090b8e 559
062189c6
ILT
560 /* Remember the entry point specified in the ELF file header. */
561 bfd_get_start_address (abfd) = i_ehdrp->e_entry;
32090b8e
KR
562
563 /* Allocate space for a copy of the section header table in
564 internal form, seek to the section header table in the file,
062189c6 565 read it in, and convert it to internal form. */
6ec3bb6a
ILT
566 i_shdrp = ((Elf_Internal_Shdr *)
567 bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
568 elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
569 bfd_alloc (abfd,
570 sizeof (i_shdrp) * i_ehdrp->e_shnum));
1c6042ee 571 if (!i_shdrp || !elf_elfsections (abfd))
d24928c0 572 goto got_no_memory_error;
6ec3bb6a 573 if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0)
25057836 574 goto got_no_match;
32090b8e 575 for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++)
244ffee7 576 {
d24928c0 577 if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr))
25057836 578 goto got_no_match;
32090b8e 579 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
1c6042ee 580 elf_elfsections (abfd)[shindex] = i_shdrp + shindex;
244ffee7 581 }
32090b8e 582 if (i_ehdrp->e_shstrndx)
244ffee7 583 {
2e03ce18
ILT
584 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
585 goto got_no_match;
244ffee7
JK
586 }
587
32090b8e
KR
588 /* Read in the string table containing the names of the sections. We
589 will need the base pointer to this table later. */
590 /* We read this inline now, so that we don't have to go through
591 bfd_section_from_shdr with it (since this particular strtab is
592 used to find all of the ELF section names.) */
244ffee7 593
ede4eed4 594 shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
32090b8e 595 if (!shstrtab)
6ec3bb6a 596 goto got_no_match;
244ffee7 597
32090b8e
KR
598 /* Once all of the section headers have been read and converted, we
599 can start processing them. Note that the first section header is
6ec3bb6a 600 a dummy placeholder entry, so we ignore it. */
244ffee7 601
32090b8e
KR
602 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
603 {
2e03ce18
ILT
604 if (! bfd_section_from_shdr (abfd, shindex))
605 goto got_no_match;
32090b8e 606 }
244ffee7 607
5315c428
ILT
608 /* Let the backend double check the format and override global
609 information. */
610 if (ebd->elf_backend_object_p)
611 {
612 if ((*ebd->elf_backend_object_p) (abfd) == false)
613 goto got_wrong_format_error;
614 }
615
d24928c0
KR
616 return (abfd->xvec);
617
1c6042ee 618got_wrong_format_error:
d1ad85a6 619 bfd_set_error (bfd_error_wrong_format);
d24928c0 620 goto got_no_match;
1c6042ee 621got_no_memory_error:
d1ad85a6 622 bfd_set_error (bfd_error_no_memory);
d24928c0 623 goto got_no_match;
1c6042ee 624got_no_match:
6ec3bb6a
ILT
625 if (new_tdata != NULL
626 && new_tdata->elf_sect_ptr != NULL)
627 bfd_release (abfd, new_tdata->elf_sect_ptr);
628 if (i_shdrp != NULL)
629 bfd_release (abfd, i_shdrp);
630 if (new_tdata != NULL)
631 bfd_release (abfd, new_tdata);
d24928c0
KR
632 elf_tdata (abfd) = preserved_tdata;
633 return (NULL);
32090b8e 634}
32090b8e 635\f
1c6042ee 636
32090b8e
KR
637/* ELF .o/exec file writing */
638
0ef449df
KR
639static void
640write_relocs (abfd, sec, data)
32090b8e
KR
641 bfd *abfd;
642 asection *sec;
0ef449df 643 PTR data;
32090b8e 644{
0ef449df 645 boolean *failedp = (boolean *) data;
32090b8e
KR
646 Elf_Internal_Shdr *rela_hdr;
647 Elf_External_Rela *outbound_relocas;
648 Elf_External_Rel *outbound_relocs;
6ab826bd 649 unsigned int idx;
32090b8e 650 int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
300adb31 651 asymbol *last_sym = 0;
38a5f510 652 int last_sym_idx = 9999999; /* should always be written before use */
244ffee7 653
0ef449df
KR
654 /* If we have already failed, don't do anything. */
655 if (*failedp)
656 return;
657
32090b8e
KR
658 if ((sec->flags & SEC_RELOC) == 0)
659 return;
6ec3bb6a
ILT
660
661 /* The linker backend writes the relocs out itself, and sets the
662 reloc_count field to zero to inhibit writing them here. Also,
663 sometimes the SEC_RELOC flag gets set even when there aren't any
664 relocs. */
32090b8e
KR
665 if (sec->reloc_count == 0)
666 return;
244ffee7 667
32090b8e 668 rela_hdr = &elf_section_data (sec)->rel_hdr;
244ffee7 669
32090b8e 670 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
0ef449df
KR
671 rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
672 if (rela_hdr->contents == NULL)
9783e04a 673 {
d1ad85a6 674 bfd_set_error (bfd_error_no_memory);
0ef449df
KR
675 *failedp = true;
676 return;
9783e04a 677 }
244ffee7 678
32090b8e 679 /* orelocation has the data, reloc_count has the count... */
300adb31
KR
680 if (use_rela_p)
681 {
682 outbound_relocas = (Elf_External_Rela *) rela_hdr->contents;
683
684 for (idx = 0; idx < sec->reloc_count; idx++)
32090b8e 685 {
300adb31
KR
686 Elf_Internal_Rela dst_rela;
687 Elf_External_Rela *src_rela;
688 arelent *ptr;
689 asymbol *sym;
690 int n;
691
692 ptr = sec->orelocation[idx];
693 src_rela = outbound_relocas + idx;
4c124191
ILT
694
695 /* The address of an ELF reloc is section relative for an object
696 file, and absolute for an executable file or shared library.
697 The address of a BFD reloc is always section relative. */
698 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
300adb31 699 dst_rela.r_offset = ptr->address;
4c124191
ILT
700 else
701 dst_rela.r_offset = ptr->address + sec->vma;
6a3eb9b6 702
300adb31
KR
703 sym = *ptr->sym_ptr_ptr;
704 if (sym == last_sym)
705 n = last_sym_idx;
706 else
32090b8e 707 {
300adb31 708 last_sym = sym;
ede4eed4 709 last_sym_idx = n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
32090b8e 710 }
300adb31
KR
711 dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
712
713 dst_rela.r_addend = ptr->addend;
714 elf_swap_reloca_out (abfd, &dst_rela, src_rela);
244ffee7 715 }
300adb31
KR
716 }
717 else
718 /* REL relocations */
719 {
720 outbound_relocs = (Elf_External_Rel *) rela_hdr->contents;
721
722 for (idx = 0; idx < sec->reloc_count; idx++)
32090b8e 723 {
300adb31
KR
724 Elf_Internal_Rel dst_rel;
725 Elf_External_Rel *src_rel;
726 arelent *ptr;
727 int n;
728 asymbol *sym;
729
730 ptr = sec->orelocation[idx];
731 sym = *ptr->sym_ptr_ptr;
732 src_rel = outbound_relocs + idx;
4c124191
ILT
733
734 /* The address of an ELF reloc is section relative for an object
735 file, and absolute for an executable file or shared library.
736 The address of a BFD reloc is always section relative. */
737 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
300adb31 738 dst_rel.r_offset = ptr->address;
4c124191
ILT
739 else
740 dst_rel.r_offset = ptr->address + sec->vma;
244ffee7 741
300adb31
KR
742 if (sym == last_sym)
743 n = last_sym_idx;
744 else
32090b8e 745 {
300adb31 746 last_sym = sym;
ede4eed4 747 last_sym_idx = n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
32090b8e 748 }
300adb31
KR
749 dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type);
750
751 elf_swap_reloc_out (abfd, &dst_rel, src_rel);
32090b8e 752 }
300adb31 753 }
32090b8e 754}
244ffee7 755
ede4eed4
KR
756static int
757write_out_phdrs (abfd, phdr, count)
758 bfd *abfd;
759 Elf_Internal_Phdr *phdr;
760 int count;
761{
762 while (count--)
fa15568a 763 {
ede4eed4
KR
764 Elf_External_Phdr extphdr;
765 elf_swap_phdr_out (abfd, phdr, &extphdr);
766 if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), 1, abfd)
767 != sizeof (Elf_External_Phdr))
768 return -1;
769 phdr++;
fa15568a 770 }
ede4eed4 771 return 0;
fa15568a 772}
244ffee7 773
fa15568a 774static boolean
ede4eed4 775write_shdrs_and_ehdr (abfd)
fa15568a
ILT
776 bfd *abfd;
777{
ede4eed4
KR
778 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
779 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
780 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
781 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
782 unsigned int count;
7c726b66 783
ede4eed4
KR
784 i_ehdrp = elf_elfheader (abfd);
785 i_shdrp = elf_elfsections (abfd);
7c726b66 786
ede4eed4 787 /* swap the header before spitting it out... */
fa15568a 788
ede4eed4
KR
789#if DEBUG & 1
790 elf_debug_file (i_ehdrp);
791#endif
792 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
793 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
794 || (bfd_write ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd)
795 != sizeof (x_ehdr)))
796 return false;
fa15568a 797
ede4eed4
KR
798 /* at this point we've concocted all the ELF sections... */
799 x_shdrp = (Elf_External_Shdr *)
800 bfd_alloc (abfd, sizeof (*x_shdrp) * (i_ehdrp->e_shnum));
801 if (!x_shdrp)
fa15568a 802 {
fa15568a
ILT
803 bfd_set_error (bfd_error_no_memory);
804 return false;
805 }
fa15568a 806
ede4eed4 807 for (count = 0; count < i_ehdrp->e_shnum; count++)
fa15568a 808 {
ede4eed4
KR
809#if DEBUG & 2
810 elf_debug_section (count, i_shdrp[count]);
811#endif
812 elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count);
fa15568a 813 }
ede4eed4
KR
814 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
815 || (bfd_write ((PTR) x_shdrp, sizeof (*x_shdrp), i_ehdrp->e_shnum, abfd)
816 != sizeof (*x_shdrp) * i_ehdrp->e_shnum))
817 return false;
fa15568a 818
ede4eed4 819 /* need to dump the string table too... */
fa15568a
ILT
820
821 return true;
244ffee7
JK
822}
823
ede4eed4
KR
824static long
825elf_slurp_symbol_table (abfd, symptrs, dynamic)
062189c6 826 bfd *abfd;
ede4eed4
KR
827 asymbol **symptrs; /* Buffer for generated bfd symbols */
828 boolean dynamic;
32090b8e 829{
ede4eed4
KR
830 Elf_Internal_Shdr *hdr;
831 long symcount; /* Number of external ELF symbols */
832 elf_symbol_type *sym; /* Pointer to current bfd symbol */
833 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
834 Elf_Internal_Sym i_sym;
835 Elf_External_Sym *x_symp = NULL;
244ffee7 836
ede4eed4
KR
837 /* Read each raw ELF symbol, converting from external ELF form to
838 internal ELF form, and then using the information to create a
839 canonical bfd symbol table entry.
6a3eb9b6 840
ede4eed4
KR
841 Note that we allocate the initial bfd canonical symbol buffer
842 based on a one-to-one mapping of the ELF symbols to canonical
843 symbols. We actually use all the ELF symbols, so there will be no
844 space left over at the end. When we have all the symbols, we
845 build the caller's pointer vector. */
244ffee7 846
ede4eed4
KR
847 if (dynamic)
848 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
849 else
850 hdr = &elf_tdata (abfd)->symtab_hdr;
851 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
852 return -1;
244ffee7 853
ede4eed4 854 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
d24928c0 855
ede4eed4
KR
856 if (symcount == 0)
857 sym = symbase = NULL;
858 else
e621c5cc 859 {
ede4eed4 860 long i;
24f13b03 861
ede4eed4
KR
862 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
863 return -1;
6ec3bb6a 864
ede4eed4
KR
865 symbase = ((elf_symbol_type *)
866 bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type)));
867 if (symbase == (elf_symbol_type *) NULL)
6ec3bb6a 868 {
ede4eed4
KR
869 bfd_set_error (bfd_error_no_memory);
870 return -1;
6ec3bb6a 871 }
ede4eed4 872 sym = symbase;
6ec3bb6a 873
ede4eed4
KR
874 /* Temporarily allocate room for the raw ELF symbols. */
875 x_symp = ((Elf_External_Sym *)
876 malloc (symcount * sizeof (Elf_External_Sym)));
877 if (x_symp == NULL && symcount != 0)
6ec3bb6a 878 {
ede4eed4
KR
879 bfd_set_error (bfd_error_no_memory);
880 goto error_return;
6ec3bb6a 881 }
1c640609 882
ede4eed4
KR
883 if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd)
884 != symcount * sizeof (Elf_External_Sym))
885 goto error_return;
886 /* Skip first symbol, which is a null dummy. */
887 for (i = 1; i < symcount; i++)
6ec3bb6a 888 {
ede4eed4
KR
889 elf_swap_symbol_in (abfd, x_symp + i, &i_sym);
890 memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
891#ifdef ELF_KEEP_EXTSYM
892 memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym));
6ec3bb6a 893#endif
ede4eed4 894 sym->symbol.the_bfd = abfd;
6ec3bb6a 895
ede4eed4
KR
896 sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
897 hdr->sh_link,
898 i_sym.st_name);
6ec3bb6a 899
ede4eed4 900 sym->symbol.value = i_sym.st_value;
6ec3bb6a 901
ede4eed4 902 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE)
6ec3bb6a 903 {
ede4eed4
KR
904 sym->symbol.section = section_from_elf_index (abfd,
905 i_sym.st_shndx);
906 if (sym->symbol.section == NULL)
6ec3bb6a 907 {
ede4eed4
KR
908 /* This symbol is in a section for which we did not
909 create a BFD section. Just use bfd_abs_section,
910 although it is wrong. FIXME. */
911 sym->symbol.section = bfd_abs_section_ptr;
6ec3bb6a
ILT
912 }
913 }
ede4eed4 914 else if (i_sym.st_shndx == SHN_ABS)
6ec3bb6a 915 {
ede4eed4 916 sym->symbol.section = bfd_abs_section_ptr;
6ec3bb6a 917 }
ede4eed4 918 else if (i_sym.st_shndx == SHN_COMMON)
6ec3bb6a 919 {
ede4eed4
KR
920 sym->symbol.section = bfd_com_section_ptr;
921 /* Elf puts the alignment into the `value' field, and
922 the size into the `size' field. BFD wants to see the
923 size in the value field, and doesn't care (at the
924 moment) about the alignment. */
925 sym->symbol.value = i_sym.st_size;
6ec3bb6a 926 }
ede4eed4 927 else if (i_sym.st_shndx == SHN_UNDEF)
6ec3bb6a 928 {
ede4eed4 929 sym->symbol.section = bfd_und_section_ptr;
6ec3bb6a
ILT
930 }
931 else
ede4eed4 932 sym->symbol.section = bfd_abs_section_ptr;
013dec1a 933
ede4eed4 934 sym->symbol.value -= sym->symbol.section->vma;
013dec1a 935
ede4eed4 936 switch (ELF_ST_BIND (i_sym.st_info))
013dec1a 937 {
ede4eed4
KR
938 case STB_LOCAL:
939 sym->symbol.flags |= BSF_LOCAL;
197e30e5 940 break;
ede4eed4
KR
941 case STB_GLOBAL:
942 if (i_sym.st_shndx != SHN_UNDEF
943 && i_sym.st_shndx != SHN_COMMON)
944 sym->symbol.flags |= BSF_GLOBAL;
013dec1a 945 break;
ede4eed4
KR
946 case STB_WEAK:
947 sym->symbol.flags |= BSF_WEAK;
013dec1a
ILT
948 break;
949 }
013dec1a 950
ede4eed4 951 switch (ELF_ST_TYPE (i_sym.st_info))
eb4267a3 952 {
ede4eed4
KR
953 case STT_SECTION:
954 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
955 break;
956 case STT_FILE:
957 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
958 break;
959 case STT_FUNC:
960 sym->symbol.flags |= BSF_FUNCTION;
961 break;
eb4267a3 962 }
6ec3bb6a 963
ede4eed4
KR
964 if (dynamic)
965 sym->symbol.flags |= BSF_DYNAMIC;
3c9832f8 966
ede4eed4
KR
967 /* Do some backend-specific processing on this symbol. */
968 {
969 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
970 if (ebd->elf_backend_symbol_processing)
971 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
972 }
6ec3bb6a 973
ede4eed4
KR
974 sym++;
975 }
6ec3bb6a
ILT
976 }
977
ede4eed4
KR
978 /* Do some backend-specific processing on this symbol table. */
979 {
980 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
981 if (ebd->elf_backend_symbol_table_processing)
982 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
983 }
6ec3bb6a 984
ede4eed4 985 /* We rely on the zalloc to clear out the final symbol entry. */
6ec3bb6a 986
ede4eed4 987 symcount = sym - symbase;
71edd06d 988
ede4eed4
KR
989 /* Fill in the user's symbol pointer vector if needed. */
990 if (symptrs)
6ec3bb6a 991 {
ede4eed4 992 long l = symcount;
6ec3bb6a 993
ede4eed4
KR
994 sym = symbase;
995 while (l-- > 0)
996 {
997 *symptrs++ = &sym->symbol;
998 sym++;
999 }
1000 *symptrs = 0; /* Final null pointer */
6ec3bb6a
ILT
1001 }
1002
ede4eed4
KR
1003 if (x_symp != NULL)
1004 free (x_symp);
1005 return symcount;
1006error_return:
1007 if (x_symp != NULL)
1008 free (x_symp);
1009 return -1;
6ec3bb6a
ILT
1010}
1011
ede4eed4 1012/* Read in and swap the external relocs. */
6ec3bb6a
ILT
1013
1014static boolean
ede4eed4
KR
1015elf_slurp_reloc_table (abfd, asect, symbols)
1016 bfd *abfd;
1017 asection *asect;
1018 asymbol **symbols;
6ec3bb6a 1019{
ede4eed4
KR
1020 struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1021 struct bfd_elf_section_data * const d = elf_section_data (asect);
1022 PTR allocated = NULL;
1023 bfd_byte *native_relocs;
1024 arelent *relents;
1025 arelent *relent;
1026 unsigned int i;
1027 int entsize;
013dec1a 1028
ede4eed4
KR
1029 if (asect->relocation != NULL
1030 || (asect->flags & SEC_RELOC) == 0
1031 || asect->reloc_count == 0)
6ec3bb6a
ILT
1032 return true;
1033
ede4eed4
KR
1034 BFD_ASSERT (asect->rel_filepos == d->rel_hdr.sh_offset
1035 && (asect->reloc_count
1036 == d->rel_hdr.sh_size / d->rel_hdr.sh_entsize));
6ec3bb6a 1037
2b71e1e4 1038 allocated = (PTR) malloc ((size_t) d->rel_hdr.sh_size);
ede4eed4 1039 if (allocated == NULL)
6ec3bb6a 1040 {
ede4eed4
KR
1041 bfd_set_error (bfd_error_no_memory);
1042 goto error_return;
1043 }
6ec3bb6a 1044
ede4eed4
KR
1045 if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0
1046 || (bfd_read (allocated, 1, d->rel_hdr.sh_size, abfd)
1047 != d->rel_hdr.sh_size))
1048 goto error_return;
6ec3bb6a 1049
ede4eed4 1050 native_relocs = (bfd_byte *) allocated;
6ec3bb6a 1051
ede4eed4
KR
1052 relents = ((arelent *)
1053 bfd_alloc (abfd, asect->reloc_count * sizeof (arelent)));
1054 if (relents == NULL)
1055 {
1056 bfd_set_error (bfd_error_no_memory);
1057 goto error_return;
6ec3bb6a
ILT
1058 }
1059
ede4eed4
KR
1060 entsize = d->rel_hdr.sh_entsize;
1061 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1062 || entsize == sizeof (Elf_External_Rela));
1063
1064 for (i = 0, relent = relents;
1065 i < asect->reloc_count;
1066 i++, relent++, native_relocs += entsize)
013dec1a 1067 {
ede4eed4
KR
1068 Elf_Internal_Rela rela;
1069 Elf_Internal_Rel rel;
1070
1071 if (entsize == sizeof (Elf_External_Rela))
1072 elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela);
1073 else
013dec1a 1074 {
ede4eed4
KR
1075 elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel);
1076 rela.r_offset = rel.r_offset;
1077 rela.r_info = rel.r_info;
1078 rela.r_addend = 0;
013dec1a
ILT
1079 }
1080
ede4eed4
KR
1081 /* The address of an ELF reloc is section relative for an object
1082 file, and absolute for an executable file or shared library.
1083 The address of a BFD reloc is always section relative. */
1084 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
1085 relent->address = rela.r_offset;
1086 else
1087 relent->address = rela.r_offset - asect->vma;
6ec3bb6a 1088
ede4eed4
KR
1089 if (ELF_R_SYM (rela.r_info) == 0)
1090 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1091 else
1092 {
1093 asymbol **ps, *s;
6ec3bb6a 1094
ede4eed4
KR
1095 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1096 s = *ps;
6ec3bb6a 1097
ede4eed4
KR
1098 /* Canonicalize ELF section symbols. FIXME: Why? */
1099 if ((s->flags & BSF_SECTION_SYM) == 0)
1100 relent->sym_ptr_ptr = ps;
1101 else
1102 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
1103 }
6ec3bb6a 1104
ede4eed4 1105 relent->addend = rela.r_addend;
013dec1a 1106
ede4eed4
KR
1107 if (entsize == sizeof (Elf_External_Rela))
1108 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1109 else
1110 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
5315c428
ILT
1111 }
1112
ede4eed4 1113 asect->relocation = relents;
6ec3bb6a 1114
ede4eed4
KR
1115 if (allocated != NULL)
1116 free (allocated);
6ec3bb6a 1117
ede4eed4 1118 return true;
6ec3bb6a 1119
ede4eed4
KR
1120 error_return:
1121 if (allocated != NULL)
1122 free (allocated);
1123 return false;
1124}
5315c428 1125
ede4eed4
KR
1126#ifdef DEBUG
1127static void
1128elf_debug_section (num, hdr)
1129 int num;
1130 Elf_Internal_Shdr *hdr;
1131{
1132 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1133 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1134 (long) hdr);
1135 fprintf (stderr,
1136 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1137 (long) hdr->sh_name,
1138 (long) hdr->sh_type,
1139 (long) hdr->sh_flags);
1140 fprintf (stderr,
1141 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1142 (long) hdr->sh_addr,
1143 (long) hdr->sh_offset,
1144 (long) hdr->sh_size);
1145 fprintf (stderr,
1146 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1147 (long) hdr->sh_link,
1148 (long) hdr->sh_info,
1149 (long) hdr->sh_addralign);
1150 fprintf (stderr, "sh_entsize = %ld\n",
1151 (long) hdr->sh_entsize);
1152 fflush (stderr);
1153}
6ec3bb6a 1154
ede4eed4
KR
1155static void
1156elf_debug_file (ehdrp)
1157 Elf_Internal_Ehdr *ehdrp;
1158{
1159 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1160 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1161 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1162 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1163 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1164 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1165 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1166}
6ec3bb6a 1167
ede4eed4
KR
1168static char *
1169elf_symbol_flags (flags)
1170 flagword flags;
1171{
1172 static char buffer[1024];
6ec3bb6a 1173
ede4eed4
KR
1174 buffer[0] = '\0';
1175 if (flags & BSF_LOCAL)
1176 strcat (buffer, " local");
8af74670 1177
ede4eed4
KR
1178 if (flags & BSF_GLOBAL)
1179 strcat (buffer, " global");
6ec3bb6a 1180
ede4eed4
KR
1181 if (flags & BSF_DEBUGGING)
1182 strcat (buffer, " debug");
6ec3bb6a 1183
ede4eed4
KR
1184 if (flags & BSF_FUNCTION)
1185 strcat (buffer, " function");
6ec3bb6a 1186
ede4eed4
KR
1187 if (flags & BSF_KEEP)
1188 strcat (buffer, " keep");
6ec3bb6a 1189
ede4eed4
KR
1190 if (flags & BSF_KEEP_G)
1191 strcat (buffer, " keep_g");
6ec3bb6a 1192
ede4eed4
KR
1193 if (flags & BSF_WEAK)
1194 strcat (buffer, " weak");
6ec3bb6a 1195
ede4eed4
KR
1196 if (flags & BSF_SECTION_SYM)
1197 strcat (buffer, " section-sym");
6ec3bb6a 1198
ede4eed4
KR
1199 if (flags & BSF_OLD_COMMON)
1200 strcat (buffer, " old-common");
6ec3bb6a 1201
ede4eed4
KR
1202 if (flags & BSF_NOT_AT_END)
1203 strcat (buffer, " not-at-end");
6ec3bb6a 1204
ede4eed4
KR
1205 if (flags & BSF_CONSTRUCTOR)
1206 strcat (buffer, " constructor");
6ec3bb6a 1207
ede4eed4
KR
1208 if (flags & BSF_WARNING)
1209 strcat (buffer, " warning");
6ec3bb6a 1210
ede4eed4
KR
1211 if (flags & BSF_INDIRECT)
1212 strcat (buffer, " indirect");
6ec3bb6a 1213
ede4eed4
KR
1214 if (flags & BSF_FILE)
1215 strcat (buffer, " file");
6ec3bb6a 1216
ede4eed4
KR
1217 if (flags & DYNAMIC)
1218 strcat (buffer, " dynamic");
6ec3bb6a 1219
ede4eed4
KR
1220 if (flags & ~(BSF_LOCAL
1221 | BSF_GLOBAL
1222 | BSF_DEBUGGING
1223 | BSF_FUNCTION
1224 | BSF_KEEP
1225 | BSF_KEEP_G
1226 | BSF_WEAK
1227 | BSF_SECTION_SYM
1228 | BSF_OLD_COMMON
1229 | BSF_NOT_AT_END
1230 | BSF_CONSTRUCTOR
1231 | BSF_WARNING
1232 | BSF_INDIRECT
1233 | BSF_FILE
1234 | BSF_DYNAMIC))
1235 strcat (buffer, " unknown-bits");
6ec3bb6a 1236
ede4eed4 1237 return buffer;
6ec3bb6a 1238}
ede4eed4
KR
1239#endif
1240\f
1241#include "elfcore.h"
1242#include "elflink.h"
1243\f
1244/* Size-dependent data and functions. */
1245const struct elf_size_info NAME(_bfd_elf,size_info) = {
1246 sizeof (Elf_External_Ehdr),
1247 sizeof (Elf_External_Phdr),
1248 sizeof (Elf_External_Shdr),
1249 sizeof (Elf_External_Rel),
1250 sizeof (Elf_External_Rela),
1251 sizeof (Elf_External_Sym),
1252 sizeof (Elf_External_Dyn),
1253 sizeof (Elf_External_Note),
1254
1255 ARCH_SIZE, FILE_ALIGN,
1256 ELFCLASS, EV_CURRENT,
b818a325
KR
1257 write_out_phdrs,
1258 write_shdrs_and_ehdr,
1259 write_relocs,
1260 elf_swap_symbol_out,
1261 elf_slurp_reloc_table,
1262 elf_slurp_symbol_table,
ede4eed4 1263};
This page took 0.236963 seconds and 4 git commands to generate.