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