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