OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [bfd/] [elfcode.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.