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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.20.1/] [bfd/] [elf32-sparc.c] - Blame information for rev 298

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 205 julius
/* SPARC-specific support for 32-bit ELF
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "bfdlink.h"
25
#include "libbfd.h"
26
#include "elf-bfd.h"
27
#include "elf/sparc.h"
28
#include "opcode/sparc.h"
29
#include "elfxx-sparc.h"
30
#include "elf-vxworks.h"
31
 
32
/* Support for core dump NOTE sections.  */
33
 
34
static bfd_boolean
35
elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
36
{
37
  switch (note->descsz)
38
    {
39
    default:
40
      return FALSE;
41
 
42
    case 260:                   /* Solaris prpsinfo_t.  */
43
      elf_tdata (abfd)->core_program
44
        = _bfd_elfcore_strndup (abfd, note->descdata + 84, 16);
45
      elf_tdata (abfd)->core_command
46
        = _bfd_elfcore_strndup (abfd, note->descdata + 100, 80);
47
      break;
48
 
49
    case 336:                   /* Solaris psinfo_t.  */
50
      elf_tdata (abfd)->core_program
51
        = _bfd_elfcore_strndup (abfd, note->descdata + 88, 16);
52
      elf_tdata (abfd)->core_command
53
        = _bfd_elfcore_strndup (abfd, note->descdata + 104, 80);
54
      break;
55
    }
56
 
57
  return TRUE;
58
}
59
 
60
/* Functions for dealing with the e_flags field.
61
 
62
   We don't define set_private_flags or copy_private_bfd_data because
63
   the only currently defined values are based on the bfd mach number,
64
   so we use the latter instead and defer setting e_flags until the
65
   file is written out.  */
66
 
67
/* Merge backend specific data from an object file to the output
68
   object file when linking.  */
69
 
70
static bfd_boolean
71
elf32_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
72
{
73
  bfd_boolean error;
74
  unsigned long ibfd_mach;
75
  /* FIXME: This should not be static.  */
76
  static unsigned long previous_ibfd_e_flags = (unsigned long) -1;
77
 
78
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
79
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
80
    return TRUE;
81
 
82
  error = FALSE;
83
 
84
  ibfd_mach = bfd_get_mach (ibfd);
85
  if (bfd_mach_sparc_64bit_p (ibfd_mach))
86
    {
87
      error = TRUE;
88
      (*_bfd_error_handler)
89
        (_("%B: compiled for a 64 bit system and target is 32 bit"), ibfd);
90
    }
91
  else if ((ibfd->flags & DYNAMIC) == 0)
92
    {
93
      if (bfd_get_mach (obfd) < ibfd_mach)
94
        bfd_set_arch_mach (obfd, bfd_arch_sparc, ibfd_mach);
95
    }
96
 
97
  if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
98
       != previous_ibfd_e_flags)
99
      && previous_ibfd_e_flags != (unsigned long) -1)
100
    {
101
      (*_bfd_error_handler)
102
        (_("%B: linking little endian files with big endian files"), ibfd);
103
      error = TRUE;
104
    }
105
  previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
106
 
107
  if (error)
108
    {
109
      bfd_set_error (bfd_error_bad_value);
110
      return FALSE;
111
    }
112
 
113
  return TRUE;
114
}
115
 
116
/* The final processing done just before writing out the object file.
117
   We need to set the e_machine field appropriately.  */
118
 
119
static void
120
elf32_sparc_final_write_processing (bfd *abfd,
121
                                    bfd_boolean linker ATTRIBUTE_UNUSED)
122
{
123
  switch (bfd_get_mach (abfd))
124
    {
125
    case bfd_mach_sparc :
126
    case bfd_mach_sparc_sparclet :
127
    case bfd_mach_sparc_sparclite :
128
      break; /* nothing to do */
129
    case bfd_mach_sparc_v8plus :
130
      elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
131
      elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
132
      elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS;
133
      break;
134
    case bfd_mach_sparc_v8plusa :
135
      elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
136
      elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
137
      elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1;
138
      break;
139
    case bfd_mach_sparc_v8plusb :
140
      elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
141
      elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
142
      elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1
143
                                       | EF_SPARC_SUN_US3;
144
      break;
145
    case bfd_mach_sparc_sparclite_le :
146
      elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
147
      break;
148
    default :
149
      abort ();
150
      break;
151
    }
152
}
153
 
154
static enum elf_reloc_type_class
155
elf32_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
156
{
157
  switch ((int) ELF32_R_TYPE (rela->r_info))
158
    {
159
    case R_SPARC_RELATIVE:
160
      return reloc_class_relative;
161
    case R_SPARC_JMP_SLOT:
162
      return reloc_class_plt;
163
    case R_SPARC_COPY:
164
      return reloc_class_copy;
165
    default:
166
      return reloc_class_normal;
167
    }
168
}
169
 
170
#define TARGET_BIG_SYM  bfd_elf32_sparc_vec
171
#define TARGET_BIG_NAME "elf32-sparc"
172
#define ELF_ARCH        bfd_arch_sparc
173
#define ELF_MACHINE_CODE EM_SPARC
174
#define ELF_MACHINE_ALT1 EM_SPARC32PLUS
175
#define ELF_MAXPAGESIZE 0x10000
176
#define ELF_COMMONPAGESIZE 0x2000
177
 
178
#define bfd_elf32_bfd_merge_private_bfd_data \
179
                                        elf32_sparc_merge_private_bfd_data
