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