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