]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfcode.h
Oops, changelog for last patch.
[thirdparty/binutils-gdb.git] / bfd / elfcode.h
CommitLineData
252b5132 1/* ELF executable support for BFD.
7898deda
NC
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001 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)
105#define elf_get_symtab NAME(bfd_elf,get_symtab)
106#define elf_canonicalize_dynamic_symtab \
107 NAME(bfd_elf,canonicalize_dynamic_symtab)
108#define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol)
109#define elf_get_symbol_info NAME(bfd_elf,get_symbol_info)
110#define elf_get_lineno NAME(bfd_elf,get_lineno)
111#define elf_set_arch_mach NAME(bfd_elf,set_arch_mach)
112#define elf_find_nearest_line NAME(bfd_elf,find_nearest_line)
113#define elf_sizeof_headers NAME(bfd_elf,sizeof_headers)
114#define elf_set_section_contents NAME(bfd_elf,set_section_contents)
115#define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto)
116#define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel)
117#define elf_find_section NAME(bfd_elf,find_section)
118#define elf_bfd_link_add_symbols NAME(bfd_elf,bfd_link_add_symbols)
119#define elf_add_dynamic_entry NAME(bfd_elf,add_dynamic_entry)
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#define elf_link_create_dynamic_sections \
125 NAME(bfd_elf,link_create_dynamic_sections)
73d074b4
DJ
126#define elf_bfd_discard_info NAME(bfd_elf,discard_info)
127#define elf_reloc_symbol_deleted_p NAME(_bfd_elf,reloc_symbol_deleted_p)
252b5132
RH
128#define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
129#define elf_bfd_final_link NAME(bfd_elf,bfd_final_link)
130#define elf_create_pointer_linker_section NAME(bfd_elf,create_pointer_linker_section)
131#define elf_finish_pointer_linker_section NAME(bfd_elf,finish_pointer_linker_section)
132#define elf_gc_sections NAME(_bfd_elf,gc_sections)
133#define elf_gc_common_finalize_got_offsets \
134 NAME(_bfd_elf,gc_common_finalize_got_offsets)
135#define elf_gc_common_final_link NAME(_bfd_elf,gc_common_final_link)
136#define elf_gc_record_vtinherit NAME(_bfd_elf,gc_record_vtinherit)
137#define elf_gc_record_vtentry NAME(_bfd_elf,gc_record_vtentry)
30b30c21
RH
138#define elf_link_record_local_dynamic_symbol \
139 NAME(_bfd_elf,link_record_local_dynamic_symbol)
252b5132
RH
140
141#if ARCH_SIZE == 64
142#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
143#define ELF_R_SYM(X) ELF64_R_SYM(X)
144#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
145#define ELFCLASS ELFCLASS64
146#define FILE_ALIGN 8
147#define LOG_FILE_ALIGN 3
148#endif
149#if ARCH_SIZE == 32
150#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
151#define ELF_R_SYM(X) ELF32_R_SYM(X)
152#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
153#define ELFCLASS ELFCLASS32
154#define FILE_ALIGN 4
155#define LOG_FILE_ALIGN 2
156#endif
157
158/* Static functions */
159
160static void elf_swap_ehdr_in
161 PARAMS ((bfd *, const Elf_External_Ehdr *, Elf_Internal_Ehdr *));
162static void elf_swap_ehdr_out
163 PARAMS ((bfd *, const Elf_Internal_Ehdr *, Elf_External_Ehdr *));
164static void elf_swap_shdr_in
165 PARAMS ((bfd *, const Elf_External_Shdr *, Elf_Internal_Shdr *));
166static void elf_swap_shdr_out
167 PARAMS ((bfd *, const Elf_Internal_Shdr *, Elf_External_Shdr *));
168
169#define elf_stringtab_init _bfd_elf_stringtab_init
170
171#define section_from_elf_index bfd_section_from_elf_index
172
60bcf0fa 173static boolean elf_slurp_reloc_table_from_section
42fdc509
MM
174 PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type,
175 arelent *, asymbol **, boolean));
252b5132
RH
176
177static boolean elf_file_p PARAMS ((Elf_External_Ehdr *));
178
179#ifdef DEBUG
180static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *));
181static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *));
182static char *elf_symbol_flags PARAMS ((flagword));
183#endif
184\f
185/* Structure swapping routines */
186
187/* Should perhaps use put_offset, put_word, etc. For now, the two versions
188 can be handled by explicitly specifying 32 bits or "the long type". */
189#if ARCH_SIZE == 64
dc810e39
AM
190#define H_PUT_WORD H_PUT_64
191#define H_PUT_SIGNED_WORD H_PUT_S64
192#define H_GET_WORD H_GET_64
193#define H_GET_SIGNED_WORD H_GET_S64
252b5132
RH
194#endif
195#if ARCH_SIZE == 32
dc810e39
AM
196#define H_PUT_WORD H_PUT_32
197#define H_PUT_SIGNED_WORD H_PUT_S32
198#define H_GET_WORD H_GET_32
199#define H_GET_SIGNED_WORD H_GET_S32
252b5132
RH
200#endif
201
202/* Translate an ELF symbol in external format into an ELF symbol in internal
3e932841 203 format. */
252b5132
RH
204
205void
206elf_swap_symbol_in (abfd, src, dst)
207 bfd *abfd;
208 const Elf_External_Sym *src;
209 Elf_Internal_Sym *dst;
210{
86dc0f79
RH
211 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
212
dc810e39 213 dst->st_name = H_GET_32 (abfd, src->st_name);
86dc0f79 214 if (signed_vma)
dc810e39 215 dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
86dc0f79 216 else
dc810e39
AM
217 dst->st_value = H_GET_WORD (abfd, src->st_value);
218 dst->st_size = H_GET_WORD (abfd, src->st_size);
219 dst->st_info = H_GET_8 (abfd, src->st_info);
220 dst->st_other = H_GET_8 (abfd, src->st_other);
221 dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
252b5132
RH
222}
223
224/* Translate an ELF symbol in internal format into an ELF symbol in external
3e932841 225 format. */
252b5132
RH
226
227void
228elf_swap_symbol_out (abfd, src, cdst)
229 bfd *abfd;
230 const Elf_Internal_Sym *src;
231 PTR cdst;
232{
233 Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
dc810e39
AM
234 H_PUT_32 (abfd, src->st_name, dst->st_name);
235 H_PUT_WORD (abfd, src->st_value, dst->st_value);
236 H_PUT_WORD (abfd, src->st_size, dst->st_size);
237 H_PUT_8 (abfd, src->st_info, dst->st_info);
238 H_PUT_8 (abfd, src->st_other, dst->st_other);
239 H_PUT_16 (abfd, src->st_shndx, dst->st_shndx);
252b5132
RH
240}
241
252b5132 242/* Translate an ELF file header in external format into an ELF file header in
3e932841 243 internal format. */
252b5132
RH
244
245static void
246elf_swap_ehdr_in (abfd, src, dst)
247 bfd *abfd;
248 const Elf_External_Ehdr *src;
249 Elf_Internal_Ehdr *dst;
250{
448cafa4 251 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252b5132 252 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
dc810e39
AM
253 dst->e_type = H_GET_16 (abfd, src->e_type);
254 dst->e_machine = H_GET_16 (abfd, src->e_machine);
255 dst->e_version = H_GET_32 (abfd, src->e_version);
448cafa4 256 if (signed_vma)
dc810e39 257 dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
448cafa4 258 else
dc810e39
AM
259 dst->e_entry = H_GET_WORD (abfd, src->e_entry);
260 dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
261 dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
262 dst->e_flags = H_GET_32 (abfd, src->e_flags);
263 dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
264 dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
265 dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
266 dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
267 dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
268 dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
252b5132
RH
269}
270
271/* Translate an ELF file header in internal format into an ELF file header in
3e932841 272 external format. */
252b5132
RH
273
274static void
275elf_swap_ehdr_out (abfd, src, dst)
276 bfd *abfd;
277 const Elf_Internal_Ehdr *src;
278 Elf_External_Ehdr *dst;
279{
5732c114 280 unsigned int tmp;
448cafa4 281 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
252b5132 282 memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
3e932841 283 /* note that all elements of dst are *arrays of unsigned char* already... */
dc810e39
AM
284 H_PUT_16 (abfd, src->e_type, dst->e_type);
285 H_PUT_16 (abfd, src->e_machine, dst->e_machine);
286 H_PUT_32 (abfd, src->e_version, dst->e_version);
448cafa4 287 if (signed_vma)
dc810e39 288 H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
448cafa4 289 else
dc810e39
AM
290 H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
291 H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
292 H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
293 H_PUT_32 (abfd, src->e_flags, dst->e_flags);
294 H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
295 H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
296 H_PUT_16 (abfd, src->e_phnum, dst->e_phnum);
297 H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
5732c114
AM
298 tmp = src->e_shnum;
299 if (tmp >= SHN_LORESERVE)
300 tmp = SHN_UNDEF;
301 H_PUT_16 (abfd, tmp, dst->e_shnum);
302 tmp = src->e_shstrndx;
303 if (tmp >= SHN_LORESERVE)
304 tmp = SHN_XINDEX;
305 H_PUT_16 (abfd, tmp, dst->e_shstrndx);
252b5132
RH
306}
307
252b5132 308/* Translate an ELF section header table entry in external format into an
3e932841 309 ELF section header table entry in internal format. */
252b5132
RH
310
311static void
312elf_swap_shdr_in (abfd, src, dst)
313 bfd *abfd;
314 const Elf_External_Shdr *src;
315 Elf_Internal_Shdr *dst;
316{
86dc0f79
RH
317 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
318
dc810e39
AM
319 dst->sh_name = H_GET_32 (abfd, src->sh_name);
320 dst->sh_type = H_GET_32 (abfd, src->sh_type);
321 dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
86dc0f79 322 if (signed_vma)
dc810e39 323 dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
86dc0f79 324 else
dc810e39
AM
325 dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
326 dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
327 dst->sh_size = H_GET_WORD (abfd, src->sh_size);
328 dst->sh_link = H_GET_32 (abfd, src->sh_link);
329 dst->sh_info = H_GET_32 (abfd, src->sh_info);
330 dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
331 dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
252b5132
RH
332 dst->bfd_section = NULL;
333 dst->contents = NULL;
334}
335
336/* Translate an ELF section header table entry in internal format into an
3e932841 337 ELF section header table entry in external format. */
252b5132
RH
338
339static void
340elf_swap_shdr_out (abfd, src, dst)
341 bfd *abfd;
342 const Elf_Internal_Shdr *src;
343 Elf_External_Shdr *dst;
344{
3e932841 345 /* note that all elements of dst are *arrays of unsigned char* already... */
dc810e39
AM
346 H_PUT_32 (abfd, src->sh_name, dst->sh_name);
347 H_PUT_32 (abfd, src->sh_type, dst->sh_type);
348 H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
349 H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
350 H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
351 H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
352 H_PUT_32 (abfd, src->sh_link, dst->sh_link);
353 H_PUT_32 (abfd, src->sh_info, dst->sh_info);
354 H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
355 H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
252b5132
RH
356}
357
252b5132 358/* Translate an ELF program header table entry in external format into an
3e932841 359 ELF program header table entry in internal format. */
252b5132
RH
360
361void
362elf_swap_phdr_in (abfd, src, dst)
363 bfd *abfd;
364 const Elf_External_Phdr *src;
365 Elf_Internal_Phdr *dst;
366{
86dc0f79
RH
367 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
368
dc810e39
AM
369 dst->p_type = H_GET_32 (abfd, src->p_type);
370 dst->p_flags = H_GET_32 (abfd, src->p_flags);
371 dst->p_offset = H_GET_WORD (abfd, src->p_offset);
86dc0f79
RH
372 if (signed_vma)
373 {
dc810e39
AM
374 dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
375 dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
86dc0f79
RH
376 }
377 else
378 {
dc810e39
AM
379 dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
380 dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
86dc0f79 381 }
dc810e39
AM
382 dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
383 dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
384 dst->p_align = H_GET_WORD (abfd, src->p_align);
252b5132
RH
385}
386
387void
388elf_swap_phdr_out (abfd, src, dst)
389 bfd *abfd;
390 const Elf_Internal_Phdr *src;
391 Elf_External_Phdr *dst;
392{
3e932841 393 /* note that all elements of dst are *arrays of unsigned char* already... */
dc810e39
AM
394 H_PUT_32 (abfd, src->p_type, dst->p_type);
395 H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
396 H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
397 H_PUT_WORD (abfd, src->p_paddr, dst->p_paddr);
398 H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
399 H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
400 H_PUT_32 (abfd, src->p_flags, dst->p_flags);
401 H_PUT_WORD (abfd, src->p_align, dst->p_align);
252b5132
RH
402}
403
3e932841 404/* Translate an ELF reloc from external format to internal format. */
252b5132
RH
405INLINE void
406elf_swap_reloc_in (abfd, src, dst)
407 bfd *abfd;
408 const Elf_External_Rel *src;
409 Elf_Internal_Rel *dst;
410{
dc810e39
AM
411 dst->r_offset = H_GET_WORD (abfd, src->r_offset);
412 dst->r_info = H_GET_WORD (abfd, src->r_info);
252b5132
RH
413}
414
415INLINE void
416elf_swap_reloca_in (abfd, src, dst)
417 bfd *abfd;
418 const Elf_External_Rela *src;
419 Elf_Internal_Rela *dst;
420{
dc810e39
AM
421 dst->r_offset = H_GET_WORD (abfd, src->r_offset);
422 dst->r_info = H_GET_WORD (abfd, src->r_info);
423 dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
252b5132
RH
424}
425
3e932841 426/* Translate an ELF reloc from internal format to external format. */
252b5132
RH
427INLINE void
428elf_swap_reloc_out (abfd, src, dst)
429 bfd *abfd;
430 const Elf_Internal_Rel *src;
431 Elf_External_Rel *dst;
432{
dc810e39
AM
433 H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
434 H_PUT_WORD (abfd, src->r_info, dst->r_info);
252b5132
RH
435}
436
437INLINE void
438elf_swap_reloca_out (abfd, src, dst)
439 bfd *abfd;
440 const Elf_Internal_Rela *src;
441 Elf_External_Rela *dst;
442{
dc810e39
AM
443 H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
444 H_PUT_WORD (abfd, src->r_info, dst->r_info);
445 H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
252b5132
RH
446}
447
448INLINE void
449elf_swap_dyn_in (abfd, p, dst)
450 bfd *abfd;
451 const PTR p;
452 Elf_Internal_Dyn *dst;
453{
454 const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
455
dc810e39
AM
456 dst->d_tag = H_GET_WORD (abfd, src->d_tag);
457 dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
252b5132
RH
458}
459
460INLINE void
c7ac6ff8 461elf_swap_dyn_out (abfd, src, p)
252b5132
RH
462 bfd *abfd;
463 const Elf_Internal_Dyn *src;
c7ac6ff8 464 PTR p;
252b5132 465{
c7ac6ff8
MM
466 Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
467
dc810e39
AM
468 H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
469 H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
252b5132
RH
470}
471\f
472/* ELF .o/exec file reading */
473
252b5132
RH
474/* Begin processing a given object.
475
476 First we validate the file by reading in the ELF header and checking
477 the magic number. */
478
479static INLINE boolean
480elf_file_p (x_ehdrp)
481 Elf_External_Ehdr *x_ehdrp;
482{
483 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
484 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
485 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
486 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
487}
488
489/* Check to see if the file associated with ABFD matches the target vector
490 that ABFD points to.
491
492 Note that we may be called several times with the same ABFD, but different
493 target vectors, most of which will not match. We have to avoid leaving
494 any side effects in ABFD, or any data it points to (like tdata), if the
495 file does not match the target vector. */
496
497const bfd_target *
498elf_object_p (abfd)
499 bfd *abfd;
500{
501 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
502 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
503 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
5732c114 504 Elf_Internal_Shdr i_shdr;
252b5132
RH
505 Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */
506 unsigned int shindex;
507 char *shstrtab; /* Internal copy of section header stringtab */
508 struct elf_backend_data *ebd;
509 struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd);
a17cc40f
HPN
510 struct sec *preserved_sections = abfd->sections;
511 unsigned int preserved_section_count = abfd->section_count;
a77a9fef
HPN
512 enum bfd_architecture previous_arch = bfd_get_arch (abfd);
513 unsigned long previous_mach = bfd_get_mach (abfd);
252b5132
RH
514 struct elf_obj_tdata *new_tdata = NULL;
515 asection *s;
dc810e39 516 bfd_size_type amt;
252b5132 517
a17cc40f
HPN
518 /* Clear section information, since there might be a recognized bfd that
519 we now check if we can replace, and we don't want to append to it. */
520 abfd->sections = NULL;
521 abfd->section_count = 0;
522
252b5132
RH
523 /* Read in the ELF header in external format. */
524
dc810e39
AM
525 if (bfd_bread ((PTR) & x_ehdr, (bfd_size_type) sizeof (x_ehdr), abfd)
526 != sizeof (x_ehdr))
252b5132
RH
527 {
528 if (bfd_get_error () != bfd_error_system_call)
529 goto got_wrong_format_error;
530 else
531 goto got_no_match;
532 }
533
534 /* Now check to see if we have a valid ELF file, and one that BFD can
535 make use of. The magic number must match, the address size ('class')
536 and byte-swapping must match our XVEC entry, and it must have a
537 section header table (FIXME: See comments re sections at top of this
3e932841 538 file). */
252b5132
RH
539
540 if ((elf_file_p (&x_ehdr) == false) ||
541 (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) ||
542 (x_ehdr.e_ident[EI_CLASS] != ELFCLASS))
543 goto got_wrong_format_error;
544
545 /* Check that file's byte order matches xvec's */
546 switch (x_ehdr.e_ident[EI_DATA])
547 {
548 case ELFDATA2MSB: /* Big-endian */
549 if (! bfd_header_big_endian (abfd))
550 goto got_wrong_format_error;
551 break;
552 case ELFDATA2LSB: /* Little-endian */
553 if (! bfd_header_little_endian (abfd))
554 goto got_wrong_format_error;
555 break;
556 case ELFDATANONE: /* No data encoding specified */
557 default: /* Unknown data encoding specified */
558 goto got_wrong_format_error;
559 }
560
561 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
562 the tdata pointer in the bfd. */
563
dc810e39
AM
564 amt = sizeof (struct elf_obj_tdata);
565 new_tdata = (struct elf_obj_tdata *) bfd_zalloc (abfd, amt);
252b5132
RH
566 if (new_tdata == NULL)
567 goto got_no_match;
568 elf_tdata (abfd) = new_tdata;
569
570 /* Now that we know the byte order, swap in the rest of the header */
571 i_ehdrp = elf_elfheader (abfd);
572 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
573#if DEBUG & 1
574 elf_debug_file (i_ehdrp);
575#endif
576
577 /* Reject ET_CORE (header indicates core file, not object file) */
578 if (i_ehdrp->e_type == ET_CORE)
579 goto got_wrong_format_error;
580
0c35f01a
AM
581 /* If this is a relocatable file and there is no section header
582 table, then we're hosed. */
583 if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
252b5132
RH
584 goto got_wrong_format_error;
585
586 /* As a simple sanity check, verify that the what BFD thinks is the
587 size of each section header table entry actually matches the size
0c35f01a
AM
588 recorded in the file, but only if there are any sections. */
589 if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
252b5132
RH
590 goto got_wrong_format_error;
591
592 ebd = get_elf_backend_data (abfd);
593
594 /* Check that the ELF e_machine field matches what this particular
595 BFD format expects. */
596 if (ebd->elf_machine_code != i_ehdrp->e_machine
597 && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
598 && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
599 {
600 const bfd_target * const *target_ptr;
601
602 if (ebd->elf_machine_code != EM_NONE)
603 goto got_wrong_format_error;
604
605 /* This is the generic ELF target. Let it match any ELF target
606 for which we do not have a specific backend. */
607 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
608 {
609 struct elf_backend_data *back;
610
611 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
612 continue;
613 back = (struct elf_backend_data *) (*target_ptr)->backend_data;
614 if (back->elf_machine_code == i_ehdrp->e_machine
615 || (back->elf_machine_alt1 != 0
616 && back->elf_machine_alt1 == i_ehdrp->e_machine)
617 || (back->elf_machine_alt2 != 0
618 && back->elf_machine_alt2 == i_ehdrp->e_machine))
619 {
620 /* target_ptr is an ELF backend which matches this
621 object file, so reject the generic ELF target. */
622 goto got_wrong_format_error;
623 }
624 }
625 }
626
627 if (i_ehdrp->e_type == ET_EXEC)
628 abfd->flags |= EXEC_P;
629 else if (i_ehdrp->e_type == ET_DYN)
630 abfd->flags |= DYNAMIC;
631
632 if (i_ehdrp->e_phnum > 0)
633 abfd->flags |= D_PAGED;
634
635 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
636 {
637 /* It's OK if this fails for the generic target. */
638 if (ebd->elf_machine_code != EM_NONE)
639 goto got_no_match;
640 }
641
3e932841 642 /* Remember the entry point specified in the ELF file header. */
448cafa4 643 bfd_set_start_address (abfd, i_ehdrp->e_entry);
252b5132 644
5732c114
AM
645 /* Seek to the section header table in the file. */
646 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0)
647 goto got_no_match;
648
649 /* Read the first section header at index 0, and convert to internal
650 form. */
651 if (bfd_bread ((PTR) & x_shdr, (bfd_size_type) sizeof x_shdr, abfd)
652 != sizeof (x_shdr))
653 goto got_no_match;
654 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
655
656 /* If the section count is zero, the actual count is in the first
657 section header. */
658 if (i_ehdrp->e_shnum == SHN_UNDEF)
659 i_ehdrp->e_shnum = i_shdr.sh_size;
660
661 /* And similarly for the string table index. */
662 if (i_ehdrp->e_shstrndx == SHN_XINDEX)
663 i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
252b5132 665 /* Allocate space for a copy of the section header table in
5732c114 666 internal form. */
0c35f01a
AM
667 if (i_ehdrp->e_shnum != 0)
668 {
5732c114
AM
669 Elf_Internal_Shdr *shdrp;
670
0c35f01a
AM
671 amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
672 i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
5732c114
AM
673 if (!i_shdrp)
674 goto got_no_match;
0c35f01a 675 amt = sizeof (i_shdrp) * i_ehdrp->e_shnum;
5732c114
AM
676 if (i_ehdrp->e_shnum > SHN_LORESERVE)
677 amt += sizeof (i_shdrp) * (SHN_HIRESERVE + 1 - SHN_LORESERVE);
0c35f01a 678 elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
5732c114 679 if (!elf_elfsections (abfd))
0c35f01a 680 goto got_no_match;
5732c114
AM
681
682 memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
683 shdrp = i_shdrp;
684 shindex = 0;
685 if (i_ehdrp->e_shnum > SHN_LORESERVE)
686 {
687 for ( ; shindex < SHN_LORESERVE; shindex++)
688 elf_elfsections (abfd)[shindex] = shdrp++;
689 for ( ; shindex < SHN_HIRESERVE + 1; shindex++)
690 elf_elfsections (abfd)[shindex] = NULL;
691 }
692 for ( ; shindex < i_ehdrp->e_shnum; shindex++)
693 elf_elfsections (abfd)[shindex] = shdrp++;
0c35f01a 694 }
5732c114
AM
695
696 /* Read in the rest of the section header table and convert it to
697 internal form. */
698 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
252b5132 699 {
dc810e39
AM
700 if (bfd_bread ((PTR) & x_shdr, (bfd_size_type) sizeof x_shdr, abfd)
701 != sizeof (x_shdr))
252b5132
RH
702 goto got_no_match;
703 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
252b5132
RH
704
705 /* If the section is loaded, but not page aligned, clear
706 D_PAGED. */
e0740195
L
707 if (i_shdrp[shindex].sh_size != 0
708 && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
252b5132
RH
709 && i_shdrp[shindex].sh_type != SHT_NOBITS
710 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
711 % ebd->maxpagesize)
712 != 0))
713 abfd->flags &= ~D_PAGED;
714 }
715 if (i_ehdrp->e_shstrndx)
716 {
717 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
718 goto got_no_match;
719 }
720
721 /* Read in the program headers. */
722 if (i_ehdrp->e_phnum == 0)
723 elf_tdata (abfd)->phdr = NULL;
724 else
725 {
726 Elf_Internal_Phdr *i_phdr;
727 unsigned int i;
728
dc810e39
AM
729 amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
730 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
252b5132
RH
731 if (elf_tdata (abfd)->phdr == NULL)
732 goto got_no_match;
dc810e39 733 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
252b5132
RH
734 goto got_no_match;
735 i_phdr = elf_tdata (abfd)->phdr;
736 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
737 {
738 Elf_External_Phdr x_phdr;
739
dc810e39 740 if (bfd_bread ((PTR) &x_phdr, (bfd_size_type) sizeof x_phdr, abfd)
252b5132
RH
741 != sizeof x_phdr)
742 goto got_no_match;
743 elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
744 }
745 }
746
747 /* Read in the string table containing the names of the sections. We
3e932841 748 will need the base pointer to this table later. */
252b5132
RH
749 /* We read this inline now, so that we don't have to go through
750 bfd_section_from_shdr with it (since this particular strtab is
751 used to find all of the ELF section names.) */
752
0c35f01a 753 if (i_ehdrp->e_shstrndx != 0)
252b5132 754 {
0c35f01a
AM
755 shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
756 if (!shstrtab)
252b5132 757 goto got_no_match;
0c35f01a
AM
758
759 /* Once all of the section headers have been read and converted, we
760 can start processing them. Note that the first section header is
761 a dummy placeholder entry, so we ignore it. */
762
763 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
764 {
765 if (! bfd_section_from_shdr (abfd, shindex))
766 goto got_no_match;
767 }
252b5132
RH
768 }
769
770 /* Let the backend double check the format and override global
771 information. */
772 if (ebd->elf_backend_object_p)
773 {
774 if ((*ebd->elf_backend_object_p) (abfd) == false)
775 goto got_wrong_format_error;
776 }
777
778 /* If we have created any reloc sections that are associated with
779 debugging sections, mark the reloc sections as debugging as well. */
780 for (s = abfd->sections; s != NULL; s = s->next)
781 {
782 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
783 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
784 && elf_section_data (s)->this_hdr.sh_info > 0)
785 {
786 unsigned long targ_index;
787 asection *targ_sec;
788
789 targ_index = elf_section_data (s)->this_hdr.sh_info;
790 targ_sec = bfd_section_from_elf_index (abfd, targ_index);
791 if (targ_sec != NULL
792 && (targ_sec->flags & SEC_DEBUGGING) != 0)
793 s->flags |= SEC_DEBUGGING;
794 }
795 }
796
797 return (abfd->xvec);
798
799 got_wrong_format_error:
a77a9fef
HPN
800 /* There is way too much undoing of half-known state here. The caller,
801 bfd_check_format_matches, really shouldn't iterate on live bfd's to
802 check match/no-match like it does. We have to rely on that a call to
803 bfd_default_set_arch_mach with the previously known mach, undoes what
804 was done by the first bfd_default_set_arch_mach (with mach 0) here.
805 For this to work, only elf-data and the mach may be changed by the
806 target-specific elf_backend_object_p function. Note that saving the
807 whole bfd here and restoring it would be even worse; the first thing
808 you notice is that the cached bfd file position gets out of sync. */
809 bfd_default_set_arch_mach (abfd, previous_arch, previous_mach);
252b5132
RH
810 bfd_set_error (bfd_error_wrong_format);
811 got_no_match:
812 if (new_tdata != NULL
813 && new_tdata->elf_sect_ptr != NULL)
814 bfd_release (abfd, new_tdata->elf_sect_ptr);
815 if (i_shdrp != NULL)
816 bfd_release (abfd, i_shdrp);
817 if (new_tdata != NULL)
818 bfd_release (abfd, new_tdata);
819 elf_tdata (abfd) = preserved_tdata;
a17cc40f
HPN
820 abfd->sections = preserved_sections;
821 abfd->section_count = preserved_section_count;
252b5132
RH
822 return (NULL);
823}
824\f
825/* ELF .o/exec file writing */
826
827/* Write out the relocs. */
828
b9f66672
JL
829void
830elf_write_relocs (abfd, sec, data)
252b5132
RH
831 bfd *abfd;
832 asection *sec;
833 PTR data;
834{
835 boolean *failedp = (boolean *) data;
836 Elf_Internal_Shdr *rela_hdr;
837 Elf_External_Rela *outbound_relocas;
838 Elf_External_Rel *outbound_relocs;
839 unsigned int idx;
bf572ba0 840 int use_rela_p;
252b5132
RH
841 asymbol *last_sym = 0;
842 int last_sym_idx = 0;
843
844 /* If we have already failed, don't do anything. */
845 if (*failedp)
846 return;
847
848 if ((sec->flags & SEC_RELOC) == 0)
849 return;
850
851 /* The linker backend writes the relocs out itself, and sets the
852 reloc_count field to zero to inhibit writing them here. Also,
853 sometimes the SEC_RELOC flag gets set even when there aren't any
854 relocs. */
855 if (sec->reloc_count == 0)
856 return;
857
858 rela_hdr = &elf_section_data (sec)->rel_hdr;
859
860 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
861 rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
862 if (rela_hdr->contents == NULL)
863 {
864 *failedp = true;
865 return;
866 }
867
bf572ba0
MM
868 /* Figure out whether the relocations are RELA or REL relocations. */
869 if (rela_hdr->sh_type == SHT_RELA)
870 use_rela_p = true;
871 else if (rela_hdr->sh_type == SHT_REL)
872 use_rela_p = false;
873 else
874 /* Every relocation section should be either an SHT_RELA or an
875 SHT_REL section. */
876 abort ();
877
3e932841 878 /* orelocation has the data, reloc_count has the count... */
252b5132
RH
879 if (use_rela_p)
880 {
881 outbound_relocas = (Elf_External_Rela *) rela_hdr->contents;
882
883 for (idx = 0; idx < sec->reloc_count; idx++)
884 {
885 Elf_Internal_Rela dst_rela;
886 Elf_External_Rela *src_rela;
887 arelent *ptr;
888 asymbol *sym;
889 int n;
890
891 ptr = sec->orelocation[idx];
892 src_rela = outbound_relocas + idx;
893
894 /* The address of an ELF reloc is section relative for an object
895 file, and absolute for an executable file or shared library.
896 The address of a BFD reloc is always section relative. */
897 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
898 dst_rela.r_offset = ptr->address;
899 else
900 dst_rela.r_offset = ptr->address + sec->vma;
901
902 sym = *ptr->sym_ptr_ptr;
903 if (sym == last_sym)
904 n = last_sym_idx;
905 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
906 n = STN_UNDEF;
907 else
908 {
909 last_sym = sym;
910 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
911 if (n < 0)
912 {
913 *failedp = true;
914 return;
915 }
916 last_sym_idx = n;
917 }
918
919 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
920 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
921 && ! _bfd_elf_validate_reloc (abfd, ptr))
922 {
923 *failedp = true;
924 return;
925 }
926
927 dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
928
929 dst_rela.r_addend = ptr->addend;
930 elf_swap_reloca_out (abfd, &dst_rela, src_rela);
931 }
932 }
933 else
934 /* REL relocations */
935 {
936 outbound_relocs = (Elf_External_Rel *) rela_hdr->contents;
937
938 for (idx = 0; idx < sec->reloc_count; idx++)
939 {
940 Elf_Internal_Rel dst_rel;
941 Elf_External_Rel *src_rel;
942 arelent *ptr;
943 int n;
944 asymbol *sym;
945
946 ptr = sec->orelocation[idx];
947 sym = *ptr->sym_ptr_ptr;
948 src_rel = outbound_relocs + idx;
949
950 /* The address of an ELF reloc is section relative for an object
951 file, and absolute for an executable file or shared library.
952 The address of a BFD reloc is always section relative. */
953 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
954 dst_rel.r_offset = ptr->address;
955 else
956 dst_rel.r_offset = ptr->address + sec->vma;
957
958 if (sym == last_sym)
959 n = last_sym_idx;
eeaf533e
ILT
960 else if (bfd_is_abs_section (sym->section) && sym->value == 0)
961 n = STN_UNDEF;
252b5132
RH
962 else
963 {
964 last_sym = sym;
965 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
966 if (n < 0)
967 {
968 *failedp = true;
969 return;
970 }
971 last_sym_idx = n;
972 }
973
2f66722d
AM
974 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
975 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
252b5132
RH
976 && ! _bfd_elf_validate_reloc (abfd, ptr))
977 {
978 *failedp = true;
979 return;
980 }
981
982 dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type);
983
984 elf_swap_reloc_out (abfd, &dst_rel, src_rel);
985 }
986 }
987}
988
989/* Write out the program headers. */
990
991int
992elf_write_out_phdrs (abfd, phdr, count)
993 bfd *abfd;
994 const Elf_Internal_Phdr *phdr;
dc810e39 995 unsigned int count;
252b5132
RH
996{
997 while (count--)
998 {
999 Elf_External_Phdr extphdr;
1000 elf_swap_phdr_out (abfd, phdr, &extphdr);
dc810e39
AM
1001 if (bfd_bwrite (&extphdr, (bfd_size_type) sizeof (Elf_External_Phdr),
1002 abfd) != sizeof (Elf_External_Phdr))
252b5132
RH
1003 return -1;
1004 phdr++;
1005 }
1006 return 0;
1007}
1008
1009/* Write out the section headers and the ELF file header. */
1010
1011boolean
1012elf_write_shdrs_and_ehdr (abfd)
1013 bfd *abfd;
1014{
1015 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
1016 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1017 Elf_External_Shdr *x_shdrp; /* Section header table, external form */
1018 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
1019 unsigned int count;
dc810e39 1020 bfd_size_type amt;
252b5132
RH
1021
1022 i_ehdrp = elf_elfheader (abfd);
1023 i_shdrp = elf_elfsections (abfd);
1024
3e932841 1025 /* swap the header before spitting it out... */
252b5132
RH
1026
1027#if DEBUG & 1
1028 elf_debug_file (i_ehdrp);
1029#endif
1030 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
dc810e39 1031 amt = sizeof (x_ehdr);
252b5132 1032 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
dc810e39 1033 || bfd_bwrite ((PTR) & x_ehdr, amt, abfd) != amt)
252b5132
RH
1034 return false;
1035
5732c114
AM
1036 /* Some fields in the first section header handle overflow of ehdr
1037 fields. */
1038 if (i_ehdrp->e_shnum >= SHN_LORESERVE)
1039 i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1040 if (i_ehdrp->e_shstrndx >= SHN_LORESERVE)
1041 i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1042
3e932841 1043 /* at this point we've concocted all the ELF sections... */
5732c114
AM
1044 amt = i_ehdrp->e_shnum;
1045 amt *= sizeof (*x_shdrp);
dc810e39 1046 x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
252b5132
RH
1047 if (!x_shdrp)
1048 return false;
1049
5732c114 1050 for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
252b5132
RH
1051 {
1052#if DEBUG & 2
5732c114 1053 elf_debug_section (count, *i_shdrp);
252b5132 1054#endif
5732c114
AM
1055 elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1056
1057 if (count == SHN_LORESERVE - 1)
1058 i_shdrp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132
RH
1059 }
1060 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
dc810e39 1061 || bfd_bwrite ((PTR) x_shdrp, amt, abfd) != amt)
252b5132
RH
1062 return false;
1063
3e932841 1064 /* need to dump the string table too... */
252b5132
RH
1065
1066 return true;
1067}
1068
1069long
1070elf_slurp_symbol_table (abfd, symptrs, dynamic)
1071 bfd *abfd;
1072 asymbol **symptrs; /* Buffer for generated bfd symbols */
1073 boolean dynamic;
1074{
1075 Elf_Internal_Shdr *hdr;
1076 Elf_Internal_Shdr *verhdr;
1077 unsigned long symcount; /* Number of external ELF symbols */
1078 elf_symbol_type *sym; /* Pointer to current bfd symbol */
1079 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1080 Elf_Internal_Sym i_sym;
1081 Elf_External_Sym *x_symp = NULL;
1082 Elf_External_Versym *x_versymp = NULL;
dc810e39 1083 bfd_size_type amt;
252b5132
RH
1084
1085 /* Read each raw ELF symbol, converting from external ELF form to
1086 internal ELF form, and then using the information to create a
1087 canonical bfd symbol table entry.
1088
1089 Note that we allocate the initial bfd canonical symbol buffer
1090 based on a one-to-one mapping of the ELF symbols to canonical
1091 symbols. We actually use all the ELF symbols, so there will be no
1092 space left over at the end. When we have all the symbols, we
3e932841 1093 build the caller's pointer vector. */
252b5132
RH
1094
1095 if (! dynamic)
1096 {
1097 hdr = &elf_tdata (abfd)->symtab_hdr;
1098 verhdr = NULL;
1099 }
1100 else
1101 {
1102 hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1103 if (elf_dynversym (abfd) == 0)
1104 verhdr = NULL;
1105 else
1106 verhdr = &elf_tdata (abfd)->dynversym_hdr;
1107 if ((elf_tdata (abfd)->dynverdef_section != 0
1108 && elf_tdata (abfd)->verdef == NULL)
1109 || (elf_tdata (abfd)->dynverref_section != 0
1110 && elf_tdata (abfd)->verref == NULL))
1111 {
1112 if (! _bfd_elf_slurp_version_tables (abfd))
1113 return -1;
1114 }
1115 }
1116
dc810e39 1117 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
252b5132
RH
1118 return -1;
1119
1120 symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1121
1122 if (symcount == 0)
1123 sym = symbase = NULL;
1124 else
1125 {
1126 unsigned long i;
1127
dc810e39 1128 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
252b5132
RH
1129 return -1;
1130
dc810e39
AM
1131 amt = symcount;
1132 amt *= sizeof (elf_symbol_type);
1133 symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
252b5132
RH
1134 if (symbase == (elf_symbol_type *) NULL)
1135 return -1;
1136 sym = symbase;
1137
1138 /* Temporarily allocate room for the raw ELF symbols. */
dc810e39
AM
1139 amt = symcount;
1140 amt *= sizeof (Elf_External_Sym);
1141 x_symp = (Elf_External_Sym *) bfd_malloc (amt);
252b5132
RH
1142 if (x_symp == NULL && symcount != 0)
1143 goto error_return;
1144
dbb410c3 1145 if (bfd_bread ((PTR) x_symp, amt, abfd) != amt)
252b5132
RH
1146 goto error_return;
1147
1148 /* Read the raw ELF version symbol information. */
1149
1150 if (verhdr != NULL
1151 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1152 {
1153 (*_bfd_error_handler)
1154 (_("%s: version count (%ld) does not match symbol count (%ld)"),
1155 abfd->filename,
1156 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1157 symcount);
1158
1159 /* Slurp in the symbols without the version information,
1160 since that is more helpful than just quitting. */
1161 verhdr = NULL;
1162 }
1163
1164 if (verhdr != NULL)
1165 {
1166 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1167 goto error_return;
1168
1169 x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1170 if (x_versymp == NULL && verhdr->sh_size != 0)
1171 goto error_return;
1172
dbb410c3 1173 if (bfd_bread ((PTR) x_versymp, verhdr->sh_size, abfd)
252b5132
RH
1174 != verhdr->sh_size)
1175 goto error_return;
1176 }
1177
1178 /* Skip first symbol, which is a null dummy. */
1179 for (i = 1; i < symcount; i++)
1180 {
1181 elf_swap_symbol_in (abfd, x_symp + i, &i_sym);
1182 memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
1183#ifdef ELF_KEEP_EXTSYM
1184 memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym));
1185#endif
1186 sym->symbol.the_bfd = abfd;
1187
1188 sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
1189 hdr->sh_link,
1190 i_sym.st_name);
1191
1192 sym->symbol.value = i_sym.st_value;
1193
1194 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE)
1195 {
1196 sym->symbol.section = section_from_elf_index (abfd,
1197 i_sym.st_shndx);
1198 if (sym->symbol.section == NULL)
1199 {
1200 /* This symbol is in a section for which we did not
1201 create a BFD section. Just use bfd_abs_section,
1202 although it is wrong. FIXME. */
1203 sym->symbol.section = bfd_abs_section_ptr;
1204 }
1205 }
1206 else if (i_sym.st_shndx == SHN_ABS)
1207 {
1208 sym->symbol.section = bfd_abs_section_ptr;
1209 }
1210 else if (i_sym.st_shndx == SHN_COMMON)
1211 {
1212 sym->symbol.section = bfd_com_section_ptr;
1213 /* Elf puts the alignment into the `value' field, and
1214 the size into the `size' field. BFD wants to see the
1215 size in the value field, and doesn't care (at the
1216 moment) about the alignment. */
1217 sym->symbol.value = i_sym.st_size;
1218 }
1219 else if (i_sym.st_shndx == SHN_UNDEF)
1220 {
1221 sym->symbol.section = bfd_und_section_ptr;
1222 }
1223 else
1224 sym->symbol.section = bfd_abs_section_ptr;
1225
1226 /* If this is a relocateable file, then the symbol value is
1227 already section relative. */
1228 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1229 sym->symbol.value -= sym->symbol.section->vma;
1230
1231 switch (ELF_ST_BIND (i_sym.st_info))
1232 {
1233 case STB_LOCAL:
1234 sym->symbol.flags |= BSF_LOCAL;
1235 break;
1236 case STB_GLOBAL:
1237 if (i_sym.st_shndx != SHN_UNDEF
1238 && i_sym.st_shndx != SHN_COMMON)
1239 sym->symbol.flags |= BSF_GLOBAL;
1240 break;
1241 case STB_WEAK:
1242 sym->symbol.flags |= BSF_WEAK;
1243 break;
1244 }
1245
1246 switch (ELF_ST_TYPE (i_sym.st_info))
1247 {
1248 case STT_SECTION:
1249 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1250 break;
1251 case STT_FILE:
1252 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1253 break;
1254 case STT_FUNC:
1255 sym->symbol.flags |= BSF_FUNCTION;
1256 break;
1257 case STT_OBJECT:
1258 sym->symbol.flags |= BSF_OBJECT;
1259 break;
1260 }
1261
1262 if (dynamic)
1263 sym->symbol.flags |= BSF_DYNAMIC;
1264
1265 if (x_versymp != NULL)
1266 {
1267 Elf_Internal_Versym iversym;
1268
1269 _bfd_elf_swap_versym_in (abfd, x_versymp + i, &iversym);
1270 sym->version = iversym.vs_vers;
1271 }
1272
1273 /* Do some backend-specific processing on this symbol. */
1274 {
1275 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1276 if (ebd->elf_backend_symbol_processing)
1277 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1278 }
1279
1280 sym++;
1281 }
1282 }
1283
1284 /* Do some backend-specific processing on this symbol table. */
1285 {
1286 struct elf_backend_data *ebd = get_elf_backend_data (abfd);
1287 if (ebd->elf_backend_symbol_table_processing)
1288 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1289 }
1290
1291 /* We rely on the zalloc to clear out the final symbol entry. */
1292
1293 symcount = sym - symbase;
1294
1295 /* Fill in the user's symbol pointer vector if needed. */
1296 if (symptrs)
1297 {
1298 long l = symcount;
1299
1300 sym = symbase;
1301 while (l-- > 0)
1302 {
1303 *symptrs++ = &sym->symbol;
1304 sym++;
1305 }
1306 *symptrs = 0; /* Final null pointer */
1307 }
1308
1309 if (x_versymp != NULL)
1310 free (x_versymp);
1311 if (x_symp != NULL)
1312 free (x_symp);
1313 return symcount;
1314error_return:
1315 if (x_versymp != NULL)
1316 free (x_versymp);
1317 if (x_symp != NULL)
1318 free (x_symp);
1319 return -1;
1320}
1321
60bcf0fa 1322/* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
42fdc509 1323 them. */
252b5132
RH
1324
1325static boolean
42fdc509
MM
1326elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
1327 relents, symbols, dynamic)
252b5132
RH
1328 bfd *abfd;
1329 asection *asect;
42fdc509
MM
1330 Elf_Internal_Shdr *rel_hdr;
1331 bfd_size_type reloc_count;
1332 arelent *relents;
252b5132
RH
1333 asymbol **symbols;
1334 boolean dynamic;
1335{
1336 struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
252b5132
RH
1337 PTR allocated = NULL;
1338 bfd_byte *native_relocs;
252b5132
RH
1339 arelent *relent;
1340 unsigned int i;
1341 int entsize;
1342
dc810e39 1343 allocated = (PTR) bfd_malloc (rel_hdr->sh_size);
252b5132
RH
1344 if (allocated == NULL)
1345 goto error_return;
1346
1347 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
dc810e39 1348 || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
252b5132
RH
1349 != rel_hdr->sh_size))
1350 goto error_return;
1351
1352 native_relocs = (bfd_byte *) allocated;
1353
252b5132
RH
1354 entsize = rel_hdr->sh_entsize;
1355 BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1356 || entsize == sizeof (Elf_External_Rela));
1357
1358 for (i = 0, relent = relents;
1359 i < reloc_count;
1360 i++, relent++, native_relocs += entsize)
1361 {
1362 Elf_Internal_Rela rela;
1363 Elf_Internal_Rel rel;
1364
1365 if (entsize == sizeof (Elf_External_Rela))
1366 elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela);
1367 else
1368 {
1369 elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel);
1370 rela.r_offset = rel.r_offset;
1371 rela.r_info = rel.r_info;
1372 rela.r_addend = 0;
1373 }
1374
1375 /* The address of an ELF reloc is section relative for an object
1376 file, and absolute for an executable file or shared library.
1377 The address of a normal BFD reloc is always section relative,
1378 and the address of a dynamic reloc is absolute.. */
1379 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1380 relent->address = rela.r_offset;
1381 else
1382 relent->address = rela.r_offset - asect->vma;
1383
1384 if (ELF_R_SYM (rela.r_info) == 0)
1385 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1386 else
1387 {
1388 asymbol **ps, *s;
1389
1390 ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1391 s = *ps;
1392
1393 /* Canonicalize ELF section symbols. FIXME: Why? */
1394 if ((s->flags & BSF_SECTION_SYM) == 0)
1395 relent->sym_ptr_ptr = ps;
1396 else
1397 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
1398 }
1399
1400 relent->addend = rela.r_addend;
1401
1402 if (entsize == sizeof (Elf_External_Rela))
1403 (*ebd->elf_info_to_howto) (abfd, relent, &rela);
1404 else
1405 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
1406 }
1407
252b5132
RH
1408 if (allocated != NULL)
1409 free (allocated);
1410
1411 return true;
1412
1413 error_return:
1414 if (allocated != NULL)
1415 free (allocated);
1416 return false;
1417}
1418
42fdc509
MM
1419/* Read in and swap the external relocs. */
1420
b9f66672 1421boolean
42fdc509
MM
1422elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
1423 bfd *abfd;
1424 asection *asect;
1425 asymbol **symbols;
1426 boolean dynamic;
1427{
1428 struct bfd_elf_section_data * const d = elf_section_data (asect);
1429 Elf_Internal_Shdr *rel_hdr;
1430 Elf_Internal_Shdr *rel_hdr2;
1431 bfd_size_type reloc_count;
1432 bfd_size_type reloc_count2;
1433 arelent *relents;
dc810e39 1434 bfd_size_type amt;
42fdc509
MM
1435
1436 if (asect->relocation != NULL)
1437 return true;
1438
1439 if (! dynamic)
1440 {
1441 if ((asect->flags & SEC_RELOC) == 0
1442 || asect->reloc_count == 0)
1443 return true;
1444
1445 rel_hdr = &d->rel_hdr;
d9bc7a44 1446 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
42fdc509 1447 rel_hdr2 = d->rel_hdr2;
d9bc7a44 1448 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
42fdc509
MM
1449
1450 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1451 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
1452 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1453
1454 }
1455 else
1456 {
57e21bef
MM
1457 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1458 case because relocations against this section may use the
1459 dynamic symbol table, and in that case bfd_section_from_shdr
1460 in elf.c does not update the RELOC_COUNT. */
42fdc509
MM
1461 if (asect->_raw_size == 0)
1462 return true;
1463
1464 rel_hdr = &d->this_hdr;
d9bc7a44 1465 reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
42fdc509 1466 rel_hdr2 = NULL;
57e21bef 1467 reloc_count2 = 0;
42fdc509
MM
1468 }
1469
dc810e39
AM
1470 amt = (reloc_count + reloc_count2) * sizeof (arelent);
1471 relents = (arelent *) bfd_alloc (abfd, amt);
42fdc509
MM
1472 if (relents == NULL)
1473 return false;
1474
1475 if (!elf_slurp_reloc_table_from_section (abfd, asect,
1476 rel_hdr, reloc_count,
1477 relents,
1478 symbols, dynamic))
1479 return false;
60bcf0fa
NC
1480
1481 if (rel_hdr2
42fdc509
MM
1482 && !elf_slurp_reloc_table_from_section (abfd, asect,
1483 rel_hdr2, reloc_count2,
1484 relents + reloc_count,
1485 symbols, dynamic))
1486 return false;
1487
42fdc509
MM
1488 asect->relocation = relents;
1489 return true;
1490}
1491
252b5132
RH
1492#ifdef DEBUG
1493static void
1494elf_debug_section (num, hdr)
1495 int num;
1496 Elf_Internal_Shdr *hdr;
1497{
1498 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1499 hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1500 (long) hdr);
1501 fprintf (stderr,
1502 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n",
1503 (long) hdr->sh_name,
1504 (long) hdr->sh_type,
1505 (long) hdr->sh_flags);
1506 fprintf (stderr,
1507 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n",
1508 (long) hdr->sh_addr,
1509 (long) hdr->sh_offset,
1510 (long) hdr->sh_size);
1511 fprintf (stderr,
1512 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n",
1513 (long) hdr->sh_link,
1514 (long) hdr->sh_info,
1515 (long) hdr->sh_addralign);
1516 fprintf (stderr, "sh_entsize = %ld\n",
1517 (long) hdr->sh_entsize);
1518 fflush (stderr);
1519}
1520
1521static void
1522elf_debug_file (ehdrp)
1523 Elf_Internal_Ehdr *ehdrp;
1524{
1525 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry);
1526 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff);
1527 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum);
1528 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize);
1529 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff);
1530 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum);
1531 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize);
1532}
1533
1534static char *
1535elf_symbol_flags (flags)
1536 flagword flags;
1537{
1538 static char buffer[1024];
1539
1540 buffer[0] = '\0';
1541 if (flags & BSF_LOCAL)
1542 strcat (buffer, " local");
1543
1544 if (flags & BSF_GLOBAL)
1545 strcat (buffer, " global");
1546
1547 if (flags & BSF_DEBUGGING)
1548 strcat (buffer, " debug");
1549
1550 if (flags & BSF_FUNCTION)
1551 strcat (buffer, " function");
1552
1553 if (flags & BSF_KEEP)
1554 strcat (buffer, " keep");
1555
1556 if (flags & BSF_KEEP_G)
1557 strcat (buffer, " keep_g");
1558
1559 if (flags & BSF_WEAK)
1560 strcat (buffer, " weak");
1561
1562 if (flags & BSF_SECTION_SYM)
1563 strcat (buffer, " section-sym");
1564
1565 if (flags & BSF_OLD_COMMON)
1566 strcat (buffer, " old-common");
1567
1568 if (flags & BSF_NOT_AT_END)
1569 strcat (buffer, " not-at-end");
1570
1571 if (flags & BSF_CONSTRUCTOR)
1572 strcat (buffer, " constructor");
1573
1574 if (flags & BSF_WARNING)
1575 strcat (buffer, " warning");
1576
1577 if (flags & BSF_INDIRECT)
1578 strcat (buffer, " indirect");
1579
1580 if (flags & BSF_FILE)
1581 strcat (buffer, " file");
1582
1583 if (flags & DYNAMIC)
1584 strcat (buffer, " dynamic");
1585
1586 if (flags & ~(BSF_LOCAL
1587 | BSF_GLOBAL
1588 | BSF_DEBUGGING
1589 | BSF_FUNCTION
1590 | BSF_KEEP
1591 | BSF_KEEP_G
1592 | BSF_WEAK
1593 | BSF_SECTION_SYM
1594 | BSF_OLD_COMMON
1595 | BSF_NOT_AT_END
1596 | BSF_CONSTRUCTOR
1597 | BSF_WARNING
1598 | BSF_INDIRECT
1599 | BSF_FILE
1600 | BSF_DYNAMIC))
1601 strcat (buffer, " unknown-bits");
1602
1603 return buffer;
1604}
1605#endif
1606\f
1607#include "elfcore.h"
1608#include "elflink.h"
1609\f
1610/* Size-dependent data and functions. */
1611const struct elf_size_info NAME(_bfd_elf,size_info) = {
1612 sizeof (Elf_External_Ehdr),
1613 sizeof (Elf_External_Phdr),
1614 sizeof (Elf_External_Shdr),
1615 sizeof (Elf_External_Rel),
1616 sizeof (Elf_External_Rela),
1617 sizeof (Elf_External_Sym),
1618 sizeof (Elf_External_Dyn),
1619 sizeof (Elf_External_Note),
70bcb145 1620 4,
c7ac6ff8 1621 1,
252b5132
RH
1622 ARCH_SIZE, FILE_ALIGN,
1623 ELFCLASS, EV_CURRENT,
1624 elf_write_out_phdrs,
1625 elf_write_shdrs_and_ehdr,
b9f66672 1626 elf_write_relocs,
252b5132
RH
1627 elf_swap_symbol_out,
1628 elf_slurp_reloc_table,
1629 elf_slurp_symbol_table,
c7ac6ff8
MM
1630 elf_swap_dyn_in,
1631 elf_swap_dyn_out,
1632 NULL,
1633 NULL,
1634 NULL,
1635 NULL
252b5132 1636};