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