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