include/elf/
[deliverable/binutils-gdb.git] / bfd / elfcode.h
CommitLineData
252b5132 1/* ELF executable support for BFD.
7898deda 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
cb33740c 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3db64b00 4 Free Software Foundation, Inc.
252b5132
RH
5
6 Written by Fred Fish @ Cygnus Support, from information published
7 in "UNIX System V Release 4, Programmers Guide: ANSI C and
8 Programming Support Tools". Sufficient support for gdb.
9
10 Rewritten by Mark Eichin @ Cygnus Support, from information
11 published in "System V Application Binary Interface", chapters 4
12 and 5, as well as the various "Processor Supplement" documents
13 derived from it. Added support for assembler and other object file
14 utilities. Further work done by Ken Raeburn (Cygnus Support), Michael
15 Meissner (Open Software Foundation), and Peter Hoogenboom (University
16 of Utah) to finish and extend this.
17
cd123cb7 18 This file is part of BFD, the Binary File Descriptor library.
252b5132 19
cd123cb7
NC
20 This program is free software; you can redistribute it and/or modify
21 it under the terms of the GNU General Public License as published by
22 the Free Software Foundation; either version 3 of the License, or
23 (at your option) any later version.
252b5132 24
cd123cb7
NC
25 This program is distributed in the hope that it will be useful,
26 but WITHOUT ANY WARRANTY; without even the implied warranty of
27 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 GNU General Public License for more details.
29
30 You should have received a copy of the GNU General Public License
31 along with this program; if not, write to the Free Software
32 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
33 MA 02110-1301, USA. */
252b5132 34
252b5132
RH
35
36/* Problems and other issues to resolve.
37
38 (1) BFD expects there to be some fixed number of "sections" in
0560d0f7 39 the object file. I.E. there is a "section_count" variable in the
252b5132
RH
40 bfd structure which contains the number of sections. However, ELF
41 supports multiple "views" of a file. In particular, with current
42 implementations, executable files typically have two tables, a
43 program header table and a section header table, both of which
44 partition the executable.
45
46 In ELF-speak, the "linking view" of the file uses the section header
47 table to access "sections" within the file, and the "execution view"
48 uses the program header table to access "segments" within the file.
49 "Segments" typically may contain all the data from one or more
50 "sections".
51
52 Note that the section header table is optional in ELF executables,
53 but it is this information that is most useful to gdb. If the
54 section header table is missing, then gdb should probably try
55 to make do with the program header table. (FIXME)
56
57 (2) The code in this file is compiled twice, once in 32-bit mode and
58 once in 64-bit mode. More of it should be made size-independent
59 and moved into elf.c.
60
61 (3) ELF section symbols are handled rather sloppily now. This should
62 be cleaned up, and ELF section symbols reconciled with BFD section
63 symbols.
64
65 (4) We need a published spec for 64-bit ELF. We've got some stuff here
66 that we're using for SPARC V9 64-bit chips, but don't assume that
67 it's cast in stone.
68 */
69
252b5132 70#include "sysdep.h"
3db64b00 71#include "bfd.h"
210ba1e8 72#include "libiberty.h"
252b5132
RH
73#include "bfdlink.h"
74#include "libbfd.h"
75#include "elf-bfd.h"
76
77/* Renaming structures, typedefs, macros and functions to be size-specific. */
78#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
79#define Elf_External_Sym NAME(Elf,External_Sym)
80#define Elf_External_Shdr NAME(Elf,External_Shdr)
81#define Elf_External_Phdr NAME(Elf,External_Phdr)
82#define Elf_External_Rel NAME(Elf,External_Rel)
83#define Elf_External_Rela NAME(Elf,External_Rela)
84#define Elf_External_Dyn NAME(Elf,External_Dyn)
85
86#define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command)
87#define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal)
88#define elf_core_file_matches_executable_p \
89 NAME(bfd_elf,core_file_matches_executable_p)
90#define elf_object_p NAME(bfd_elf,object_p)
91#define elf_core_file_p NAME(bfd_elf,core_file_p)
92#define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound)
93#define elf_get_dynamic_symtab_upper_bound \
94 NAME(bfd_elf,get_dynamic_symtab_upper_bound)
95#define elf_swap_reloc_in NAME(bfd_elf,swap_reloc_in)
96#define elf_swap_reloca_in NAME(bfd_elf,swap_reloca_in)
97#define elf_swap_reloc_out NAME(bfd_elf,swap_reloc_out)
98#define elf_swap_reloca_out NAME(bfd_elf,swap_reloca_out)
99#define elf_swap_symbol_in NAME(bfd_elf,swap_symbol_in)
100#define elf_swap_symbol_out NAME(bfd_elf,swap_symbol_out)
101#define elf_swap_phdr_in NAME(bfd_elf,swap_phdr_in)
102#define elf_swap_phdr_out NAME(bfd_elf,swap_phdr_out)
103#define elf_swap_dyn_in NAME(bfd_elf,swap_dyn_in)
104#define elf_swap_dyn_out NAME(bfd_elf,swap_dyn_out)
105#define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound)
106#define elf_canonicalize_reloc NAME(bfd_elf,canonicalize_reloc)
107#define elf_slurp_symbol_table NAME(bfd_elf,slurp_symbol_table)
6cee3f79 108#define elf_canonicalize_symtab NAME(bfd_elf,canonicalize_symtab)
252b5132
RH
109#define elf_canonicalize_dynamic_symtab \
110 NAME(bfd_elf,canonicalize_dynamic_symtab)
4c45e5c9
JJ
111#define elf_get_synthetic_symtab \
112 NAME(bfd_elf,get_synthetic_symtab)
252b5132
RH
113#define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol)
114#define elf_get_symbol_info NAME(bfd_elf,get_symbol_info)
115#define elf_get_lineno NAME(bfd_elf,get_lineno)
116#define elf_set_arch_mach NAME(bfd_elf,set_arch_mach)
117#define elf_find_nearest_line NAME(bfd_elf,find_nearest_line)
118#define elf_sizeof_headers NAME(bfd_elf,sizeof_headers)
119#define elf_set_section_contents NAME(bfd_elf,set_section_contents)
120#define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto)
121#define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel)
122#define elf_find_section NAME(bfd_elf,find_section)
252b5132
RH
123#define elf_write_shdrs_and_ehdr NAME(bfd_elf,write_shdrs_and_ehdr)
124#define elf_write_out_phdrs NAME(bfd_elf,write_out_phdrs)
d94838b1 125#define elf_checksum_contents NAME(bfd_elf,checksum_contents)
b9f66672
JL
126#define elf_write_relocs NAME(bfd_elf,write_relocs)
127#define elf_slurp_reloc_table NAME(bfd_elf,slurp_reloc_table)
252b5132
RH
128
129#if ARCH_SIZE == 64
130#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131#define ELF_R_SYM(X) ELF64_R_SYM(X)
132#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133#define ELFCLASS ELFCLASS64
134#define FILE_ALIGN 8
135#define LOG_FILE_ALIGN 3
136#endif
137#if ARCH_SIZE == 32
138#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
139#define ELF_R_SYM(X) ELF32_R_SYM(X)
140#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141#define ELFCLASS ELFCLASS32
142#define FILE_ALIGN 4
143#define LOG_FILE_ALIGN 2
144#endif
145
e460dd0d 146#if DEBUG & 2
268b6b39 147static void elf_debug_section (int, Elf_Internal_Shdr *);
e460dd0d
AM
148#endif
149#if DEBUG & 1
268b6b39 150static void elf_debug_file (Elf_Internal_Ehdr *);
252b5132
RH
151#endif
152\f
153/* Structure swapping routines */
154
155/* Should perhaps use put_offset, put_word, etc. For now, the two versions
156 can be handled by explicitly specifying 32 bits or "the long type". */
157#if ARCH_SIZE == 64
dc810e39
AM
158#define H_PUT_WORD H_PUT_64
159#define H_PUT_SIGNED_WORD H_PUT_S64
160#define H_GET_WORD H_GET_64
161#define H_GET_SIGNED_WORD H_GET_S64
252b5132
RH
162#endif
163#if ARCH_SIZE == 32
dc810e39
AM
164#define H_PUT_WORD H_PUT_32
165#define H_PUT_SIGNED_WORD H_PUT_S32
166#define H_GET_WORD H_GET_32
167#define H_GET_SIGNED_WORD H_GET_S32
252b5132
RH
168#endif
169
170/* Translate an ELF symbol in external format into an ELF symbol in internal
3e932841 171 format. */
252b5132 172
8384fb8f 173bfd_boolean
268b6b39
AM
174elf_swap_symbol_in (bfd *abfd,
175 const void *psrc,
176 const void *pshn,
177 Elf_Internal_Sym *dst)
252b5132 178{
268b6b39
AM
179 const Elf_External_Sym *src = psrc;
180 const Elf_External_Sym_Shndx *shndx = pshn;
86dc0f79
RH
181 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
dc810e39 183 dst->st_name = H_GET_32 (abfd, src->st_name);
86dc0f79 184 if (signed_vma)
dc810e39 185 dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
86dc0f79 186 else
dc810e39
AM
187 dst->st_value = H_GET_WORD (abfd, src->st_value);
188 dst->st_size = H_GET_WORD (abfd, src->st_size);
189 dst->st_info = H_GET_8 (abfd, src->st_info);
190 dst->st_other = H_GET_8 (abfd, src->st_other);
191 dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
4fbb74a6 192 if (dst->st_shndx == (SHN_XINDEX & 0xffff))
9ad5cbcf
AM
193 {
194 if (shndx == NULL)
8384fb8f 195 return FALSE;
9ad5cbcf
AM
196 dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197 }
4fbb74a6
AM
198 else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199 dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
8384fb8f 200 return TRUE;
252b5132
RH
201}
202
203/* Translate an ELF symbol in internal format into an ELF symbol in external
3e932841 204 format. */
252b5132
RH
205
206void
268b6b39
AM
207elf_swap_symbol_out (bfd *abfd,
208 const Elf_Internal_Sym *src,
209 void *cdst,
210 void *shndx)
252b5132 211{
9ad5cbcf 212 unsigned int tmp;
268b6b39 213 Elf_External_Sym *dst = cdst;
dc810e39
AM
214 H_PUT_32 (abfd, src->st_name, dst->st_name);
215 H_PUT_WORD (abfd, src->st_value, dst->st_value);
216 H_PUT_WORD (abfd, src->st_size, dst->st_size);
217 H_PUT_8 (abfd, src->st_info, dst->st_info);
218 H_PUT_8 (abfd, src->st_other, dst->st_other);
9ad5cbcf 219 tmp = src->st_shndx;
4fbb74a6 220 if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
9ad5cbcf
AM
221 {
222 if (shndx == NULL)
223 abort ();
224 H_PUT_32 (abfd, tmp, shndx);
4fbb74a6 225 tmp = SHN_XINDEX & 0xffff;
9ad5cbcf
AM
226 }
227 H_PUT_16 (abfd, tmp, dst->st_shndx);
252b5132
RH
228}
229
252b5132 230/* Translate an ELF file header in external format into an ELF file header in
3e932841 231 internal format. */
252b5132
RH
232
233static void
268b6b39
AM
234elf_swap_ehdr_in (bfd *abfd,
235 const Elf_External_Ehdr *src,
236 Elf_Internal_Ehdr *dst)
252b5132 237{
448cafa4 238 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252b5132 239 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
dc810e39
AM
240 dst->e_type = H_GET_16 (abfd, src->e_type);
241 dst->e_machine = H_GET_16 (abfd, src->e_machine);
242 dst->e_version = H_GET_32 (abfd, src->e_version);
448cafa4 243 if (signed_vma)
dc810e39 244 dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
448cafa4 245 else
dc810e39
AM
246 dst->e_entry = H_GET_WORD (abfd, src->e_entry);
247 dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
248 dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
249 dst->e_flags = H_GET_32 (abfd, src->e_flags);
250 dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
251 dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
252 dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
253 dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
254 dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
255 dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
252b5132
RH
256}
257
258/* Translate an ELF file header in internal format into an ELF file header in
3e932841 259 external format. */
252b5132
RH
260
261static void
268b6b39
AM
262elf_swap_ehdr_out (bfd *abfd,
263 const Elf_Internal_Ehdr *src,
264 Elf_External_Ehdr *dst)
252b5132 265{
5732c114 266 unsigned int tmp;
448cafa4 267 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252b5132 268 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
3e932841 269 /* note that all elements of dst are *arrays of unsigned char* already... */
dc810e39
AM
270 H_PUT_16 (abfd, src->e_type, dst->e_type);
271 H_PUT_16 (abfd, src->e_machine, dst->e_machine);
272 H_PUT_32 (abfd, src->e_version, dst->e_version);
448cafa4 273 if (signed_vma)
dc810e39 274 H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
448cafa4 275 else
dc810e39
AM
276 H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
277 H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
278 H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
279 H_PUT_32 (abfd, src->e_flags, dst->e_flags);
280 H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
281 H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
282 H_PUT_16 (abfd, src->e_phnum, dst->e_phnum);
283 H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
5732c114 284 tmp = src->e_shnum;
4fbb74a6 285 if (tmp >= (SHN_LORESERVE & 0xffff))
5732c114
AM
286 tmp = SHN_UNDEF;
287 H_PUT_16 (abfd, tmp, dst->e_shnum);
288 tmp = src->e_shstrndx;
4fbb74a6
AM
289 if (tmp >= (SHN_LORESERVE & 0xffff))
290 tmp = SHN_XINDEX & 0xffff;
5732c114 291 H_PUT_16 (abfd, tmp, dst->e_shstrndx);
252b5132
RH
292}
293
252b5132 294/* Translate an ELF section header table entry in external format into an
3e932841 295 ELF section header table entry in internal format. */
252b5132
RH
296
297static void
268b6b39
AM
298elf_swap_shdr_in (bfd *abfd,
299 const Elf_External_Shdr *src,
300 Elf_Internal_Shdr *dst)
252b5132 301{
86dc0f79
RH
302 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
303
dc810e39
AM
304 dst->sh_name = H_GET_32 (abfd, src->sh_name);
305 dst->sh_type = H_GET_32 (abfd, src->sh_type);
306 dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
86dc0f79 307 if (signed_vma)
dc810e39 308 dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
86dc0f79 309 else
dc810e39
AM
310 dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
311 dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
312 dst->sh_size = H_GET_WORD (abfd, src->sh_size);
313 dst->sh_link = H_GET_32 (abfd, src->sh_link);
314 dst->sh_info = H_GET_32 (abfd, src->sh_info);
315 dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
316 dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
252b5132
RH
317 dst->bfd_section = NULL;
318 dst->contents = NULL;
319}
320
321/* Translate an ELF section header table entry in internal format into an
3e932841 322 ELF section header table entry in external format. */
252b5132
RH
323
324static void
268b6b39
AM
325elf_swap_shdr_out (bfd *abfd,
326 const Elf_Internal_Shdr *src,
327 Elf_External_Shdr *dst)
252b5132 328{
3e932841 329 /* note that all elements of dst are *arrays of unsigned char* already... */
dc810e39
AM
330 H_PUT_32 (abfd, src->sh_name, dst->sh_name);
331 H_PUT_32 (abfd, src->sh_type, dst->sh_type);
332 H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
333 H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
334 H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
335 H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
336 H_PUT_32 (abfd, src->sh_link, dst->sh_link);
337 H_PUT_32 (abfd, src->sh_info, dst->sh_info);
338 H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
339 H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
252b5132
RH
340}
341
252b5132 342/* Translate an ELF program header table entry in external format into an
3e932841 343 ELF program header table entry in internal format. */
252b5132
RH
344
345void
268b6b39
AM
346elf_swap_phdr_in (bfd *abfd,
347 const Elf_External_Phdr *src,
348 Elf_Internal_Phdr *dst)
252b5132 349{
86dc0f79
RH
350 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
351
dc810e39
AM
352 dst->p_type = H_GET_32 (abfd, src->p_type);
353 dst->p_flags = H_GET_32 (abfd, src->p_flags);
354 dst->p_offset = H_GET_WORD (abfd, src->p_offset);
86dc0f79
RH
355 if (signed_vma)
356 {
dc810e39
AM
357 dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
358 dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
86dc0f79
RH
359 }
360 else
361 {
dc810e39
AM
362 dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
363 dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
86dc0f79 364 }
dc810e39
AM
365 dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
366 dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
367 dst->p_align = H_GET_WORD (abfd, src->p_align);
252b5132
RH
368}
369
370void
268b6b39
AM
371elf_swap_phdr_out (bfd *abfd,
372 const Elf_Internal_Phdr *src,
373 Elf_External_Phdr *dst)
252b5132 374{
147d51c2
L
375 const struct elf_backend_data *bed;
376 bfd_vma p_paddr;
377
378 bed = get_elf_backend_data (abfd);
379 p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
380
3e932841 381 /* note that all elements of dst are *arrays of unsigned char* already... */
dc810e39
AM
382 H_PUT_32 (abfd, src->p_type, dst->p_type);
383 H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
384 H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
147d51c2 385 H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
dc810e39
AM
386 H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
387 H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
388 H_PUT_32 (abfd, src->p_flags, dst->p_flags);
389 H_PUT_WORD (abfd, src->p_align, dst->p_align);
252b5132
RH
390}
391
3e932841 392/* Translate an ELF reloc from external format to internal format. */
947216bf 393void
268b6b39
AM
394elf_swap_reloc_in (bfd *abfd,
395 const bfd_byte *s,
396 Elf_Internal_Rela *dst)
252b5132 397{
947216bf 398 const Elf_External_Rel *src = (const Elf_External_Rel *) s;
dc810e39
AM
399 dst->r_offset = H_GET_WORD (abfd, src->r_offset);
400 dst->r_info = H_GET_WORD (abfd, src->r_info);
947216bf 401 dst->r_addend = 0;
252b5132
RH
402}
403
947216bf 404void
268b6b39
AM
405elf_swap_reloca_in (bfd *abfd,
406 const bfd_byte *s,
407 Elf_Internal_Rela *dst)
252b5132 408{
947216bf 409 const Elf_External_Rela *src = (const Elf_External_Rela *) s;
dc810e39
AM
410 dst->r_offset = H_GET_WORD (abfd, src->r_offset);
411 dst->r_info = H_GET_WORD (abfd, src->r_info);
412 dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
252b5132
RH
413}
414
3e932841 415/* Translate an ELF reloc from internal format to external format. */
947216bf 416void
268b6b39
AM
417elf_swap_reloc_out (bfd *abfd,
418 const Elf_Internal_Rela *src,
419 bfd_byte *d)
252b5132 420{
947216bf 421 Elf_External_Rel *dst = (Elf_External_Rel *) d;
dc810e39
AM
422 H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
423 H_PUT_WORD (abfd, src->r_info, dst->r_info);
252b5132
RH
424}
425
947216bf 426void
268b6b39
AM
427elf_swap_reloca_out (bfd *abfd,
428 const Elf_Internal_Rela *src,
429 bfd_byte *d)
252b5132 430{
947216bf 431 Elf_External_Rela *dst = (Elf_External_Rela *) d;
dc810e39
AM
432 H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
433 H_PUT_WORD (abfd, src->r_info, dst->r_info);
434 H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
252b5132
RH
435}
436
268b6b39
AM
437void
438elf_swap_dyn_in (bfd *abfd,
439 const void *p,
440 Elf_Internal_Dyn *dst)
252b5132 441{
268b6b39 442 const Elf_External_Dyn *src = p;
252b5132 443
dc810e39
AM
444 dst->d_tag = H_GET_WORD (abfd, src->d_tag);
445 dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
252b5132
RH
446}
447
268b6b39
AM
448void
449elf_swap_dyn_out (bfd *abfd,
450 const Elf_Internal_Dyn *src,
451 void *p)
252b5132 452{
268b6b39 453 Elf_External_Dyn *dst = p;
c7ac6ff8 454
dc810e39
AM
455 H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
456 H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
252b5132
RH
457}
458\f
459/* ELF .o/exec file reading */
460
252b5132
RH
461/* Begin processing a given object.
462
463 First we validate the file by reading in the ELF header and checking
464 the magic number. */
465
268b6b39
AM
466static inline bfd_boolean
467elf_file_p (Elf_External_Ehdr *x_ehdrp)
252b5132
RH
468{
469 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
470 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
471 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
472 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
473}
474
475/* Check to see if the file associated with ABFD matches the target vector
476 that ABFD points to.
477
478 Note that we may be called several times with the same ABFD, but different
479 target vectors, most of which will not match. We have to avoid leaving
480 any side effects in ABFD, or any data it points to (like tdata), if the
481 file does not match the target vector. */
482
483const bfd_target *
268b6b39 484elf_object_p (bfd *abfd)
252b5132
RH
485{
486 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
487 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
488 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
5732c114 489 Elf_Internal_Shdr i_shdr;
ed591155 490 Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
252b5132 491 unsigned int shindex;
9c5bfbb7 492 const struct elf_backend_data *ebd;
ed591155 493 struct bfd_preserve preserve;
252b5132 494 asection *s;
dc810e39 495 bfd_size_type amt;
d1036acb
L
496 const bfd_target *target;
497 const bfd_target * const *target_ptr;
252b5132 498
e84d6fca 499 preserve.marker = NULL;
a17cc40f 500
252b5132
RH
501 /* Read in the ELF header in external format. */
502
268b6b39 503 if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
252b5132
RH
504 {
505 if (bfd_get_error () != bfd_error_system_call)
506 goto got_wrong_format_error;
507 else
508 goto got_no_match;
509 }
510
511 /* Now check to see if we have a valid ELF file, and one that BFD can
512 make use of. The magic number must match, the address size ('class')
513 and byte-swapping must match our XVEC entry, and it must have a
514 section header table (FIXME: See comments re sections at top of this
3e932841 515 file). */
252b5132 516
82e51918
AM
517 if (! elf_file_p (&x_ehdr)
518 || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
519 || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
252b5132
RH
520 goto got_wrong_format_error;
521
522 /* Check that file's byte order matches xvec's */
523 switch (x_ehdr.e_ident[EI_DATA])
524 {
525 case ELFDATA2MSB: /* Big-endian */
526 if (! bfd_header_big_endian (abfd))
527 goto got_wrong_format_error;
528 break;
529 case ELFDATA2LSB: /* Little-endian */
530 if (! bfd_header_little_endian (abfd))
531 goto got_wrong_format_error;
532 break;
533 case ELFDATANONE: /* No data encoding specified */
534 default: /* Unknown data encoding specified */
535 goto got_wrong_format_error;
536 }
537
0c83546a
AM
538 if (!bfd_preserve_save (abfd, &preserve))
539 goto got_no_match;
540
d1036acb
L
541 target = abfd->xvec;
542
252b5132
RH
543 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
544 the tdata pointer in the bfd. */
545
d1036acb 546 if (! (*target->_bfd_set_format[bfd_object]) (abfd))
252b5132 547 goto got_no_match;
0c83546a 548 preserve.marker = elf_tdata (abfd);
e84d6fca 549
252b5132
RH
550 /* Now that we know the byte order, swap in the rest of the header */
551 i_ehdrp = elf_elfheader (abfd);
552 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
553#if DEBUG & 1
554 elf_debug_file (i_ehdrp);
555#endif
556
557 /* Reject ET_CORE (header indicates core file, not object file) */
558 if (i_ehdrp->e_type == ET_CORE)
559 goto got_wrong_format_error;
560
0c35f01a
AM
561 /* If this is a relocatable file and there is no section header
562 table, then we're hosed. */
563 if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
252b5132
RH
564 goto got_wrong_format_error;
565
e460dd0d 566 /* As a simple sanity check, verify that what BFD thinks is the
252b5132 567 size of each section header table entry actually matches the size
0c35f01a
AM
568 recorded in the file, but only if there are any sections. */
569 if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
252b5132
RH
570 goto got_wrong_format_error;
571
7ece0d85
JJ
572 /* Further sanity check. */
573 if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_shnum != 0)
574 goto got_wrong_format_error;
575
252b5132
RH
576 ebd = get_elf_backend_data (abfd);
577
578 /* Check that the ELF e_machine field matches what this particular
579 BFD format expects. */
580 if (ebd->elf_machine_code != i_ehdrp->e_machine
e84d6fca
AM
581 && (ebd->elf_machine_alt1 == 0
582 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
583 && (ebd->elf_machine_alt2 == 0
584 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
252b5132 585 {
252b5132
RH
586 if (ebd->elf_machine_code != EM_NONE)
587 goto got_wrong_format_error;
588
589 /* This is the generic ELF target. Let it match any ELF target
590 for which we do not have a specific backend. */
591 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
592 {
9c5bfbb7 593 const struct elf_backend_data *back;
252b5132
RH
594
595 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
596 continue;
f7231afc 597 back = xvec_get_elf_backend_data (*target_ptr);
252b5132
RH
598 if (back->elf_machine_code == i_ehdrp->e_machine
599 || (back->elf_machine_alt1 != 0
600 && back->elf_machine_alt1 == i_ehdrp->e_machine)
601 || (back->elf_machine_alt2 != 0
602 && back->elf_machine_alt2 == i_ehdrp->e_machine))
603 {
604 /* target_ptr is an ELF backend which matches this
605 object file, so reject the generic ELF target. */
606 goto got_wrong_format_error;
607 }
608 }
609 }
610
611 if (i_ehdrp->e_type == ET_EXEC)
612 abfd->flags |= EXEC_P;
613 else if (i_ehdrp->e_type == ET_DYN)
614 abfd->flags |= DYNAMIC;
615
616 if (i_ehdrp->e_phnum > 0)
617 abfd->flags |= D_PAGED;
618
619 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
620 {
621 /* It's OK if this fails for the generic target. */
622 if (ebd->elf_machine_code != EM_NONE)
623 goto got_no_match;
624 }
625
d1036acb
L
626 if (ebd->elf_machine_code != EM_NONE
627 && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
628 {
629 if (ebd->elf_osabi != ELFOSABI_NONE)
630 goto got_wrong_format_error;
631
632 /* This is an ELFOSABI_NONE ELF target. Let it match any ELF
633 target of the compatible machine for which we do not have a
634 backend with matching ELFOSABI. */
635 for (target_ptr = bfd_target_vector;
636 *target_ptr != NULL;
637 target_ptr++)
638 {
639 const struct elf_backend_data *back;
640
641 /* Skip this target and targets with incompatible byte
642 order. */
643 if (*target_ptr == target
644 || (*target_ptr)->flavour != bfd_target_elf_flavour
645 || (*target_ptr)->byteorder != target->byteorder
646 || ((*target_ptr)->header_byteorder
647 != target->header_byteorder))
648 continue;
649
f7231afc 650 back = xvec_get_elf_backend_data (*target_ptr);
d1036acb
L
651 if (back->elf_osabi == i_ehdrp->e_ident[EI_OSABI]
652 && (back->elf_machine_code == i_ehdrp->e_machine
653 || (back->elf_machine_alt1 != 0
654 && back->elf_machine_alt1 == i_ehdrp->e_machine)
655 || (back->elf_machine_alt2 != 0
656 && back->elf_machine_alt2 == i_ehdrp->e_machine)))
657 {
658 /* target_ptr is an ELF backend which matches this
659 object file, so reject the ELFOSABI_NONE ELF target. */
660 goto got_wrong_format_error;
661 }
662 }
663 }
664
7ece0d85
JJ
665 if (i_ehdrp->e_shoff != 0)
666 {
0560d0f7
AM
667 bfd_signed_vma where = i_ehdrp->e_shoff;
668
669 if (where != (file_ptr) where)
670 goto got_wrong_format_error;
671
7ece0d85 672 /* Seek to the section header table in the file. */
0560d0f7 673 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
7ece0d85 674 goto got_no_match;
5732c114 675
7ece0d85
JJ
676 /* Read the first section header at index 0, and convert to internal
677 form. */
268b6b39 678 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
7ece0d85
JJ
679 goto got_no_match;
680 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
5732c114 681
7ece0d85
JJ
682 /* If the section count is zero, the actual count is in the first
683 section header. */
684 if (i_ehdrp->e_shnum == SHN_UNDEF)
0560d0f7
AM
685 {
686 i_ehdrp->e_shnum = i_shdr.sh_size;
24639c7d
JJ
687 if (i_ehdrp->e_shnum != i_shdr.sh_size
688 || i_ehdrp->e_shnum == 0)
0560d0f7
AM
689 goto got_wrong_format_error;
690 }
5732c114 691
7ece0d85 692 /* And similarly for the string table index. */
4fbb74a6 693 if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
0560d0f7
AM
694 {
695 i_ehdrp->e_shstrndx = i_shdr.sh_link;
696 if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
697 goto got_wrong_format_error;
698 }
699
700 /* Sanity check that we can read all of the section headers.
701 It ought to be good enough to just read the last one. */
702 if (i_ehdrp->e_shnum != 1)
703 {
704 /* Check that we don't have a totally silly number of sections. */
24639c7d
JJ
705 if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
706 || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
0560d0f7
AM
707 goto got_wrong_format_error;
708
709 where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
710 if (where != (file_ptr) where)
711 goto got_wrong_format_error;
712 if ((bfd_size_type) where <= i_ehdrp->e_shoff)
713 goto got_wrong_format_error;
714
715 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
716 goto got_no_match;
717 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
718 goto got_no_match;
719
720 /* Back to where we were. */
721 where = i_ehdrp->e_shoff + sizeof (x_shdr);
722 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
723 goto got_no_match;
724 }
7ece0d85 725 }
5732c114 726
252b5132 727 /* Allocate space for a copy of the section header table in
5732c114 728 internal form. */
0c35f01a
AM
729 if (i_ehdrp->e_shnum != 0)
730 {
5732c114 731 Elf_Internal_Shdr *shdrp;
9ad5cbcf 732 unsigned int num_sec;
5732c114 733
0c35f01a 734 amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
268b6b39 735 i_shdrp = bfd_alloc (abfd, amt);
5732c114
AM
736 if (!i_shdrp)
737 goto got_no_match;
9ad5cbcf 738 num_sec = i_ehdrp->e_shnum;
9ad5cbcf
AM
739 elf_numsections (abfd) = num_sec;
740 amt = sizeof (i_shdrp) * num_sec;
268b6b39 741 elf_elfsections (abfd) = bfd_alloc (abfd, amt);
5732c114 742 if (!elf_elfsections (abfd))
0c35f01a 743 goto got_no_match;
5732c114
AM
744
745 memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
4fbb74a6 746 for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
5732c114 747 elf_elfsections (abfd)[shindex] = shdrp++;
5732c114 748
ed591155
AM
749 /* Read in the rest of the section header table and convert it
750 to internal form. */
751 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
752 {
268b6b39 753 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
ed591155
AM
754 goto got_no_match;
755 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
756
24639c7d 757 /* Sanity check sh_link and sh_info. */
4fbb74a6 758 if (i_shdrp[shindex].sh_link >= num_sec)
24639c7d
JJ
759 goto got_wrong_format_error;
760
761 if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
762 || i_shdrp[shindex].sh_type == SHT_RELA
763 || i_shdrp[shindex].sh_type == SHT_REL)
4fbb74a6 764 && i_shdrp[shindex].sh_info >= num_sec)
24639c7d
JJ
765 goto got_wrong_format_error;
766
ed591155
AM
767 /* If the section is loaded, but not page aligned, clear
768 D_PAGED. */
769 if (i_shdrp[shindex].sh_size != 0
770 && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
771 && i_shdrp[shindex].sh_type != SHT_NOBITS
772 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
b1342370 773 % ebd->minpagesize)
ed591155
AM
774 != 0))
775 abfd->flags &= ~D_PAGED;
776 }
252b5132 777 }
ed591155 778
24639c7d
JJ
779 /* A further sanity check. */
780 if (i_ehdrp->e_shnum != 0)
781 {
4fbb74a6 782 if (i_ehdrp->e_shstrndx >= elf_numsections (abfd))
0b49d371
NC
783 {
784 /* PR 2257:
785 We used to just goto got_wrong_format_error here
786 but there are binaries in existance for which this test
787 will prevent the binutils from working with them at all.
788 So we are kind, and reset the string index value to 0
789 so that at least some processing can be done. */
790 i_ehdrp->e_shstrndx = SHN_UNDEF;
791 _bfd_error_handler (_("warning: %s has a corrupt string table index - ignoring"), abfd->filename);
792 }
24639c7d 793 }
0b49d371 794 else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
24639c7d
JJ
795 goto got_wrong_format_error;
796
252b5132
RH
797 /* Read in the program headers. */
798 if (i_ehdrp->e_phnum == 0)
799 elf_tdata (abfd)->phdr = NULL;
800 else
801 {
802 Elf_Internal_Phdr *i_phdr;
803 unsigned int i;
804
dc810e39 805 amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
268b6b39 806 elf_tdata (abfd)->phdr = bfd_alloc (abfd, amt);
252b5132
RH
807 if (elf_tdata (abfd)->phdr == NULL)
808 goto got_no_match;
dc810e39 809 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
252b5132
RH
810 goto got_no_match;
811 i_phdr = elf_tdata (abfd)->phdr;
812 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
813 {
814 Elf_External_Phdr x_phdr;
815
268b6b39 816 if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
252b5132
RH
817 goto got_no_match;
818 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
819 }
820 }
821
1b3a8575 822 if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
252b5132 823 {
9ad5cbcf
AM
824 unsigned int num_sec;
825
0c35f01a
AM
826 /* Once all of the section headers have been read and converted, we
827 can start processing them. Note that the first section header is
828 a dummy placeholder entry, so we ignore it. */
9ad5cbcf
AM
829 num_sec = elf_numsections (abfd);
830 for (shindex = 1; shindex < num_sec; shindex++)
4fbb74a6
AM
831 if (!bfd_section_from_shdr (abfd, shindex))
832 goto got_no_match;
3d7f7666 833
dd863624
L
834 /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER. */
835 if (! _bfd_elf_setup_sections (abfd))
3d7f7666 836 goto got_wrong_format_error;
252b5132
RH
837 }
838
839 /* Let the backend double check the format and override global
840 information. */
841 if (ebd->elf_backend_object_p)
842 {
82e51918 843 if (! (*ebd->elf_backend_object_p) (abfd))
252b5132
RH
844 goto got_wrong_format_error;
845 }
846
a14199db
AM
847 /* Remember the entry point specified in the ELF file header. */
848 bfd_set_start_address (abfd, i_ehdrp->e_entry);
849
252b5132
RH
850 /* If we have created any reloc sections that are associated with
851 debugging sections, mark the reloc sections as debugging as well. */
852 for (s = abfd->sections; s != NULL; s = s->next)
853 {
854 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
855 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
856 && elf_section_data (s)->this_hdr.sh_info > 0)
857 {
858 unsigned long targ_index;
859 asection *targ_sec;
860
861 targ_index = elf_section_data (s)->this_hdr.sh_info;
862 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
863 if (targ_sec != NULL
864 && (targ_sec->flags & SEC_DEBUGGING) != 0)
865 s->flags |= SEC_DEBUGGING;
866 }
867 }
868
e84d6fca 869 bfd_preserve_finish (abfd, &preserve);
d1036acb 870 return target;
252b5132
RH
871
872 got_wrong_format_error:
a77a9fef
HPN
873 /* There is way too much undoing of half-known state here. The caller,
874 bfd_check_format_matches, really shouldn't iterate on live bfd's to
875 check match/no-match like it does. We have to rely on that a call to
876 bfd_default_set_arch_mach with the previously known mach, undoes what
877 was done by the first bfd_default_set_arch_mach (with mach 0) here.
878 For this to work, only elf-data and the mach may be changed by the
879 target-specific elf_backend_object_p function. Note that saving the
880 whole bfd here and restoring it would be even worse; the first thing
881 you notice is that the cached bfd file position gets out of sync. */
252b5132 882 bfd_set_error (bfd_error_wrong_format);
ed591155 883
252b5132 884 got_no_match:
e84d6fca
AM
885 if (preserve.marker != NULL)
886 bfd_preserve_restore (abfd, &preserve);
ed591155 887 return NULL;
252b5132
RH
888}
889\f
890/* ELF .o/exec file writing */
891
892/* Write out the relocs. */
893
b9f66672 894void
268b6b39 895elf_write_relocs (bfd *abfd, asection *sec, void *data)
252b5132 896{
268b6b39 897 bfd_boolean *failedp = data;
252b5132 898 Elf_Internal_Shdr *rela_hdr;
947216bf 899 bfd_vma addr_offset;
c39a58e6 900 void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
947216bf
AM
901 size_t extsize;
902 bfd_byte *dst_rela;
252b5132 903 unsigned int idx;
947216bf
AM
904 asymbol *last_sym;
905 int last_sym_idx;
252b5132
RH
906
907 /* If we have already failed, don't do anything. */
908 if (*failedp)
909 return;
910
911 if ((sec->flags & SEC_RELOC) == 0)
912 return;
913
914 /* The linker backend writes the relocs out itself, and sets the
915 reloc_count field to zero to inhibit writing them here. Also,
916 sometimes the SEC_RELOC flag gets set even when there aren't any
917 relocs. */
918 if (sec->reloc_count == 0)
919 return;
920
9a44bbd9
DJ
921 /* If we have opened an existing file for update, reloc_count may be
922 set even though we are not linking. In that case we have nothing
923 to do. */
924 if (sec->orelocation == NULL)
925 return;
926
252b5132
RH
927 rela_hdr = &elf_section_data (sec)->rel_hdr;
928
929 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
268b6b39 930 rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
252b5132
RH
931 if (rela_hdr->contents == NULL)
932 {
b34976b6 933 *failedp = TRUE;
252b5132
RH
934 return;
935 }
936
bf572ba0
MM
937 /* Figure out whether the relocations are RELA or REL relocations. */
938 if (rela_hdr->sh_type == SHT_RELA)
947216bf
AM
939 {
940 swap_out = elf_swap_reloca_out;
941 extsize = sizeof (Elf_External_Rela);
942 }
bf572ba0 943 else if (rela_hdr->sh_type == SHT_REL)
947216bf
AM
944 {
945 swap_out = elf_swap_reloc_out;
946 extsize = sizeof (Elf_External_Rel);
947 }
bf572ba0
MM
948 else
949 /* Every relocation section should be either an SHT_RELA or an
950 SHT_REL section. */
951 abort ();
952
947216bf
AM
953 /* The address of an ELF reloc is section relative for an object
954 file, and absolute for an executable file or shared library.
955 The address of a BFD reloc is always section relative. */
956 addr_offset = 0;
957 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
958 addr_offset = sec->vma;
959
3e932841 960 /* orelocation has the data, reloc_count has the count... */
947216bf
AM
961 last_sym = 0;
962 last_sym_idx = 0;
963 dst_rela = rela_hdr->contents;
252b5132 964
947216bf
AM
965 for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
966 {
967 Elf_Internal_Rela src_rela;
968 arelent *ptr;
969 asymbol *sym;
970 int n;
971
972 ptr = sec->orelocation[idx];
973 sym = *ptr->sym_ptr_ptr;
974 if (sym == last_sym)
975 n = last_sym_idx;
976 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
977 n = STN_UNDEF;
978 else
252b5132 979 {
947216bf
AM
980 last_sym = sym;
981 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
982 if (n < 0)
252b5132 983 {
b34976b6 984 *failedp = TRUE;
252b5132
RH
985 return;
986 }
947216bf 987 last_sym_idx = n;
252b5132 988 }
252b5132 989
947216bf
AM
990 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
991 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
992 && ! _bfd_elf_validate_reloc (abfd, ptr))
252b5132 993 {
b34976b6 994 *failedp = TRUE;
947216bf 995 return;
252b5132 996 }
947216bf
AM
997
998 src_rela.r_offset = ptr->address + addr_offset;
999 src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1000 src_rela.r_addend = ptr->addend;
1001 (*swap_out) (abfd, &src_rela, dst_rela);
252b5132
RH
1002 }
1003}
1004
1005/* Write out the program headers. */
1006
1007int
268b6b39
AM
1008elf_write_out_phdrs (bfd *abfd,
1009 const Elf_Internal_Phdr *phdr,
1010 unsigned int count)
252b5132
RH
1011{
1012 while (count--)
1013 {
1014 Elf_External_Phdr extphdr;
1015 elf_swap_phdr_out (abfd, phdr, &extphdr);
268b6b39
AM
1016 if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
1017 != sizeof (Elf_External_Phdr))
252b5132
RH
1018 return -1;
1019 phdr++;
1020 }
1021 return 0;
1022}
1023
1024/* Write out the section headers and the ELF file header. */
1025
b34976b6 1026bfd_boolean
268b6b39 1027elf_write_shdrs_and_ehdr (bfd *abfd)
252b5132
RH
1028{
1029 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
1030 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1031 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
1032 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
1033 unsigned int count;
dc810e39 1034 bfd_size_type amt;
252b5132
RH
1035
1036 i_ehdrp = elf_elfheader (abfd);
1037 i_shdrp = elf_elfsections (abfd);
1038
3e932841 1039 /* swap the header before spitting it out... */
252b5132
RH
1040
1041#if DEBUG & 1
1042 elf_debug_file (i_ehdrp);
1043#endif
1044 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
dc810e39 1045 amt = sizeof (x_ehdr);
252b5132 1046 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
268b6b39 1047 || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
b34976b6 1048 return FALSE;
252b5132 1049
5732c114
AM
1050 /* Some fields in the first section header handle overflow of ehdr
1051 fields. */
4fbb74a6 1052 if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
5732c114 1053 i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
4fbb74a6 1054 if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
5732c114
AM
1055 i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1056
3e932841 1057 /* at this point we've concocted all the ELF sections... */
5732c114
AM
1058 amt = i_ehdrp->e_shnum;
1059 amt *= sizeof (*x_shdrp);
268b6b39 1060 x_shdrp = bfd_alloc (abfd, amt);
252b5132 1061 if (!x_shdrp)
b34976b6 1062 return FALSE;
252b5132 1063
5732c114 1064 for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
252b5132
RH
1065 {
1066#if DEBUG & 2
5732c114 1067 elf_debug_section (count, *i_shdrp);
252b5132 1068#endif
5732c114 1069 elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
252b5132
RH
1070 }
1071 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
268b6b39 1072 || bfd_bwrite (x_shdrp, amt, abfd) != amt)
b34976b6 1073 return FALSE;
252b5132 1074
3e932841 1075 /* need to dump the string table too... */
252b5132 1076
b34976b6 1077 return TRUE;
252b5132
RH
1078}
1079
d94838b1
RM
1080bfd_boolean
1081elf_checksum_contents (bfd *abfd,
1082 void (*process) (const void *, size_t, void *),
1083 void *arg)
1084{
1085 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1086 Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1087 Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1088 unsigned int count, num;
1089
1090 {
1091 Elf_External_Ehdr x_ehdr;
1092 Elf_Internal_Ehdr i_ehdr;
1093
1094 i_ehdr = *i_ehdrp;
1095 i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1096 elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1097 (*process) (&x_ehdr, sizeof x_ehdr, arg);
1098 }
1099
1100 num = i_ehdrp->e_phnum;
1101 for (count = 0; count < num; count++)
1102 {
1103 Elf_External_Phdr x_phdr;
1104 elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1105 (*process) (&x_phdr, sizeof x_phdr, arg);
1106 }
1107
1108 num = elf_numsections (abfd);
1109 for (count = 0; count < num; count++)
1110 {
1111 Elf_Internal_Shdr i_shdr;
1112 Elf_External_Shdr x_shdr;
1113
1114 i_shdr = *i_shdrp[count];
1115 i_shdr.sh_offset = 0;
1116
1117 elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1118 (*process) (&x_shdr, sizeof x_shdr, arg);
1119
1120 if (i_shdr.contents)
1121 (*process) (i_shdr.contents, i_shdr.sh_size, arg);
1122 }
1123
1124 return TRUE;
1125}
1126
252b5132 1127long
268b6b39 1128elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
252b5132
RH
1129{
1130 Elf_Internal_Shdr *hdr;
1131 Elf_Internal_Shdr *verhdr;
1132 unsigned long symcount; /* Number of external ELF symbols */
1133 elf_symbol_type *sym; /* Pointer to current bfd symbol */
1134 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
6cdc0ccc
AM
1135 Elf_Internal_Sym *isym;
1136 Elf_Internal_Sym *isymend;
1137 Elf_Internal_Sym *isymbuf = NULL;
1138 Elf_External_Versym *xver;
1139 Elf_External_Versym *xverbuf = NULL;
9c5bfbb7 1140 const struct elf_backend_data *ebd;
dc810e39 1141 bfd_size_type amt;
252b5132
RH
1142
1143 /* Read each raw ELF symbol, converting from external ELF form to
1144 internal ELF form, and then using the information to create a
1145 canonical bfd symbol table entry.
1146
1147 Note that we allocate the initial bfd canonical symbol buffer
1148 based on a one-to-one mapping of the ELF symbols to canonical
1149 symbols. We actually use all the ELF symbols, so there will be no
1150 space left over at the end. When we have all the symbols, we
3e932841 1151 build the caller's pointer vector. */
252b5132
RH
1152
1153 if (! dynamic)
1154 {
1155 hdr = &elf_tdata (abfd)->symtab_hdr;
1156 verhdr = NULL;
1157 }
1158 else
1159 {
1160 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1161 if (elf_dynversym (abfd) == 0)
1162 verhdr = NULL;
1163 else
1164 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1165 if ((elf_tdata (abfd)->dynverdef_section != 0
1166 && elf_tdata (abfd)->verdef == NULL)
1167 || (elf_tdata (abfd)->dynverref_section != 0
1168 && elf_tdata (abfd)->verref == NULL))
1169 {
fc0e6df6 1170 if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
252b5132
RH
1171 return -1;
1172 }
1173 }
1174
6cdc0ccc 1175 ebd = get_elf_backend_data (abfd);
252b5132 1176 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
252b5132
RH
1177 if (symcount == 0)
1178 sym = symbase = NULL;
1179 else
1180 {
6cdc0ccc
AM
1181 isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1182 NULL, NULL, NULL);
1183 if (isymbuf == NULL)
1184 return -1;
252b5132 1185
dc810e39
AM
1186 amt = symcount;
1187 amt *= sizeof (elf_symbol_type);
268b6b39 1188 symbase = bfd_zalloc (abfd, amt);
252b5132 1189 if (symbase == (elf_symbol_type *) NULL)
9ad5cbcf 1190 goto error_return;
252b5132
RH
1191
1192 /* Read the raw ELF version symbol information. */
252b5132
RH
1193 if (verhdr != NULL
1194 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1195 {
1196 (*_bfd_error_handler)
1197 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1198 abfd->filename,
1199 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1200 symcount);
1201
1202 /* Slurp in the symbols without the version information,
0560d0f7 1203 since that is more helpful than just quitting. */
252b5132
RH
1204 verhdr = NULL;
1205 }
1206
1207 if (verhdr != NULL)
1208 {
1209 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1210 goto error_return;
1211
268b6b39 1212 xverbuf = bfd_malloc (verhdr->sh_size);
6cdc0ccc 1213 if (xverbuf == NULL && verhdr->sh_size != 0)
252b5132
RH
1214 goto error_return;
1215
268b6b39 1216 if (bfd_bread (xverbuf, verhdr->sh_size, abfd) != verhdr->sh_size)
252b5132
RH
1217 goto error_return;
1218 }
1219
1220 /* Skip first symbol, which is a null dummy. */
6cdc0ccc
AM
1221 xver = xverbuf;
1222 if (xver != NULL)
1223 ++xver;
1224 isymend = isymbuf + symcount;
1225 for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
252b5132 1226 {
6cdc0ccc 1227 memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
252b5132
RH
1228 sym->symbol.the_bfd = abfd;
1229
26c61ae5 1230 sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
252b5132 1231
6cdc0ccc 1232 sym->symbol.value = isym->st_value;
252b5132 1233
6cdc0ccc 1234 if (isym->st_shndx == SHN_UNDEF)
9ad5cbcf
AM
1235 {
1236 sym->symbol.section = bfd_und_section_ptr;
1237 }
6cdc0ccc 1238 else if (isym->st_shndx == SHN_ABS)
252b5132
RH
1239 {
1240 sym->symbol.section = bfd_abs_section_ptr;
1241 }
6cdc0ccc 1242 else if (isym->st_shndx == SHN_COMMON)
252b5132
RH
1243 {
1244 sym->symbol.section = bfd_com_section_ptr;
1245 /* Elf puts the alignment into the `value' field, and
1246 the size into the `size' field. BFD wants to see the
1247 size in the value field, and doesn't care (at the
1248 moment) about the alignment. */
6cdc0ccc 1249 sym->symbol.value = isym->st_size;
252b5132 1250 }
252b5132 1251 else
cb33740c
AM
1252 {
1253 sym->symbol.section
1254 = bfd_section_from_elf_index (abfd, isym->st_shndx);
1255 if (sym->symbol.section == NULL)
1256 {
1257 /* This symbol is in a section for which we did not
1258 create a BFD section. Just use bfd_abs_section,
1259 although it is wrong. FIXME. */
1260 sym->symbol.section = bfd_abs_section_ptr;
1261 }
1262 }
252b5132 1263
1049f94e 1264 /* If this is a relocatable file, then the symbol value is
0560d0f7 1265 already section relative. */
252b5132
RH
1266 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1267 sym->symbol.value -= sym->symbol.section->vma;
1268
6cdc0ccc 1269 switch (ELF_ST_BIND (isym->st_info))
252b5132
RH
1270 {
1271 case STB_LOCAL:
1272 sym->symbol.flags |= BSF_LOCAL;
1273 break;
1274 case STB_GLOBAL:
6cdc0ccc 1275 if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
252b5132
RH
1276 sym->symbol.flags |= BSF_GLOBAL;
1277 break;
1278 case STB_WEAK:
1279 sym->symbol.flags |= BSF_WEAK;
1280 break;
1281 }
1282
6cdc0ccc 1283 switch (ELF_ST_TYPE (isym->st_info))
252b5132
RH
1284 {
1285 case STT_SECTION:
1286 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1287 break;
1288 case STT_FILE:
1289 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1290 break;
1291 case STT_FUNC:
1292 sym->symbol.flags |= BSF_FUNCTION;
1293 break;
504b7d20
NC
1294 case STT_COMMON:
1295 /* FIXME: Do we have to put the size field into the value field
1296 as we do with symbols in SHN_COMMON sections (see above) ? */
1297 /* Fall through. */
252b5132
RH
1298 case STT_OBJECT:
1299 sym->symbol.flags |= BSF_OBJECT;
1300 break;
0be9069d
L
1301 case STT_TLS:
1302 sym->symbol.flags |= BSF_THREAD_LOCAL;
1303 break;
d9352518
DB
1304 case STT_RELC:
1305 sym->symbol.flags |= BSF_RELC;
1306 break;
1307 case STT_SRELC:
1308 sym->symbol.flags |= BSF_SRELC;
1309 break;
252b5132
RH
1310 }
1311
1312 if (dynamic)
1313 sym->symbol.flags |= BSF_DYNAMIC;
1314
6cdc0ccc 1315 if (xver != NULL)
252b5132
RH
1316 {
1317 Elf_Internal_Versym iversym;
1318
6cdc0ccc 1319 _bfd_elf_swap_versym_in (abfd, xver, &iversym);
252b5132 1320 sym->version = iversym.vs_vers;
6cdc0ccc 1321 xver++;
252b5132
RH
1322 }
1323
1324 /* Do some backend-specific processing on this symbol. */
6cdc0ccc
AM
1325 if (ebd->elf_backend_symbol_processing)
1326 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
252b5132
RH
1327 }
1328 }
1329
1330 /* Do some backend-specific processing on this symbol table. */
6cdc0ccc
AM
1331 if (ebd->elf_backend_symbol_table_processing)
1332 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
252b5132
RH
1333
1334 /* We rely on the zalloc to clear out the final symbol entry. */
1335
1336 symcount = sym - symbase;
1337
1338 /* Fill in the user's symbol pointer vector if needed. */
1339 if (symptrs)
1340 {
1341 long l = symcount;
1342
1343 sym = symbase;
1344 while (l-- > 0)
1345 {
1346 *symptrs++ = &sym->symbol;
1347 sym++;
1348 }
1349 *symptrs = 0; /* Final null pointer */
1350 }
1351
6cdc0ccc
AM
1352 if (xverbuf != NULL)
1353 free (xverbuf);
1354 if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1355 free (isymbuf);
252b5132 1356 return symcount;
9ad5cbcf 1357
252b5132 1358error_return:
6cdc0ccc
AM
1359 if (xverbuf != NULL)
1360 free (xverbuf);
1361 if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1362 free (isymbuf);
252b5132
RH
1363 return -1;
1364}
1365
5c799c07 1366/* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
42fdc509 1367 them. */
252b5132 1368
b34976b6 1369static bfd_boolean
268b6b39
AM
1370elf_slurp_reloc_table_from_section (bfd *abfd,
1371 asection *asect,
1372 Elf_Internal_Shdr *rel_hdr,
1373 bfd_size_type reloc_count,
1374 arelent *relents,
1375 asymbol **symbols,
1376 bfd_boolean dynamic)
252b5132 1377{
9c5bfbb7 1378 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
268b6b39 1379 void *allocated = NULL;
252b5132 1380 bfd_byte *native_relocs;
252b5132
RH
1381 arelent *relent;
1382 unsigned int i;
1383 int entsize;
5ad8645c 1384 unsigned int symcount;
252b5132 1385
268b6b39 1386 allocated = bfd_malloc (rel_hdr->sh_size);
252b5132
RH
1387 if (allocated == NULL)
1388 goto error_return;
1389
1390 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
dc810e39 1391 || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
252b5132
RH
1392 != rel_hdr->sh_size))
1393 goto error_return;
1394
268b6b39 1395 native_relocs = allocated;
252b5132 1396
252b5132
RH
1397 entsize = rel_hdr->sh_entsize;
1398 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1399 || entsize == sizeof (Elf_External_Rela));
1400
5ad8645c
AM
1401 if (dynamic)
1402 symcount = bfd_get_dynamic_symcount (abfd);
1403 else
1404 symcount = bfd_get_symcount (abfd);
1405
252b5132
RH
1406 for (i = 0, relent = relents;
1407 i < reloc_count;
1408 i++, relent++, native_relocs += entsize)
1409 {
1410 Elf_Internal_Rela rela;
252b5132
RH
1411
1412 if (entsize == sizeof (Elf_External_Rela))
947216bf 1413 elf_swap_reloca_in (abfd, native_relocs, &rela);
252b5132 1414 else
947216bf 1415 elf_swap_reloc_in (abfd, native_relocs, &rela);
252b5132
RH
1416
1417 /* The address of an ELF reloc is section relative for an object
1418 file, and absolute for an executable file or shared library.
1419 The address of a normal BFD reloc is always section relative,
1420 and the address of a dynamic reloc is absolute.. */
1421 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1422 relent->address = rela.r_offset;
1423 else
1424 relent->address = rela.r_offset - asect->vma;
1425
1426 if (ELF_R_SYM (rela.r_info) == 0)
1427 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
05a487dc 1428 else if (ELF_R_SYM (rela.r_info) > symcount)
1f70368c
DJ
1429 {
1430 (*_bfd_error_handler)
1431 (_("%s(%s): relocation %d has invalid symbol index %ld"),
1432 abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
1433 relent->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
1434 }
252b5132
RH
1435 else
1436 {
b48c61bc 1437 asymbol **ps;
28c9d252 1438
252b5132 1439 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
252b5132 1440
f9cfae62 1441 relent->sym_ptr_ptr = ps;
252b5132
RH
1442 }
1443
1444 relent->addend = rela.r_addend;
1445
90fff0d4
DJ
1446 if ((entsize == sizeof (Elf_External_Rela)
1447 && ebd->elf_info_to_howto != NULL)
1448 || ebd->elf_info_to_howto_rel == NULL)
252b5132
RH
1449 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1450 else
947216bf 1451 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rela);
252b5132
RH
1452 }
1453
252b5132
RH
1454 if (allocated != NULL)
1455 free (allocated);
1456
b34976b6 1457 return TRUE;
252b5132
RH
1458
1459 error_return:
1460 if (allocated != NULL)
1461 free (allocated);
b34976b6 1462 return FALSE;
252b5132
RH
1463}
1464
42fdc509
MM
1465/* Read in and swap the external relocs. */
1466
b34976b6 1467bfd_boolean
268b6b39
AM
1468elf_slurp_reloc_table (bfd *abfd,
1469 asection *asect,
1470 asymbol **symbols,
1471 bfd_boolean dynamic)
42fdc509
MM
1472{
1473 struct bfd_elf_section_data * const d = elf_section_data (asect);
1474 Elf_Internal_Shdr *rel_hdr;
1475 Elf_Internal_Shdr *rel_hdr2;
1476 bfd_size_type reloc_count;
1477 bfd_size_type reloc_count2;
1478 arelent *relents;
dc810e39 1479 bfd_size_type amt;
42fdc509
MM
1480
1481 if (asect->relocation != NULL)
b34976b6 1482 return TRUE;
42fdc509
MM
1483
1484 if (! dynamic)
1485 {
1486 if ((asect->flags & SEC_RELOC) == 0
1487 || asect->reloc_count == 0)
b34976b6 1488 return TRUE;
42fdc509
MM
1489
1490 rel_hdr = &d->rel_hdr;
d9bc7a44 1491 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
42fdc509 1492 rel_hdr2 = d->rel_hdr2;
d9bc7a44 1493 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
42fdc509
MM
1494
1495 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1496 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1497 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1498
1499 }
1500 else
1501 {
57e21bef
MM
1502 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1503 case because relocations against this section may use the
1504 dynamic symbol table, and in that case bfd_section_from_shdr
1505 in elf.c does not update the RELOC_COUNT. */
eea6121a 1506 if (asect->size == 0)
b34976b6 1507 return TRUE;
42fdc509
MM
1508
1509 rel_hdr = &d->this_hdr;
d9bc7a44 1510 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
42fdc509 1511 rel_hdr2 = NULL;
57e21bef 1512 reloc_count2 = 0;
42fdc509
MM
1513 }
1514
dc810e39 1515 amt = (reloc_count + reloc_count2) * sizeof (arelent);
268b6b39 1516 relents = bfd_alloc (abfd, amt);
42fdc509 1517 if (relents == NULL)
b34976b6 1518 return FALSE;
42fdc509
MM
1519
1520 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1521 rel_hdr, reloc_count,
1522 relents,
1523 symbols, dynamic))
b34976b6 1524 return FALSE;
60bcf0fa
NC
1525
1526 if (rel_hdr2
42fdc509
MM
1527 && !elf_slurp_reloc_table_from_section (abfd, asect,
1528 rel_hdr2, reloc_count2,
1529 relents + reloc_count,
1530 symbols, dynamic))
b34976b6 1531 return FALSE;
42fdc509 1532
42fdc509 1533 asect->relocation = relents;
b34976b6 1534 return TRUE;
42fdc509
MM
1535}
1536
e460dd0d 1537#if DEBUG & 2
252b5132 1538static void
268b6b39 1539elf_debug_section (int num, Elf_Internal_Shdr *hdr)
252b5132
RH
1540{
1541 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1542 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1543 (long) hdr);
1544 fprintf (stderr,
1545 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1546 (long) hdr->sh_name,
1547 (long) hdr->sh_type,
1548 (long) hdr->sh_flags);
1549 fprintf (stderr,
1550 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1551 (long) hdr->sh_addr,
1552 (long) hdr->sh_offset,
1553 (long) hdr->sh_size);
1554 fprintf (stderr,
1555 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1556 (long) hdr->sh_link,
1557 (long) hdr->sh_info,
1558 (long) hdr->sh_addralign);
1559 fprintf (stderr, "sh_entsize = %ld\n",
1560 (long) hdr->sh_entsize);
1561 fflush (stderr);
1562}
e460dd0d 1563#endif
252b5132 1564
e460dd0d 1565#if DEBUG & 1
252b5132 1566static void
268b6b39 1567elf_debug_file (Elf_Internal_Ehdr *ehdrp)
252b5132
RH
1568{
1569 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1570 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1571 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1572 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1573 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1574 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1575 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1576}
252b5132
RH
1577#endif
1578\f
8d6337fe
RM
1579/* Create a new BFD as if by bfd_openr. Rather than opening a file,
1580 reconstruct an ELF file by reading the segments out of remote memory
1581 based on the ELF file header at EHDR_VMA and the ELF program headers it
1582 points to. If not null, *LOADBASEP is filled in with the difference
1583 between the VMAs from which the segments were read, and the VMAs the
1584 file headers (and hence BFD's idea of each section's VMA) put them at.
1585
1586 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
1587 remote memory at target address VMA into the local buffer at MYADDR; it
1588 should return zero on success or an `errno' code on failure. TEMPL must
1589 be a BFD for a target with the word size and byte order found in the
1590 remote memory. */
1591
1592bfd *
268b6b39
AM
1593NAME(_bfd_elf,bfd_from_remote_memory)
1594 (bfd *templ,
1595 bfd_vma ehdr_vma,
1596 bfd_vma *loadbasep,
f075ee0c 1597 int (*target_read_memory) (bfd_vma, bfd_byte *, int))
8d6337fe
RM
1598{
1599 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
1600 Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1601 Elf_External_Phdr *x_phdrs;
1602 Elf_Internal_Phdr *i_phdrs, *last_phdr;
1603 bfd *nbfd;
1604 struct bfd_in_memory *bim;
1605 int contents_size;
f075ee0c 1606 bfd_byte *contents;
8d6337fe
RM
1607 int err;
1608 unsigned int i;
1609 bfd_vma loadbase;
3fec76aa 1610 bfd_boolean loadbase_set;
8d6337fe
RM
1611
1612 /* Read in the ELF header in external format. */
f075ee0c 1613 err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
8d6337fe
RM
1614 if (err)
1615 {
1616 bfd_set_error (bfd_error_system_call);
1617 errno = err;
1618 return NULL;
1619 }
1620
1621 /* Now check to see if we have a valid ELF file, and one that BFD can
1622 make use of. The magic number must match, the address size ('class')
1623 and byte-swapping must match our XVEC entry. */
1624
1625 if (! elf_file_p (&x_ehdr)
1626 || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1627 || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1628 {
1629 bfd_set_error (bfd_error_wrong_format);
1630 return NULL;
1631 }
1632
1633 /* Check that file's byte order matches xvec's */
1634 switch (x_ehdr.e_ident[EI_DATA])
1635 {
1636 case ELFDATA2MSB: /* Big-endian */
1637 if (! bfd_header_big_endian (templ))
1638 {
1639 bfd_set_error (bfd_error_wrong_format);
1640 return NULL;
1641 }
1642 break;
1643 case ELFDATA2LSB: /* Little-endian */
1644 if (! bfd_header_little_endian (templ))
1645 {
1646 bfd_set_error (bfd_error_wrong_format);
1647 return NULL;
1648 }
1649 break;
1650 case ELFDATANONE: /* No data encoding specified */
1651 default: /* Unknown data encoding specified */
1652 bfd_set_error (bfd_error_wrong_format);
1653 return NULL;
1654 }
1655
1656 elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1657
1658 /* The file header tells where to find the program headers.
1659 These are what we use to actually choose what to read. */
1660
1661 if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1662 {
1663 bfd_set_error (bfd_error_wrong_format);
1664 return NULL;
1665 }
1666
268b6b39 1667 x_phdrs = bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
8d6337fe
RM
1668 if (x_phdrs == NULL)
1669 {
1670 bfd_set_error (bfd_error_no_memory);
1671 return NULL;
1672 }
f075ee0c 1673 err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
8d6337fe
RM
1674 i_ehdr.e_phnum * sizeof x_phdrs[0]);
1675 if (err)
1676 {
1677 free (x_phdrs);
1678 bfd_set_error (bfd_error_system_call);
1679 errno = err;
1680 return NULL;
1681 }
1682 i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1683
1684 contents_size = 0;
1685 last_phdr = NULL;
1686 loadbase = ehdr_vma;
3fec76aa 1687 loadbase_set = FALSE;
8d6337fe
RM
1688 for (i = 0; i < i_ehdr.e_phnum; ++i)
1689 {
1690 elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
3fec76aa 1691 if (i_phdrs[i].p_type == PT_LOAD)
8d6337fe
RM
1692 {
1693 bfd_vma segment_end;
1694 segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1695 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1696 if (segment_end > (bfd_vma) contents_size)
1697 contents_size = segment_end;
1698
3fec76aa
JK
1699 /* LOADADDR is the `Base address' from the gELF specification:
1700 `lowest p_vaddr value for a PT_LOAD segment' is P_VADDR from the
1701 first PT_LOAD as PT_LOADs are ordered by P_VADDR. */
1702 if (!loadbase_set && (i_phdrs[i].p_offset & -i_phdrs[i].p_align) == 0)
1703 {
1704 loadbase = ehdr_vma - (i_phdrs[i].p_vaddr & -i_phdrs[i].p_align);
1705 loadbase_set = TRUE;
1706 }
8d6337fe
RM
1707
1708 last_phdr = &i_phdrs[i];
1709 }
1710 }
1711 if (last_phdr == NULL)
1712 {
1713 /* There were no PT_LOAD segments, so we don't have anything to read. */
1714 free (x_phdrs);
1715 bfd_set_error (bfd_error_wrong_format);
1716 return NULL;
1717 }
1718
1719 /* Trim the last segment so we don't bother with zeros in the last page
1720 that are off the end of the file. However, if the extra bit in that
1721 page includes the section headers, keep them. */
1722 if ((bfd_vma) contents_size > last_phdr->p_offset + last_phdr->p_filesz
1723 && (bfd_vma) contents_size >= (i_ehdr.e_shoff
1724 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1725 {
1726 contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1727 if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1728 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1729 contents_size = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1730 }
1731 else
1732 contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1733
1734 /* Now we know the size of the whole image we want read in. */
268b6b39 1735 contents = bfd_zmalloc (contents_size);
8d6337fe
RM
1736 if (contents == NULL)
1737 {
1738 free (x_phdrs);
1739 bfd_set_error (bfd_error_no_memory);
1740 return NULL;
1741 }
1742
1743 for (i = 0; i < i_ehdr.e_phnum; ++i)
3fec76aa 1744 if (i_phdrs[i].p_type == PT_LOAD)
8d6337fe
RM
1745 {
1746 bfd_vma start = i_phdrs[i].p_offset & -i_phdrs[i].p_align;
1747 bfd_vma end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1748 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1749 if (end > (bfd_vma) contents_size)
1750 end = contents_size;
1751 err = target_read_memory ((loadbase + i_phdrs[i].p_vaddr)
1752 & -i_phdrs[i].p_align,
1753 contents + start, end - start);
1754 if (err)
1755 {
1756 free (x_phdrs);
1757 free (contents);
1758 bfd_set_error (bfd_error_system_call);
1759 errno = err;
1760 return NULL;
1761 }
1762 }
1763 free (x_phdrs);
1764
1765 /* If the segments visible in memory didn't include the section headers,
1766 then clear them from the file header. */
1767 if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1768 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1769 {
1770 memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1771 memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1772 memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1773 }
1774
1775 /* This will normally have been in the first PT_LOAD segment. But it
1776 conceivably could be missing, and we might have just changed it. */
1777 memcpy (contents, &x_ehdr, sizeof x_ehdr);
1778
1779 /* Now we have a memory image of the ELF file contents. Make a BFD. */
268b6b39 1780 bim = bfd_malloc (sizeof (struct bfd_in_memory));
8d6337fe
RM
1781 if (bim == NULL)
1782 {
1783 free (contents);
1784 bfd_set_error (bfd_error_no_memory);
1785 return NULL;
1786 }
1787 nbfd = _bfd_new_bfd ();
1788 if (nbfd == NULL)
1789 {
1790 free (bim);
1791 free (contents);
1792 bfd_set_error (bfd_error_no_memory);
1793 return NULL;
1794 }
1795 nbfd->filename = "<in-memory>";
1796 nbfd->xvec = templ->xvec;
1797 bim->size = contents_size;
1798 bim->buffer = contents;
268b6b39 1799 nbfd->iostream = bim;
8d6337fe
RM
1800 nbfd->flags = BFD_IN_MEMORY;
1801 nbfd->direction = read_direction;
1802 nbfd->mtime = time (NULL);
1803 nbfd->mtime_set = TRUE;
1804
1805 if (loadbasep)
1806 *loadbasep = loadbase;
1807 return nbfd;
1808}
1809\f
252b5132 1810#include "elfcore.h"
252b5132
RH
1811\f
1812/* Size-dependent data and functions. */
1813const struct elf_size_info NAME(_bfd_elf,size_info) = {
1814 sizeof (Elf_External_Ehdr),
1815 sizeof (Elf_External_Phdr),
1816 sizeof (Elf_External_Shdr),
1817 sizeof (Elf_External_Rel),
1818 sizeof (Elf_External_Rela),
1819 sizeof (Elf_External_Sym),
1820 sizeof (Elf_External_Dyn),
1821 sizeof (Elf_External_Note),
70bcb145 1822 4,
c7ac6ff8 1823 1,
45d6a902 1824 ARCH_SIZE, LOG_FILE_ALIGN,
252b5132
RH
1825 ELFCLASS, EV_CURRENT,
1826 elf_write_out_phdrs,
1827 elf_write_shdrs_and_ehdr,
d94838b1 1828 elf_checksum_contents,
b9f66672 1829 elf_write_relocs,
73ff0d56 1830 elf_swap_symbol_in,
252b5132
RH
1831 elf_swap_symbol_out,
1832 elf_slurp_reloc_table,
1833 elf_slurp_symbol_table,
c7ac6ff8
MM
1834 elf_swap_dyn_in,
1835 elf_swap_dyn_out,
947216bf
AM
1836 elf_swap_reloc_in,
1837 elf_swap_reloc_out,
1838 elf_swap_reloca_in,
1839 elf_swap_reloca_out
252b5132 1840};
This page took 0.529215 seconds and 4 git commands to generate.