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