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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [bfd/] [elf32-sparc.c] - Blame information for rev 846

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

Line No. Rev Author Line
1 330 jeremybenn
/* 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
/* Hook called by the linker routine which adds symbols from an object
171
   file.  */
172
 
173
static bfd_boolean
174
elf32_sparc_add_symbol_hook (bfd * abfd,
175
                             struct bfd_link_info * info ATTRIBUTE_UNUSED,
176
                             Elf_Internal_Sym * sym,
177
                             const char ** namep ATTRIBUTE_UNUSED,
178
                             flagword * flagsp ATTRIBUTE_UNUSED,
179
                             asection ** secp ATTRIBUTE_UNUSED,
180
                             bfd_vma * valp ATTRIBUTE_UNUSED)
181
{
182
  if ((abfd->flags & DYNAMIC) == 0
183
      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
184
    elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE;
185
  return TRUE;
186
}
187
 
188
#define TARGET_BIG_SYM  bfd_elf32_sparc_vec
189
#define TARGET_BIG_NAME "elf32-sparc"
190
#define ELF_ARCH        bfd_arch_sparc
191
#define ELF_MACHINE_CODE EM_SPARC
192
#define ELF_MACHINE_ALT1 EM_SPARC32PLUS
193
#define ELF_MAXPAGESIZE 0x10000
194
#define ELF_COMMONPAGESIZE 0x2000
195
 
196
#define bfd_elf32_bfd_merge_private_bfd_data \
197
                                        elf32_sparc_merge_private_bfd_data
198
#define elf_backend_final_write_processing \
199
                                        elf32_sparc_final_write_processing
200
#define elf_backend_grok_psinfo         elf32_sparc_grok_psinfo
201
#define elf_backend_reloc_type_class    elf32_sparc_reloc_type_class
202
 
203
#define elf_info_to_howto               _bfd_sparc_elf_info_to_howto
204
#define bfd_elf32_bfd_reloc_type_lookup _bfd_sparc_elf_reloc_type_lookup
205
#define bfd_elf32_bfd_reloc_name_lookup \
206
  _bfd_sparc_elf_reloc_name_lookup
207
#define bfd_elf32_bfd_link_hash_table_create \
208
                                        _bfd_sparc_elf_link_hash_table_create
209
#define bfd_elf32_bfd_link_hash_table_free \
210
                                        _bfd_sparc_elf_link_hash_table_free
211
#define bfd_elf32_bfd_relax_section     _bfd_sparc_elf_relax_section
212
#define bfd_elf32_new_section_hook      _bfd_sparc_elf_new_section_hook
213
#define elf_backend_copy_indirect_symbol \
214
                                        _bfd_sparc_elf_copy_indirect_symbol
215
#define elf_backend_create_dynamic_sections \
216
                                        _bfd_sparc_elf_create_dynamic_sections
217
#define elf_backend_check_relocs        _bfd_sparc_elf_check_relocs
218
#define elf_backend_adjust_dynamic_symbol \
219
                                        _bfd_sparc_elf_adjust_dynamic_symbol
220
#define elf_backend_omit_section_dynsym _bfd_sparc_elf_omit_section_dynsym
221
#define elf_backend_size_dynamic_sections \
222
                                        _bfd_sparc_elf_size_dynamic_sections
223
#define elf_backend_relocate_section    _bfd_sparc_elf_relocate_section
224
#define elf_backend_finish_dynamic_symbol \
225
                                        _bfd_sparc_elf_finish_dynamic_symbol
226
#define elf_backend_finish_dynamic_sections \
227
                                        _bfd_sparc_elf_finish_dynamic_sections
228
#define bfd_elf32_mkobject              _bfd_sparc_elf_mkobject
229
#define elf_backend_object_p            _bfd_sparc_elf_object_p
230
#define elf_backend_gc_mark_hook        _bfd_sparc_elf_gc_mark_hook
231
#define elf_backend_gc_sweep_hook       _bfd_sparc_elf_gc_sweep_hook
232
#define elf_backend_plt_sym_val         _bfd_sparc_elf_plt_sym_val
233
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
234
 
235
#define elf_backend_can_gc_sections 1
236
#define elf_backend_can_refcount 1
237
#define elf_backend_want_got_plt 0
238
#define elf_backend_plt_readonly 0
239
#define elf_backend_want_plt_sym 1
240
#define elf_backend_got_header_size 4
241
#define elf_backend_rela_normal 1
242
 
243
#define elf_backend_post_process_headers        _bfd_elf_set_osabi
244
#define elf_backend_add_symbol_hook             elf32_sparc_add_symbol_hook
245
 
246
#include "elf32-target.h"
247
 
248
/* A wrapper around _bfd_sparc_elf_link_hash_table_create that identifies
249
   the target system as VxWorks.  */
250
 
251
static struct bfd_link_hash_table *
252
elf32_sparc_vxworks_link_hash_table_create (bfd *abfd)
253
{
254
  struct bfd_link_hash_table *ret;
255
 
256
  ret = _bfd_sparc_elf_link_hash_table_create (abfd);
257
  if (ret)
258
    {
259
      struct _bfd_sparc_elf_link_hash_table *htab;
260
 
261
      htab = (struct _bfd_sparc_elf_link_hash_table *) ret;
262
      htab->is_vxworks = 1;
263
    }
264
  return ret;
265
}
266
 
267
/* A final_write_processing hook that does both the SPARC- and VxWorks-
268
   specific handling.  */
269
 
270
static void
271
elf32_sparc_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
272
{
273
  elf32_sparc_final_write_processing (abfd, linker);
274
  elf_vxworks_final_write_processing (abfd, linker);
275
}
276
 
277
#undef TARGET_BIG_SYM
278
#define TARGET_BIG_SYM  bfd_elf32_sparc_vxworks_vec
279
#undef TARGET_BIG_NAME
280
#define TARGET_BIG_NAME "elf32-sparc-vxworks"
281
 
282
#undef ELF_MINPAGESIZE
283
#define ELF_MINPAGESIZE 0x1000
284
 
285
#undef bfd_elf32_bfd_link_hash_table_create
286
#define bfd_elf32_bfd_link_hash_table_create \
287
  elf32_sparc_vxworks_link_hash_table_create
288
 
289
#undef elf_backend_want_got_plt
290
#define elf_backend_want_got_plt                1
291
#undef elf_backend_plt_readonly
292
#define elf_backend_plt_readonly                1
293
#undef elf_backend_got_header_size
294
#define elf_backend_got_header_size             12
295
#undef elf_backend_add_symbol_hook
296
#define elf_backend_add_symbol_hook \
297
  elf_vxworks_add_symbol_hook
298
#undef elf_backend_link_output_symbol_hook
299
#define elf_backend_link_output_symbol_hook \
300
  elf_vxworks_link_output_symbol_hook
301
#undef elf_backend_emit_relocs
302
#define elf_backend_emit_relocs \
303
  elf_vxworks_emit_relocs
304
#undef elf_backend_final_write_processing
305
#define elf_backend_final_write_processing \
306
  elf32_sparc_vxworks_final_write_processing
307
 
308
#undef elf32_bed
309
#define elf32_bed                               sparc_elf_vxworks_bed
310
 
311
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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