180
#define elf_backend_final_write_processing \
181
                                        elf32_sparc_final_write_processing
182
#define elf_backend_grok_psinfo         elf32_sparc_grok_psinfo
183
#define elf_backend_reloc_type_class    elf32_sparc_reloc_type_class
184
 
185
#define elf_info_to_howto               _bfd_sparc_elf_info_to_howto
186
#define bfd_elf32_bfd_reloc_type_lookup _bfd_sparc_elf_reloc_type_lookup
187
#define bfd_elf32_bfd_reloc_name_lookup \
188
  _bfd_sparc_elf_reloc_name_lookup
189
#define bfd_elf32_bfd_link_hash_table_create \
190
                                        _bfd_sparc_elf_link_hash_table_create
191
#define bfd_elf32_bfd_relax_section     _bfd_sparc_elf_relax_section
192
#define bfd_elf32_new_section_hook      _bfd_sparc_elf_new_section_hook
193
#define elf_backend_copy_indirect_symbol \
194
                                        _bfd_sparc_elf_copy_indirect_symbol
195
#define elf_backend_create_dynamic_sections \
196
                                        _bfd_sparc_elf_create_dynamic_sections
197
#define elf_backend_check_relocs        _bfd_sparc_elf_check_relocs
198
#define elf_backend_adjust_dynamic_symbol \
199
                                        _bfd_sparc_elf_adjust_dynamic_symbol
200
#define elf_backend_omit_section_dynsym _bfd_sparc_elf_omit_section_dynsym
201
#define elf_backend_size_dynamic_sections \
202
                                        _bfd_sparc_elf_size_dynamic_sections
203
#define elf_backend_relocate_section    _bfd_sparc_elf_relocate_section
204
#define elf_backend_finish_dynamic_symbol \
205
                                        _bfd_sparc_elf_finish_dynamic_symbol
206
#define elf_backend_finish_dynamic_sections \
207
                                        _bfd_sparc_elf_finish_dynamic_sections
208
#define bfd_elf32_mkobject              _bfd_sparc_elf_mkobject
209
#define elf_backend_object_p            _bfd_sparc_elf_object_p
210
#define elf_backend_gc_mark_hook        _bfd_sparc_elf_gc_mark_hook
211
#define elf_backend_gc_sweep_hook       _bfd_sparc_elf_gc_sweep_hook
212
#define elf_backend_plt_sym_val         _bfd_sparc_elf_plt_sym_val
213
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
214
 
215
#define elf_backend_can_gc_sections 1
216
#define elf_backend_can_refcount 1
217
#define elf_backend_want_got_plt 0
218
#define elf_backend_plt_readonly 0
219
#define elf_backend_want_plt_sym 1
220
#define elf_backend_got_header_size 4
221
#define elf_backend_rela_normal 1
222
 
223
#include "elf32-target.h"
224
 
225
/* A wrapper around _bfd_sparc_elf_link_hash_table_create that identifies
226
   the target system as VxWorks.  */
227
 
228
static struct bfd_link_hash_table *
229
elf32_sparc_vxworks_link_hash_table_create (bfd *abfd)
230
{
231
  struct bfd_link_hash_table *ret;
232
 
233
  ret = _bfd_sparc_elf_link_hash_table_create (abfd);
234
  if (ret)
235
    {
236
      struct _bfd_sparc_elf_link_hash_table *htab;
237
 
238
      htab = (struct _bfd_sparc_elf_link_hash_table *) ret;
239
      htab->is_vxworks = 1;
240
    }
241
  return ret;
242
}
243
 
244
/* A final_write_processing hook that does both the SPARC- and VxWorks-
245
   specific handling.  */
246
 
247
static void
248
elf32_sparc_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
249
{
250
  elf32_sparc_final_write_processing (abfd, linker);
251
  elf_vxworks_final_write_processing (abfd, linker);
252
}
253
 
254
#undef TARGET_BIG_SYM
255
#define TARGET_BIG_SYM  bfd_elf32_sparc_vxworks_vec
256
#undef TARGET_BIG_NAME
257
#define TARGET_BIG_NAME "elf32-sparc-vxworks"
258
 
259
#undef ELF_MINPAGESIZE
260
#define ELF_MINPAGESIZE 0x1000
261
 
262
#undef bfd_elf32_bfd_link_hash_table_create
263
#define bfd_elf32_bfd_link_hash_table_create \
264
  elf32_sparc_vxworks_link_hash_table_create
265
 
266
#undef elf_backend_want_got_plt
267
#define elf_backend_want_got_plt                1
268
#undef elf_backend_plt_readonly
269
#define elf_backend_plt_readonly                1
270
#undef elf_backend_got_header_size
271
#define elf_backend_got_header_size             12
272
#undef elf_backend_add_symbol_hook
273
#define elf_backend_add_symbol_hook \
274
  elf_vxworks_add_symbol_hook
275
#undef elf_backend_link_output_symbol_hook
276
#define elf_backend_link_output_symbol_hook \
277
  elf_vxworks_link_output_symbol_hook
278
#undef elf_backend_emit_relocs
279
#define elf_backend_emit_relocs \
280
  elf_vxworks_emit_relocs
281
#undef elf_backend_final_write_processing
282
#define elf_backend_final_write_processing \
283
  elf32_sparc_vxworks_final_write_processing
284
 
285
#undef elf32_bed
286
#define elf32_bed                               sparc_elf_vxworks_bed
287
 
288
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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