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