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