Fix typo.
[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,
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
3e110533 31Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132
RH
32
33/* Problems and other issues to resolve.
34
35 (1) BFD expects there to be some fixed number of "sections" in
0560d0f7 36 the object file. I.E. there is a "section_count" variable in the
252b5132
RH
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
7ece0d85
JJ
610 if (i_ehdrp->e_shoff != 0)
611 {
0560d0f7
AM
612 bfd_signed_vma where = i_ehdrp->e_shoff;
613
614 if (where != (file_ptr) where)
615 goto got_wrong_format_error;
616
7ece0d85 617 /* Seek to the section header table in the file. */
0560d0f7 618 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
7ece0d85 619 goto got_no_match;
5732c114 620
7ece0d85
JJ
621 /* Read the first section header at index 0, and convert to internal
622 form. */
268b6b39 623 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
7ece0d85
JJ
624 goto got_no_match;
625 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
5732c114 626
7ece0d85
JJ
627 /* If the section count is zero, the actual count is in the first
628 section header. */
629 if (i_ehdrp->e_shnum == SHN_UNDEF)
0560d0f7
AM
630 {
631 i_ehdrp->e_shnum = i_shdr.sh_size;
24639c7d
JJ
632 if (i_ehdrp->e_shnum != i_shdr.sh_size
633 || i_ehdrp->e_shnum == 0)
0560d0f7
AM
634 goto got_wrong_format_error;
635 }
5732c114 636
7ece0d85
JJ
637 /* And similarly for the string table index. */
638 if (i_ehdrp->e_shstrndx == SHN_XINDEX)
0560d0f7
AM
639 {
640 i_ehdrp->e_shstrndx = i_shdr.sh_link;
641 if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
642 goto got_wrong_format_error;
643 }
644
645 /* Sanity check that we can read all of the section headers.
646 It ought to be good enough to just read the last one. */
647 if (i_ehdrp->e_shnum != 1)
648 {
649 /* Check that we don't have a totally silly number of sections. */
24639c7d
JJ
650 if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
651 || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
0560d0f7
AM
652 goto got_wrong_format_error;
653
654 where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
655 if (where != (file_ptr) where)
656 goto got_wrong_format_error;
657 if ((bfd_size_type) where <= i_ehdrp->e_shoff)
658 goto got_wrong_format_error;
659
660 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
661 goto got_no_match;
662 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
663 goto got_no_match;
664
665 /* Back to where we were. */
666 where = i_ehdrp->e_shoff + sizeof (x_shdr);
667 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
668 goto got_no_match;
669 }
7ece0d85 670 }
5732c114 671
252b5132 672 /* Allocate space for a copy of the section header table in
5732c114 673 internal form. */
0c35f01a
AM
674 if (i_ehdrp->e_shnum != 0)
675 {
5732c114 676 Elf_Internal_Shdr *shdrp;
9ad5cbcf 677 unsigned int num_sec;
5732c114 678
0c35f01a 679 amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
268b6b39 680 i_shdrp = bfd_alloc (abfd, amt);
5732c114
AM
681 if (!i_shdrp)
682 goto got_no_match;
9ad5cbcf
AM
683 num_sec = i_ehdrp->e_shnum;
684 if (num_sec > SHN_LORESERVE)
685 num_sec += SHN_HIRESERVE + 1 - SHN_LORESERVE;
686 elf_numsections (abfd) = num_sec;
687 amt = sizeof (i_shdrp) * num_sec;
268b6b39 688 elf_elfsections (abfd) = bfd_alloc (abfd, amt);
5732c114 689 if (!elf_elfsections (abfd))
0c35f01a 690 goto got_no_match;
5732c114
AM
691
692 memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
693 shdrp = i_shdrp;
694 shindex = 0;
9ad5cbcf 695 if (num_sec > SHN_LORESERVE)
5732c114
AM
696 {
697 for ( ; shindex < SHN_LORESERVE; shindex++)
698 elf_elfsections (abfd)[shindex] = shdrp++;
699 for ( ; shindex < SHN_HIRESERVE + 1; shindex++)
9ad5cbcf 700 elf_elfsections (abfd)[shindex] = i_shdrp;
5732c114 701 }
9ad5cbcf 702 for ( ; shindex < num_sec; shindex++)
5732c114 703 elf_elfsections (abfd)[shindex] = shdrp++;
5732c114 704
ed591155
AM
705 /* Read in the rest of the section header table and convert it
706 to internal form. */
707 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
708 {
268b6b39 709 if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
ed591155
AM
710 goto got_no_match;
711 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
712
24639c7d
JJ
713 /* Sanity check sh_link and sh_info. */
714 if (i_shdrp[shindex].sh_link >= num_sec
715 || (i_shdrp[shindex].sh_link >= SHN_LORESERVE
716 && i_shdrp[shindex].sh_link <= SHN_HIRESERVE))
717 goto got_wrong_format_error;
718
719 if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
720 || i_shdrp[shindex].sh_type == SHT_RELA
721 || i_shdrp[shindex].sh_type == SHT_REL)
722 && (i_shdrp[shindex].sh_info >= num_sec
723 || (i_shdrp[shindex].sh_info >= SHN_LORESERVE
724 && i_shdrp[shindex].sh_info <= SHN_HIRESERVE)))
725 goto got_wrong_format_error;
726
ed591155
AM
727 /* If the section is loaded, but not page aligned, clear
728 D_PAGED. */
729 if (i_shdrp[shindex].sh_size != 0
730 && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
731 && i_shdrp[shindex].sh_type != SHT_NOBITS
732 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
b1342370 733 % ebd->minpagesize)
ed591155
AM
734 != 0))
735 abfd->flags &= ~D_PAGED;
736 }
252b5132 737 }
ed591155 738
24639c7d
JJ
739 /* A further sanity check. */
740 if (i_ehdrp->e_shnum != 0)
741 {
742 if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
743 || (i_ehdrp->e_shstrndx >= SHN_LORESERVE
744 && i_ehdrp->e_shstrndx <= SHN_HIRESERVE))
0b49d371
NC
745 {
746 /* PR 2257:
747 We used to just goto got_wrong_format_error here
748 but there are binaries in existance for which this test
749 will prevent the binutils from working with them at all.
750 So we are kind, and reset the string index value to 0
751 so that at least some processing can be done. */
752 i_ehdrp->e_shstrndx = SHN_UNDEF;
753 _bfd_error_handler (_("warning: %s has a corrupt string table index - ignoring"), abfd->filename);
754 }
24639c7d 755 }
0b49d371 756 else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
24639c7d
JJ
757 goto got_wrong_format_error;
758
252b5132
RH
759 /* Read in the program headers. */
760 if (i_ehdrp->e_phnum == 0)
761 elf_tdata (abfd)->phdr = NULL;
762 else
763 {
764 Elf_Internal_Phdr *i_phdr;
765 unsigned int i;
766
dc810e39 767 amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
268b6b39 768 elf_tdata (abfd)->phdr = bfd_alloc (abfd, amt);
252b5132
RH
769 if (elf_tdata (abfd)->phdr == NULL)
770 goto got_no_match;
dc810e39 771 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
252b5132
RH
772 goto got_no_match;
773 i_phdr = elf_tdata (abfd)->phdr;
774 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
775 {
776 Elf_External_Phdr x_phdr;
777
268b6b39 778 if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
252b5132
RH
779 goto got_no_match;
780 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
781 }
782 }
783
1b3a8575 784 if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
252b5132 785 {
9ad5cbcf
AM
786 unsigned int num_sec;
787
0c35f01a
AM
788 /* Once all of the section headers have been read and converted, we
789 can start processing them. Note that the first section header is
790 a dummy placeholder entry, so we ignore it. */
9ad5cbcf
AM
791 num_sec = elf_numsections (abfd);
792 for (shindex = 1; shindex < num_sec; shindex++)
0c35f01a
AM
793 {
794 if (! bfd_section_from_shdr (abfd, shindex))
795 goto got_no_match;
9ad5cbcf
AM
796 if (shindex == SHN_LORESERVE - 1)
797 shindex += SHN_HIRESERVE + 1 - SHN_LORESERVE;
0c35f01a 798 }
3d7f7666 799
dd863624
L
800 /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER. */
801 if (! _bfd_elf_setup_sections (abfd))
3d7f7666 802 goto got_wrong_format_error;
252b5132
RH
803 }
804
805 /* Let the backend double check the format and override global
806 information. */
807 if (ebd->elf_backend_object_p)
808 {
82e51918 809 if (! (*ebd->elf_backend_object_p) (abfd))
252b5132
RH
810 goto got_wrong_format_error;
811 }
812
a14199db
AM
813 /* Remember the entry point specified in the ELF file header. */
814 bfd_set_start_address (abfd, i_ehdrp->e_entry);
815
252b5132
RH
816 /* If we have created any reloc sections that are associated with
817 debugging sections, mark the reloc sections as debugging as well. */
818 for (s = abfd->sections; s != NULL; s = s->next)
819 {
820 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
821 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
822 && elf_section_data (s)->this_hdr.sh_info > 0)
823 {
824 unsigned long targ_index;
825 asection *targ_sec;
826
827 targ_index = elf_section_data (s)->this_hdr.sh_info;
828 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
829 if (targ_sec != NULL
830 && (targ_sec->flags & SEC_DEBUGGING) != 0)
831 s->flags |= SEC_DEBUGGING;
832 }
833 }
834
e84d6fca
AM
835 bfd_preserve_finish (abfd, &preserve);
836 return abfd->xvec;
252b5132
RH
837
838 got_wrong_format_error:
a77a9fef
HPN
839 /* There is way too much undoing of half-known state here. The caller,
840 bfd_check_format_matches, really shouldn't iterate on live bfd's to
841 check match/no-match like it does. We have to rely on that a call to
842 bfd_default_set_arch_mach with the previously known mach, undoes what
843 was done by the first bfd_default_set_arch_mach (with mach 0) here.
844 For this to work, only elf-data and the mach may be changed by the
845 target-specific elf_backend_object_p function. Note that saving the
846 whole bfd here and restoring it would be even worse; the first thing
847 you notice is that the cached bfd file position gets out of sync. */
252b5132 848 bfd_set_error (bfd_error_wrong_format);
ed591155 849
252b5132 850 got_no_match:
e84d6fca
AM
851 if (preserve.marker != NULL)
852 bfd_preserve_restore (abfd, &preserve);
ed591155 853 return NULL;
252b5132
RH
854}
855\f
856/* ELF .o/exec file writing */
857
858/* Write out the relocs. */
859
b9f66672 860void
268b6b39 861elf_write_relocs (bfd *abfd, asection *sec, void *data)
252b5132 862{
268b6b39 863 bfd_boolean *failedp = data;
252b5132 864 Elf_Internal_Shdr *rela_hdr;
947216bf 865 bfd_vma addr_offset;
c39a58e6 866 void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
947216bf
AM
867 size_t extsize;
868 bfd_byte *dst_rela;
252b5132 869 unsigned int idx;
947216bf
AM
870 asymbol *last_sym;
871 int last_sym_idx;
252b5132
RH
872
873 /* If we have already failed, don't do anything. */
874 if (*failedp)
875 return;
876
877 if ((sec->flags & SEC_RELOC) == 0)
878 return;
879
880 /* The linker backend writes the relocs out itself, and sets the
881 reloc_count field to zero to inhibit writing them here. Also,
882 sometimes the SEC_RELOC flag gets set even when there aren't any
883 relocs. */
884 if (sec->reloc_count == 0)
885 return;
886
9a44bbd9
DJ
887 /* If we have opened an existing file for update, reloc_count may be
888 set even though we are not linking. In that case we have nothing
889 to do. */
890 if (sec->orelocation == NULL)
891 return;
892
252b5132
RH
893 rela_hdr = &elf_section_data (sec)->rel_hdr;
894
895 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
268b6b39 896 rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
252b5132
RH
897 if (rela_hdr->contents == NULL)
898 {
b34976b6 899 *failedp = TRUE;
252b5132
RH
900 return;
901 }
902
bf572ba0
MM
903 /* Figure out whether the relocations are RELA or REL relocations. */
904 if (rela_hdr->sh_type == SHT_RELA)
947216bf
AM
905 {
906 swap_out = elf_swap_reloca_out;
907 extsize = sizeof (Elf_External_Rela);
908 }
bf572ba0 909 else if (rela_hdr->sh_type == SHT_REL)
947216bf
AM
910 {
911 swap_out = elf_swap_reloc_out;
912 extsize = sizeof (Elf_External_Rel);
913 }
bf572ba0
MM
914 else
915 /* Every relocation section should be either an SHT_RELA or an
916 SHT_REL section. */
917 abort ();
918
947216bf
AM
919 /* The address of an ELF reloc is section relative for an object
920 file, and absolute for an executable file or shared library.
921 The address of a BFD reloc is always section relative. */
922 addr_offset = 0;
923 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
924 addr_offset = sec->vma;
925
3e932841 926 /* orelocation has the data, reloc_count has the count... */
947216bf
AM
927 last_sym = 0;
928 last_sym_idx = 0;
929 dst_rela = rela_hdr->contents;
252b5132 930
947216bf
AM
931 for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
932 {
933 Elf_Internal_Rela src_rela;
934 arelent *ptr;
935 asymbol *sym;
936 int n;
937
938 ptr = sec->orelocation[idx];
939 sym = *ptr->sym_ptr_ptr;
940 if (sym == last_sym)
941 n = last_sym_idx;
942 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
943 n = STN_UNDEF;
944 else
252b5132 945 {
947216bf
AM
946 last_sym = sym;
947 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
948 if (n < 0)
252b5132 949 {
b34976b6 950 *failedp = TRUE;
252b5132
RH
951 return;
952 }
947216bf 953 last_sym_idx = n;
252b5132 954 }
252b5132 955
947216bf
AM
956 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
957 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
958 && ! _bfd_elf_validate_reloc (abfd, ptr))
252b5132 959 {
b34976b6 960 *failedp = TRUE;
947216bf 961 return;
252b5132 962 }
947216bf
AM
963
964 src_rela.r_offset = ptr->address + addr_offset;
965 src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
966 src_rela.r_addend = ptr->addend;
967 (*swap_out) (abfd, &src_rela, dst_rela);
252b5132
RH
968 }
969}
970
971/* Write out the program headers. */
972
973int
268b6b39
AM
974elf_write_out_phdrs (bfd *abfd,
975 const Elf_Internal_Phdr *phdr,
976 unsigned int count)
252b5132
RH
977{
978 while (count--)
979 {
980 Elf_External_Phdr extphdr;
981 elf_swap_phdr_out (abfd, phdr, &extphdr);
268b6b39
AM
982 if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
983 != sizeof (Elf_External_Phdr))
252b5132
RH
984 return -1;
985 phdr++;
986 }
987 return 0;
988}
989
990/* Write out the section headers and the ELF file header. */
991
b34976b6 992bfd_boolean
268b6b39 993elf_write_shdrs_and_ehdr (bfd *abfd)
252b5132
RH
994{
995 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
996 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
997 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
998 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
999 unsigned int count;
dc810e39 1000 bfd_size_type amt;
252b5132
RH
1001
1002 i_ehdrp = elf_elfheader (abfd);
1003 i_shdrp = elf_elfsections (abfd);
1004
3e932841 1005 /* swap the header before spitting it out... */
252b5132
RH
1006
1007#if DEBUG & 1
1008 elf_debug_file (i_ehdrp);
1009#endif
1010 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
dc810e39 1011 amt = sizeof (x_ehdr);
252b5132 1012 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
268b6b39 1013 || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
b34976b6 1014 return FALSE;
252b5132 1015
5732c114
AM
1016 /* Some fields in the first section header handle overflow of ehdr
1017 fields. */
1018 if (i_ehdrp->e_shnum >= SHN_LORESERVE)
1019 i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1020 if (i_ehdrp->e_shstrndx >= SHN_LORESERVE)
1021 i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1022
3e932841 1023 /* at this point we've concocted all the ELF sections... */
5732c114
AM
1024 amt = i_ehdrp->e_shnum;
1025 amt *= sizeof (*x_shdrp);
268b6b39 1026 x_shdrp = bfd_alloc (abfd, amt);
252b5132 1027 if (!x_shdrp)
b34976b6 1028 return FALSE;
252b5132 1029
5732c114 1030 for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
252b5132
RH
1031 {
1032#if DEBUG & 2
5732c114 1033 elf_debug_section (count, *i_shdrp);
252b5132 1034#endif
5732c114 1035 elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
b34976b6 1036
5732c114
AM
1037 if (count == SHN_LORESERVE - 1)
1038 i_shdrp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132
RH
1039 }
1040 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
268b6b39 1041 || bfd_bwrite (x_shdrp, amt, abfd) != amt)
b34976b6 1042 return FALSE;
252b5132 1043
3e932841 1044 /* need to dump the string table too... */
252b5132 1045
b34976b6 1046 return TRUE;
252b5132
RH
1047}
1048
1049long
268b6b39 1050elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
252b5132
RH
1051{
1052 Elf_Internal_Shdr *hdr;
1053 Elf_Internal_Shdr *verhdr;
1054 unsigned long symcount; /* Number of external ELF symbols */
1055 elf_symbol_type *sym; /* Pointer to current bfd symbol */
1056 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
6cdc0ccc
AM
1057 Elf_Internal_Sym *isym;
1058 Elf_Internal_Sym *isymend;
1059 Elf_Internal_Sym *isymbuf = NULL;
1060 Elf_External_Versym *xver;
1061 Elf_External_Versym *xverbuf = NULL;
9c5bfbb7 1062 const struct elf_backend_data *ebd;
dc810e39 1063 bfd_size_type amt;
252b5132
RH
1064
1065 /* Read each raw ELF symbol, converting from external ELF form to
1066 internal ELF form, and then using the information to create a
1067 canonical bfd symbol table entry.
1068
1069 Note that we allocate the initial bfd canonical symbol buffer
1070 based on a one-to-one mapping of the ELF symbols to canonical
1071 symbols. We actually use all the ELF symbols, so there will be no
1072 space left over at the end. When we have all the symbols, we
3e932841 1073 build the caller's pointer vector. */
252b5132
RH
1074
1075 if (! dynamic)
1076 {
1077 hdr = &elf_tdata (abfd)->symtab_hdr;
1078 verhdr = NULL;
1079 }
1080 else
1081 {
1082 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1083 if (elf_dynversym (abfd) == 0)
1084 verhdr = NULL;
1085 else
1086 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1087 if ((elf_tdata (abfd)->dynverdef_section != 0
1088 && elf_tdata (abfd)->verdef == NULL)
1089 || (elf_tdata (abfd)->dynverref_section != 0
1090 && elf_tdata (abfd)->verref == NULL))
1091 {
fc0e6df6 1092 if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
252b5132
RH
1093 return -1;
1094 }
1095 }
1096
6cdc0ccc 1097 ebd = get_elf_backend_data (abfd);
252b5132 1098 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
252b5132
RH
1099 if (symcount == 0)
1100 sym = symbase = NULL;
1101 else
1102 {
6cdc0ccc
AM
1103 isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1104 NULL, NULL, NULL);
1105 if (isymbuf == NULL)
1106 return -1;
252b5132 1107
dc810e39
AM
1108 amt = symcount;
1109 amt *= sizeof (elf_symbol_type);
268b6b39 1110 symbase = bfd_zalloc (abfd, amt);
252b5132 1111 if (symbase == (elf_symbol_type *) NULL)
9ad5cbcf 1112 goto error_return;
252b5132
RH
1113
1114 /* Read the raw ELF version symbol information. */
252b5132
RH
1115 if (verhdr != NULL
1116 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1117 {
1118 (*_bfd_error_handler)
1119 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1120 abfd->filename,
1121 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1122 symcount);
1123
1124 /* Slurp in the symbols without the version information,
0560d0f7 1125 since that is more helpful than just quitting. */
252b5132
RH
1126 verhdr = NULL;
1127 }
1128
1129 if (verhdr != NULL)
1130 {
1131 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1132 goto error_return;
1133
268b6b39 1134 xverbuf = bfd_malloc (verhdr->sh_size);
6cdc0ccc 1135 if (xverbuf == NULL && verhdr->sh_size != 0)
252b5132
RH
1136 goto error_return;
1137
268b6b39 1138 if (bfd_bread (xverbuf, verhdr->sh_size, abfd) != verhdr->sh_size)
252b5132
RH
1139 goto error_return;
1140 }
1141
1142 /* Skip first symbol, which is a null dummy. */
6cdc0ccc
AM
1143 xver = xverbuf;
1144 if (xver != NULL)
1145 ++xver;
1146 isymend = isymbuf + symcount;
1147 for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
252b5132 1148 {
6cdc0ccc 1149 memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
252b5132
RH
1150 sym->symbol.the_bfd = abfd;
1151
26c61ae5 1152 sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
252b5132 1153
6cdc0ccc 1154 sym->symbol.value = isym->st_value;
252b5132 1155
6cdc0ccc 1156 if (isym->st_shndx == SHN_UNDEF)
9ad5cbcf
AM
1157 {
1158 sym->symbol.section = bfd_und_section_ptr;
1159 }
6cdc0ccc
AM
1160 else if (isym->st_shndx < SHN_LORESERVE
1161 || isym->st_shndx > SHN_HIRESERVE)
252b5132 1162 {
140f6c8e
AM
1163 sym->symbol.section = bfd_section_from_elf_index (abfd,
1164 isym->st_shndx);
252b5132
RH
1165 if (sym->symbol.section == NULL)
1166 {
1167 /* This symbol is in a section for which we did not
1168 create a BFD section. Just use bfd_abs_section,
1169 although it is wrong. FIXME. */
1170 sym->symbol.section = bfd_abs_section_ptr;
1171 }
1172 }
6cdc0ccc 1173 else if (isym->st_shndx == SHN_ABS)
252b5132
RH
1174 {
1175 sym->symbol.section = bfd_abs_section_ptr;
1176 }
6cdc0ccc 1177 else if (isym->st_shndx == SHN_COMMON)
252b5132
RH
1178 {
1179 sym->symbol.section = bfd_com_section_ptr;
1180 /* Elf puts the alignment into the `value' field, and
1181 the size into the `size' field. BFD wants to see the
1182 size in the value field, and doesn't care (at the
1183 moment) about the alignment. */
6cdc0ccc 1184 sym->symbol.value = isym->st_size;
252b5132 1185 }
252b5132
RH
1186 else
1187 sym->symbol.section = bfd_abs_section_ptr;
1188
1049f94e 1189 /* If this is a relocatable file, then the symbol value is
0560d0f7 1190 already section relative. */
252b5132
RH
1191 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1192 sym->symbol.value -= sym->symbol.section->vma;
1193
6cdc0ccc 1194 switch (ELF_ST_BIND (isym->st_info))
252b5132
RH
1195 {
1196 case STB_LOCAL:
1197 sym->symbol.flags |= BSF_LOCAL;
1198 break;
1199 case STB_GLOBAL:
6cdc0ccc 1200 if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
252b5132
RH
1201 sym->symbol.flags |= BSF_GLOBAL;
1202 break;
1203 case STB_WEAK:
1204 sym->symbol.flags |= BSF_WEAK;
1205 break;
1206 }
1207
6cdc0ccc 1208 switch (ELF_ST_TYPE (isym->st_info))
252b5132
RH
1209 {
1210 case STT_SECTION:
1211 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1212 break;
1213 case STT_FILE:
1214 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1215 break;
1216 case STT_FUNC:
1217 sym->symbol.flags |= BSF_FUNCTION;
1218 break;
1219 case STT_OBJECT:
1220 sym->symbol.flags |= BSF_OBJECT;
1221 break;
0be9069d
L
1222 case STT_TLS:
1223 sym->symbol.flags |= BSF_THREAD_LOCAL;
1224 break;
252b5132
RH
1225 }
1226
1227 if (dynamic)
1228 sym->symbol.flags |= BSF_DYNAMIC;
1229
6cdc0ccc 1230 if (xver != NULL)
252b5132
RH
1231 {
1232 Elf_Internal_Versym iversym;
1233
6cdc0ccc 1234 _bfd_elf_swap_versym_in (abfd, xver, &iversym);
252b5132 1235 sym->version = iversym.vs_vers;
6cdc0ccc 1236 xver++;
252b5132
RH
1237 }
1238
1239 /* Do some backend-specific processing on this symbol. */
6cdc0ccc
AM
1240 if (ebd->elf_backend_symbol_processing)
1241 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
252b5132
RH
1242 }
1243 }
1244
1245 /* Do some backend-specific processing on this symbol table. */
6cdc0ccc
AM
1246 if (ebd->elf_backend_symbol_table_processing)
1247 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
252b5132
RH
1248
1249 /* We rely on the zalloc to clear out the final symbol entry. */
1250
1251 symcount = sym - symbase;
1252
1253 /* Fill in the user's symbol pointer vector if needed. */
1254 if (symptrs)
1255 {
1256 long l = symcount;
1257
1258 sym = symbase;
1259 while (l-- > 0)
1260 {
1261 *symptrs++ = &sym->symbol;
1262 sym++;
1263 }
1264 *symptrs = 0; /* Final null pointer */
1265 }
1266
6cdc0ccc
AM
1267 if (xverbuf != NULL)
1268 free (xverbuf);
1269 if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1270 free (isymbuf);
252b5132 1271 return symcount;
9ad5cbcf 1272
252b5132 1273error_return:
6cdc0ccc
AM
1274 if (xverbuf != NULL)
1275 free (xverbuf);
1276 if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1277 free (isymbuf);
252b5132
RH
1278 return -1;
1279}
1280
5c799c07 1281/* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
42fdc509 1282 them. */
252b5132 1283
b34976b6 1284static bfd_boolean
268b6b39
AM
1285elf_slurp_reloc_table_from_section (bfd *abfd,
1286 asection *asect,
1287 Elf_Internal_Shdr *rel_hdr,
1288 bfd_size_type reloc_count,
1289 arelent *relents,
1290 asymbol **symbols,
1291 bfd_boolean dynamic)
252b5132 1292{
9c5bfbb7 1293 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
268b6b39 1294 void *allocated = NULL;
252b5132 1295 bfd_byte *native_relocs;
252b5132
RH
1296 arelent *relent;
1297 unsigned int i;
1298 int entsize;
5ad8645c 1299 unsigned int symcount;
252b5132 1300
268b6b39 1301 allocated = bfd_malloc (rel_hdr->sh_size);
252b5132
RH
1302 if (allocated == NULL)
1303 goto error_return;
1304
1305 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
dc810e39 1306 || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
252b5132
RH
1307 != rel_hdr->sh_size))
1308 goto error_return;
1309
268b6b39 1310 native_relocs = allocated;
252b5132 1311
252b5132
RH
1312 entsize = rel_hdr->sh_entsize;
1313 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1314 || entsize == sizeof (Elf_External_Rela));
1315
5ad8645c
AM
1316 if (dynamic)
1317 symcount = bfd_get_dynamic_symcount (abfd);
1318 else
1319 symcount = bfd_get_symcount (abfd);
1320
252b5132
RH
1321 for (i = 0, relent = relents;
1322 i < reloc_count;
1323 i++, relent++, native_relocs += entsize)
1324 {
1325 Elf_Internal_Rela rela;
252b5132
RH
1326
1327 if (entsize == sizeof (Elf_External_Rela))
947216bf 1328 elf_swap_reloca_in (abfd, native_relocs, &rela);
252b5132 1329 else
947216bf 1330 elf_swap_reloc_in (abfd, native_relocs, &rela);
252b5132
RH
1331
1332 /* The address of an ELF reloc is section relative for an object
1333 file, and absolute for an executable file or shared library.
1334 The address of a normal BFD reloc is always section relative,
1335 and the address of a dynamic reloc is absolute.. */
1336 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1337 relent->address = rela.r_offset;
1338 else
1339 relent->address = rela.r_offset - asect->vma;
1340
1341 if (ELF_R_SYM (rela.r_info) == 0)
1342 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
05a487dc 1343 else if (ELF_R_SYM (rela.r_info) > symcount)
1f70368c
DJ
1344 {
1345 (*_bfd_error_handler)
1346 (_("%s(%s): relocation %d has invalid symbol index %ld"),
1347 abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
1348 relent->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
1349 }
252b5132
RH
1350 else
1351 {
1352 asymbol **ps, *s;
1353
1354 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1355 s = *ps;
1356
f9cfae62 1357 relent->sym_ptr_ptr = ps;
252b5132
RH
1358 }
1359
1360 relent->addend = rela.r_addend;
1361
90fff0d4
DJ
1362 if ((entsize == sizeof (Elf_External_Rela)
1363 && ebd->elf_info_to_howto != NULL)
1364 || ebd->elf_info_to_howto_rel == NULL)
252b5132
RH
1365 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1366 else
947216bf 1367 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rela);
252b5132
RH
1368 }
1369
252b5132
RH
1370 if (allocated != NULL)
1371 free (allocated);
1372
b34976b6 1373 return TRUE;
252b5132
RH
1374
1375 error_return:
1376 if (allocated != NULL)
1377 free (allocated);
b34976b6 1378 return FALSE;
252b5132
RH
1379}
1380
42fdc509
MM
1381/* Read in and swap the external relocs. */
1382
b34976b6 1383bfd_boolean
268b6b39
AM
1384elf_slurp_reloc_table (bfd *abfd,
1385 asection *asect,
1386 asymbol **symbols,
1387 bfd_boolean dynamic)
42fdc509
MM
1388{
1389 struct bfd_elf_section_data * const d = elf_section_data (asect);
1390 Elf_Internal_Shdr *rel_hdr;
1391 Elf_Internal_Shdr *rel_hdr2;
1392 bfd_size_type reloc_count;
1393 bfd_size_type reloc_count2;
1394 arelent *relents;
dc810e39 1395 bfd_size_type amt;
42fdc509
MM
1396
1397 if (asect->relocation != NULL)
b34976b6 1398 return TRUE;
42fdc509
MM
1399
1400 if (! dynamic)
1401 {
1402 if ((asect->flags & SEC_RELOC) == 0
1403 || asect->reloc_count == 0)
b34976b6 1404 return TRUE;
42fdc509
MM
1405
1406 rel_hdr = &d->rel_hdr;
d9bc7a44 1407 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
42fdc509 1408 rel_hdr2 = d->rel_hdr2;
d9bc7a44 1409 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
42fdc509
MM
1410
1411 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1412 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1413 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1414
1415 }
1416 else
1417 {
57e21bef
MM
1418 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1419 case because relocations against this section may use the
1420 dynamic symbol table, and in that case bfd_section_from_shdr
1421 in elf.c does not update the RELOC_COUNT. */
eea6121a 1422 if (asect->size == 0)
b34976b6 1423 return TRUE;
42fdc509
MM
1424
1425 rel_hdr = &d->this_hdr;
d9bc7a44 1426 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
42fdc509 1427 rel_hdr2 = NULL;
57e21bef 1428 reloc_count2 = 0;
42fdc509
MM
1429 }
1430
dc810e39 1431 amt = (reloc_count + reloc_count2) * sizeof (arelent);
268b6b39 1432 relents = bfd_alloc (abfd, amt);
42fdc509 1433 if (relents == NULL)
b34976b6 1434 return FALSE;
42fdc509
MM
1435
1436 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1437 rel_hdr, reloc_count,
1438 relents,
1439 symbols, dynamic))
b34976b6 1440 return FALSE;
60bcf0fa
NC
1441
1442 if (rel_hdr2
42fdc509
MM
1443 && !elf_slurp_reloc_table_from_section (abfd, asect,
1444 rel_hdr2, reloc_count2,
1445 relents + reloc_count,
1446 symbols, dynamic))
b34976b6 1447 return FALSE;
42fdc509 1448
42fdc509 1449 asect->relocation = relents;
b34976b6 1450 return TRUE;
42fdc509
MM
1451}
1452
252b5132
RH
1453#ifdef DEBUG
1454static void
268b6b39 1455elf_debug_section (int num, Elf_Internal_Shdr *hdr)
252b5132
RH
1456{
1457 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1458 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1459 (long) hdr);
1460 fprintf (stderr,
1461 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1462 (long) hdr->sh_name,
1463 (long) hdr->sh_type,
1464 (long) hdr->sh_flags);
1465 fprintf (stderr,
1466 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1467 (long) hdr->sh_addr,
1468 (long) hdr->sh_offset,
1469 (long) hdr->sh_size);
1470 fprintf (stderr,
1471 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1472 (long) hdr->sh_link,
1473 (long) hdr->sh_info,
1474 (long) hdr->sh_addralign);
1475 fprintf (stderr, "sh_entsize = %ld\n",
1476 (long) hdr->sh_entsize);
1477 fflush (stderr);
1478}
1479
1480static void
268b6b39 1481elf_debug_file (Elf_Internal_Ehdr *ehdrp)
252b5132
RH
1482{
1483 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1484 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1485 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1486 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1487 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1488 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1489 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1490}
1491
1492static char *
268b6b39 1493elf_symbol_flags (flagword flags)
252b5132
RH
1494{
1495 static char buffer[1024];
1496
1497 buffer[0] = '\0';
1498 if (flags & BSF_LOCAL)
1499 strcat (buffer, " local");
1500
1501 if (flags & BSF_GLOBAL)
1502 strcat (buffer, " global");
1503
1504 if (flags & BSF_DEBUGGING)
1505 strcat (buffer, " debug");
1506
1507 if (flags & BSF_FUNCTION)
1508 strcat (buffer, " function");
1509
1510 if (flags & BSF_KEEP)
1511 strcat (buffer, " keep");
1512
1513 if (flags & BSF_KEEP_G)
1514 strcat (buffer, " keep_g");
1515
1516 if (flags & BSF_WEAK)
1517 strcat (buffer, " weak");
1518
1519 if (flags & BSF_SECTION_SYM)
1520 strcat (buffer, " section-sym");
1521
1522 if (flags & BSF_OLD_COMMON)
1523 strcat (buffer, " old-common");
1524
1525 if (flags & BSF_NOT_AT_END)
1526 strcat (buffer, " not-at-end");
1527
1528 if (flags & BSF_CONSTRUCTOR)
1529 strcat (buffer, " constructor");
1530
1531 if (flags & BSF_WARNING)
1532 strcat (buffer, " warning");
1533
1534 if (flags & BSF_INDIRECT)
1535 strcat (buffer, " indirect");
1536
1537 if (flags & BSF_FILE)
1538 strcat (buffer, " file");
1539
1540 if (flags & DYNAMIC)
1541 strcat (buffer, " dynamic");
1542
1543 if (flags & ~(BSF_LOCAL
1544 | BSF_GLOBAL
1545 | BSF_DEBUGGING
1546 | BSF_FUNCTION
1547 | BSF_KEEP
1548 | BSF_KEEP_G
1549 | BSF_WEAK
1550 | BSF_SECTION_SYM
1551 | BSF_OLD_COMMON
1552 | BSF_NOT_AT_END
1553 | BSF_CONSTRUCTOR
1554 | BSF_WARNING
1555 | BSF_INDIRECT
1556 | BSF_FILE
1557 | BSF_DYNAMIC))
1558 strcat (buffer, " unknown-bits");
1559
1560 return buffer;
1561}
1562#endif
1563\f
8d6337fe
RM
1564/* Create a new BFD as if by bfd_openr. Rather than opening a file,
1565 reconstruct an ELF file by reading the segments out of remote memory
1566 based on the ELF file header at EHDR_VMA and the ELF program headers it
1567 points to. If not null, *LOADBASEP is filled in with the difference
1568 between the VMAs from which the segments were read, and the VMAs the
1569 file headers (and hence BFD's idea of each section's VMA) put them at.
1570
1571 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
1572 remote memory at target address VMA into the local buffer at MYADDR; it
1573 should return zero on success or an `errno' code on failure. TEMPL must
1574 be a BFD for a target with the word size and byte order found in the
1575 remote memory. */
1576
1577bfd *
268b6b39
AM
1578NAME(_bfd_elf,bfd_from_remote_memory)
1579 (bfd *templ,
1580 bfd_vma ehdr_vma,
1581 bfd_vma *loadbasep,
f075ee0c 1582 int (*target_read_memory) (bfd_vma, bfd_byte *, int))
8d6337fe
RM
1583{
1584 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
1585 Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1586 Elf_External_Phdr *x_phdrs;
1587 Elf_Internal_Phdr *i_phdrs, *last_phdr;
1588 bfd *nbfd;
1589 struct bfd_in_memory *bim;
1590 int contents_size;
f075ee0c 1591 bfd_byte *contents;
8d6337fe
RM
1592 int err;
1593 unsigned int i;
1594 bfd_vma loadbase;
1595
1596 /* Read in the ELF header in external format. */
f075ee0c 1597 err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
8d6337fe
RM
1598 if (err)
1599 {
1600 bfd_set_error (bfd_error_system_call);
1601 errno = err;
1602 return NULL;
1603 }
1604
1605 /* Now check to see if we have a valid ELF file, and one that BFD can
1606 make use of. The magic number must match, the address size ('class')
1607 and byte-swapping must match our XVEC entry. */
1608
1609 if (! elf_file_p (&x_ehdr)
1610 || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1611 || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1612 {
1613 bfd_set_error (bfd_error_wrong_format);
1614 return NULL;
1615 }
1616
1617 /* Check that file's byte order matches xvec's */
1618 switch (x_ehdr.e_ident[EI_DATA])
1619 {
1620 case ELFDATA2MSB: /* Big-endian */
1621 if (! bfd_header_big_endian (templ))
1622 {
1623 bfd_set_error (bfd_error_wrong_format);
1624 return NULL;
1625 }
1626 break;
1627 case ELFDATA2LSB: /* Little-endian */
1628 if (! bfd_header_little_endian (templ))
1629 {
1630 bfd_set_error (bfd_error_wrong_format);
1631 return NULL;
1632 }
1633 break;
1634 case ELFDATANONE: /* No data encoding specified */
1635 default: /* Unknown data encoding specified */
1636 bfd_set_error (bfd_error_wrong_format);
1637 return NULL;
1638 }
1639
1640 elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1641
1642 /* The file header tells where to find the program headers.
1643 These are what we use to actually choose what to read. */
1644
1645 if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1646 {
1647 bfd_set_error (bfd_error_wrong_format);
1648 return NULL;
1649 }
1650
268b6b39 1651 x_phdrs = bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
8d6337fe
RM
1652 if (x_phdrs == NULL)
1653 {
1654 bfd_set_error (bfd_error_no_memory);
1655 return NULL;
1656 }
f075ee0c 1657 err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
8d6337fe
RM
1658 i_ehdr.e_phnum * sizeof x_phdrs[0]);
1659 if (err)
1660 {
1661 free (x_phdrs);
1662 bfd_set_error (bfd_error_system_call);
1663 errno = err;
1664 return NULL;
1665 }
1666 i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1667
1668 contents_size = 0;
1669 last_phdr = NULL;
1670 loadbase = ehdr_vma;
1671 for (i = 0; i < i_ehdr.e_phnum; ++i)
1672 {
1673 elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
653bb2de
JW
1674 /* IA-64 vDSO may have two mappings for one segment, where one mapping
1675 is executable only, and one is read only. We must not use the
1676 executable one. */
1677 if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R))
8d6337fe
RM
1678 {
1679 bfd_vma segment_end;
1680 segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1681 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1682 if (segment_end > (bfd_vma) contents_size)
1683 contents_size = segment_end;
1684
1685 if ((i_phdrs[i].p_offset & -i_phdrs[i].p_align) == 0)
1686 loadbase = ehdr_vma - (i_phdrs[i].p_vaddr & -i_phdrs[i].p_align);
1687
1688 last_phdr = &i_phdrs[i];
1689 }
1690 }
1691 if (last_phdr == NULL)
1692 {
1693 /* There were no PT_LOAD segments, so we don't have anything to read. */
1694 free (x_phdrs);
1695 bfd_set_error (bfd_error_wrong_format);
1696 return NULL;
1697 }
1698
1699 /* Trim the last segment so we don't bother with zeros in the last page
1700 that are off the end of the file. However, if the extra bit in that
1701 page includes the section headers, keep them. */
1702 if ((bfd_vma) contents_size > last_phdr->p_offset + last_phdr->p_filesz
1703 && (bfd_vma) contents_size >= (i_ehdr.e_shoff
1704 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1705 {
1706 contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1707 if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1708 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1709 contents_size = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1710 }
1711 else
1712 contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1713
1714 /* Now we know the size of the whole image we want read in. */
268b6b39 1715 contents = bfd_zmalloc (contents_size);
8d6337fe
RM
1716 if (contents == NULL)
1717 {
1718 free (x_phdrs);
1719 bfd_set_error (bfd_error_no_memory);
1720 return NULL;
1721 }
1722
1723 for (i = 0; i < i_ehdr.e_phnum; ++i)
653bb2de
JW
1724 /* IA-64 vDSO may have two mappings for one segment, where one mapping
1725 is executable only, and one is read only. We must not use the
1726 executable one. */
1727 if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R))
8d6337fe
RM
1728 {
1729 bfd_vma start = i_phdrs[i].p_offset & -i_phdrs[i].p_align;
1730 bfd_vma end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1731 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1732 if (end > (bfd_vma) contents_size)
1733 end = contents_size;
1734 err = target_read_memory ((loadbase + i_phdrs[i].p_vaddr)
1735 & -i_phdrs[i].p_align,
1736 contents + start, end - start);
1737 if (err)
1738 {
1739 free (x_phdrs);
1740 free (contents);
1741 bfd_set_error (bfd_error_system_call);
1742 errno = err;
1743 return NULL;
1744 }
1745 }
1746 free (x_phdrs);
1747
1748 /* If the segments visible in memory didn't include the section headers,
1749 then clear them from the file header. */
1750 if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1751 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1752 {
1753 memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1754 memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1755 memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1756 }
1757
1758 /* This will normally have been in the first PT_LOAD segment. But it
1759 conceivably could be missing, and we might have just changed it. */
1760 memcpy (contents, &x_ehdr, sizeof x_ehdr);
1761
1762 /* Now we have a memory image of the ELF file contents. Make a BFD. */
268b6b39 1763 bim = bfd_malloc (sizeof (struct bfd_in_memory));
8d6337fe
RM
1764 if (bim == NULL)
1765 {
1766 free (contents);
1767 bfd_set_error (bfd_error_no_memory);
1768 return NULL;
1769 }
1770 nbfd = _bfd_new_bfd ();
1771 if (nbfd == NULL)
1772 {
1773 free (bim);
1774 free (contents);
1775 bfd_set_error (bfd_error_no_memory);
1776 return NULL;
1777 }
1778 nbfd->filename = "<in-memory>";
1779 nbfd->xvec = templ->xvec;
1780 bim->size = contents_size;
1781 bim->buffer = contents;
268b6b39 1782 nbfd->iostream = bim;
8d6337fe
RM
1783 nbfd->flags = BFD_IN_MEMORY;
1784 nbfd->direction = read_direction;
1785 nbfd->mtime = time (NULL);
1786 nbfd->mtime_set = TRUE;
1787
1788 if (loadbasep)
1789 *loadbasep = loadbase;
1790 return nbfd;
1791}
1792\f
252b5132 1793#include "elfcore.h"
252b5132
RH
1794\f
1795/* Size-dependent data and functions. */
1796const struct elf_size_info NAME(_bfd_elf,size_info) = {
1797 sizeof (Elf_External_Ehdr),
1798 sizeof (Elf_External_Phdr),
1799 sizeof (Elf_External_Shdr),
1800 sizeof (Elf_External_Rel),
1801 sizeof (Elf_External_Rela),
1802 sizeof (Elf_External_Sym),
1803 sizeof (Elf_External_Dyn),
1804 sizeof (Elf_External_Note),
70bcb145 1805 4,
c7ac6ff8 1806 1,
45d6a902 1807 ARCH_SIZE, LOG_FILE_ALIGN,
252b5132
RH
1808 ELFCLASS, EV_CURRENT,
1809 elf_write_out_phdrs,
1810 elf_write_shdrs_and_ehdr,
b9f66672 1811 elf_write_relocs,
73ff0d56 1812 elf_swap_symbol_in,
252b5132
RH
1813 elf_swap_symbol_out,
1814 elf_slurp_reloc_table,
1815 elf_slurp_symbol_table,
c7ac6ff8
MM
1816 elf_swap_dyn_in,
1817 elf_swap_dyn_out,
947216bf
AM
1818 elf_swap_reloc_in,
1819 elf_swap_reloc_out,
1820 elf_swap_reloca_in,
1821 elf_swap_reloca_out
252b5132 1822};
This page took 0.4493 seconds and 4 git commands to generate.