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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf64-sparc.c] - Blame information for rev 146

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

Line No. Rev Author Line
1 14 khays
/* SPARC-specific support for 64-bit ELF
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 "libbfd.h"
25
#include "elf-bfd.h"
26
#include "elf/sparc.h"
27
#include "opcode/sparc.h"
28
#include "elfxx-sparc.h"
29
 
30
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
31
#define MINUS_ONE (~ (bfd_vma) 0)
32
 
33
/* Due to the way how we handle R_SPARC_OLO10, each entry in a SHT_RELA
34
   section can represent up to two relocs, we must tell the user to allocate
35
   more space.  */
36
 
37
static long
38
elf64_sparc_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
39
{
40
  return (sec->reloc_count * 2 + 1) * sizeof (arelent *);
41
}
42
 
43
static long
44
elf64_sparc_get_dynamic_reloc_upper_bound (bfd *abfd)
45
{
46
  return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 2;
47
}
48
 
49
/* Read  relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
50
   them.  We cannot use generic elf routines for this,  because R_SPARC_OLO10
51
   has secondary addend in ELF64_R_TYPE_DATA.  We handle it as two relocations
52
   for the same location,  R_SPARC_LO10 and R_SPARC_13.  */
53
 
54
static bfd_boolean
55
elf64_sparc_slurp_one_reloc_table (bfd *abfd, asection *asect,
56
                                   Elf_Internal_Shdr *rel_hdr,
57
                                   asymbol **symbols, bfd_boolean dynamic)
58
{
59
  PTR allocated = NULL;
60
  bfd_byte *native_relocs;
61
  arelent *relent;
62
  unsigned int i;
63
  int entsize;
64
  bfd_size_type count;
65
  arelent *relents;
66
 
67
  allocated = (PTR) bfd_malloc (rel_hdr->sh_size);
68
  if (allocated == NULL)
69
    goto error_return;
70
 
71
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
72
      || bfd_bread (allocated, rel_hdr->sh_size, abfd) != rel_hdr->sh_size)
73
    goto error_return;
74
 
75
  native_relocs = (bfd_byte *) allocated;
76
 
77
  relents = asect->relocation + canon_reloc_count (asect);
78
 
79
  entsize = rel_hdr->sh_entsize;
80
  BFD_ASSERT (entsize == sizeof (Elf64_External_Rela));
81
 
82
  count = rel_hdr->sh_size / entsize;
83
 
84
  for (i = 0, relent = relents; i < count;
85
       i++, relent++, native_relocs += entsize)
86
    {
87
      Elf_Internal_Rela rela;
88
      unsigned int r_type;
89
 
90
      bfd_elf64_swap_reloca_in (abfd, native_relocs, &rela);
91
 
92
      /* The address of an ELF reloc is section relative for an object
93
         file, and absolute for an executable file or shared library.
94
         The address of a normal BFD reloc is always section relative,
95
         and the address of a dynamic reloc is absolute..  */
96
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
97
        relent->address = rela.r_offset;
98
      else
99
        relent->address = rela.r_offset - asect->vma;
100
 
101
      if (ELF64_R_SYM (rela.r_info) == STN_UNDEF)
102
        relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
103
      else
104
        {
105
          asymbol **ps, *s;
106
 
107
          ps = symbols + ELF64_R_SYM (rela.r_info) - 1;
108
          s = *ps;
109
 
110
          /* Canonicalize ELF section symbols.  FIXME: Why?  */
111
          if ((s->flags & BSF_SECTION_SYM) == 0)
112
            relent->sym_ptr_ptr = ps;
113
          else
114
            relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
115
        }
116
 
117
      relent->addend = rela.r_addend;
118
 
119
      r_type = ELF64_R_TYPE_ID (rela.r_info);
120
      if (r_type == R_SPARC_OLO10)
121
        {
122
          relent->howto = _bfd_sparc_elf_info_to_howto_ptr (R_SPARC_LO10);
123
          relent[1].address = relent->address;
124
          relent++;
125
          relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
126
          relent->addend = ELF64_R_TYPE_DATA (rela.r_info);
127
          relent->howto = _bfd_sparc_elf_info_to_howto_ptr (R_SPARC_13);
128
        }
129
      else
130
        relent->howto = _bfd_sparc_elf_info_to_howto_ptr (r_type);
131
    }
132
 
133
  canon_reloc_count (asect) += relent - relents;
134
 
135
  if (allocated != NULL)
136
    free (allocated);
137
 
138
  return TRUE;
139
 
140
 error_return:
141
  if (allocated != NULL)
142
    free (allocated);
143
  return FALSE;
144
}
145
 
146
/* Read in and swap the external relocs.  */
147
 
148
static bfd_boolean
149
elf64_sparc_slurp_reloc_table (bfd *abfd, asection *asect,
150
                               asymbol **symbols, bfd_boolean dynamic)
151
{
152
  struct bfd_elf_section_data * const d = elf_section_data (asect);
153
  Elf_Internal_Shdr *rel_hdr;
154
  Elf_Internal_Shdr *rel_hdr2;
155
  bfd_size_type amt;
156
 
157
  if (asect->relocation != NULL)
158
    return TRUE;
159
 
160
  if (! dynamic)
161
    {
162
      if ((asect->flags & SEC_RELOC) == 0
163
          || asect->reloc_count == 0)
164
        return TRUE;
165
 
166
      rel_hdr = d->rel.hdr;
167
      rel_hdr2 = d->rela.hdr;
168
 
169
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
170
                  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
171
    }
172
  else
173
    {
174
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
175
         case because relocations against this section may use the
176
         dynamic symbol table, and in that case bfd_section_from_shdr
177
         in elf.c does not update the RELOC_COUNT.  */
178
      if (asect->size == 0)
179
        return TRUE;
180
 
181
      rel_hdr = &d->this_hdr;
182
      asect->reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
183
      rel_hdr2 = NULL;
184
    }
185
 
186
  amt = asect->reloc_count;
187
  amt *= 2 * sizeof (arelent);
188
  asect->relocation = (arelent *) bfd_alloc (abfd, amt);
189
  if (asect->relocation == NULL)
190
    return FALSE;
191
 
192
  /* The elf64_sparc_slurp_one_reloc_table routine increments
193
     canon_reloc_count.  */
194
  canon_reloc_count (asect) = 0;
195
 
196
  if (rel_hdr
197
      && !elf64_sparc_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols,
198
                                             dynamic))
199
    return FALSE;
200
 
201
  if (rel_hdr2
202
      && !elf64_sparc_slurp_one_reloc_table (abfd, asect, rel_hdr2, symbols,
203
                                             dynamic))
204
    return FALSE;
205
 
206
  return TRUE;
207
}
208
 
209
/* Canonicalize the relocs.  */
210
 
211
static long
212
elf64_sparc_canonicalize_reloc (bfd *abfd, sec_ptr section,
213
                                arelent **relptr, asymbol **symbols)
214
{
215
  arelent *tblptr;
216
  unsigned int i;
217
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
218
 
219
  if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
220
    return -1;
221
 
222
  tblptr = section->relocation;
223
  for (i = 0; i < canon_reloc_count (section); i++)
224
    *relptr++ = tblptr++;
225
 
226
  *relptr = NULL;
227
 
228
  return canon_reloc_count (section);
229
}
230
 
231
 
232
/* Canonicalize the dynamic relocation entries.  Note that we return
233
   the dynamic relocations as a single block, although they are
234
   actually associated with particular sections; the interface, which
235
   was designed for SunOS style shared libraries, expects that there
236
   is only one set of dynamic relocs.  Any section that was actually
237
   installed in the BFD, and has type SHT_REL or SHT_RELA, and uses
238
   the dynamic symbol table, is considered to be a dynamic reloc
239
   section.  */
240
 
241
static long
242
elf64_sparc_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
243
                                        asymbol **syms)
244
{
245
  asection *s;
246
  long ret;
247
 
248
  if (elf_dynsymtab (abfd) == 0)
249
    {
250
      bfd_set_error (bfd_error_invalid_operation);
251
      return -1;
252
    }
253
 
254
  ret = 0;
255
  for (s = abfd->sections; s != NULL; s = s->next)
256
    {
257
      if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
258
          && (elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
259
        {
260
          arelent *p;
261
          long count, i;
262
 
263
          if (! elf64_sparc_slurp_reloc_table (abfd, s, syms, TRUE))
264
            return -1;
265
          count = canon_reloc_count (s);
266
          p = s->relocation;
267
          for (i = 0; i < count; i++)
268
            *storage++ = p++;
269
          ret += count;
270
        }
271
    }
272
 
273
  *storage = NULL;
274
 
275
  return ret;
276
}
277
 
278
/* Write out the relocs.  */
279
 
280
static void
281
elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data)
282
{
283
  bfd_boolean *failedp = (bfd_boolean *) data;
284
  Elf_Internal_Shdr *rela_hdr;
285
  bfd_vma addr_offset;
286
  Elf64_External_Rela *outbound_relocas, *src_rela;
287
  unsigned int idx, count;
288
  asymbol *last_sym = 0;
289
  int last_sym_idx = 0;
290
 
291
  /* If we have already failed, don't do anything.  */
292
  if (*failedp)
293
    return;
294
 
295
  if ((sec->flags & SEC_RELOC) == 0)
296
    return;
297
 
298
  /* The linker backend writes the relocs out itself, and sets the
299
     reloc_count field to zero to inhibit writing them here.  Also,
300
     sometimes the SEC_RELOC flag gets set even when there aren't any
301
     relocs.  */
302
  if (sec->reloc_count == 0)
303
    return;
304
 
305
  /* We can combine two relocs that refer to the same address
306
     into R_SPARC_OLO10 if first one is R_SPARC_LO10 and the
307
     latter is R_SPARC_13 with no associated symbol.  */
308
  count = 0;
309
  for (idx = 0; idx < sec->reloc_count; idx++)
310
    {
311
      bfd_vma addr;
312
 
313
      ++count;
314
 
315
      addr = sec->orelocation[idx]->address;
316
      if (sec->orelocation[idx]->howto->type == R_SPARC_LO10
317
          && idx < sec->reloc_count - 1)
318
        {
319
          arelent *r = sec->orelocation[idx + 1];
320
 
321
          if (r->howto->type == R_SPARC_13
322
              && r->address == addr
323
              && bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
324
              && (*r->sym_ptr_ptr)->value == 0)
325
            ++idx;
326
        }
327
    }
328
 
329
  rela_hdr = elf_section_data (sec)->rela.hdr;
330
 
331
  rela_hdr->sh_size = rela_hdr->sh_entsize * count;
332
  rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
333
  if (rela_hdr->contents == NULL)
334
    {
335
      *failedp = TRUE;
336
      return;
337
    }
338
 
339
  /* Figure out whether the relocations are RELA or REL relocations.  */
340
  if (rela_hdr->sh_type != SHT_RELA)
341
    abort ();
342
 
343
  /* The address of an ELF reloc is section relative for an object
344
     file, and absolute for an executable file or shared library.
345
     The address of a BFD reloc is always section relative.  */
346
  addr_offset = 0;
347
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
348
    addr_offset = sec->vma;
349
 
350
  /* orelocation has the data, reloc_count has the count...  */
351
  outbound_relocas = (Elf64_External_Rela *) rela_hdr->contents;
352
  src_rela = outbound_relocas;
353
 
354
  for (idx = 0; idx < sec->reloc_count; idx++)
355
    {
356
      Elf_Internal_Rela dst_rela;
357
      arelent *ptr;
358
      asymbol *sym;
359
      int n;
360
 
361
      ptr = sec->orelocation[idx];
362
      sym = *ptr->sym_ptr_ptr;
363
      if (sym == last_sym)
364
        n = last_sym_idx;
365
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
366
        n = STN_UNDEF;
367
      else
368
        {
369
          last_sym = sym;
370
          n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
371
          if (n < 0)
372
            {
373
              *failedp = TRUE;
374
              return;
375
            }
376
          last_sym_idx = n;
377
        }
378
 
379
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
380
          && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
381
          && ! _bfd_elf_validate_reloc (abfd, ptr))
382
        {
383
          *failedp = TRUE;
384
          return;
385
        }
386
 
387
      if (ptr->howto->type == R_SPARC_LO10
388
          && idx < sec->reloc_count - 1)
389
        {
390
          arelent *r = sec->orelocation[idx + 1];
391
 
392
          if (r->howto->type == R_SPARC_13
393
              && r->address == ptr->address
394
              && bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
395
              && (*r->sym_ptr_ptr)->value == 0)
396
            {
397
              idx++;
398
              dst_rela.r_info
399
                = ELF64_R_INFO (n, ELF64_R_TYPE_INFO (r->addend,
400
                                                      R_SPARC_OLO10));
401
            }
402
          else
403
            dst_rela.r_info = ELF64_R_INFO (n, R_SPARC_LO10);
404
        }
405
      else
406
        dst_rela.r_info = ELF64_R_INFO (n, ptr->howto->type);
407
 
408
      dst_rela.r_offset = ptr->address + addr_offset;
409
      dst_rela.r_addend = ptr->addend;
410
 
411
      bfd_elf64_swap_reloca_out (abfd, &dst_rela, (bfd_byte *) src_rela);
412
      ++src_rela;
413
    }
414
}
415
 
416
/* Hook called by the linker routine which adds symbols from an object
417
   file.  We use it for STT_REGISTER symbols.  */
418
 
419
static bfd_boolean
420
elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
421
                             Elf_Internal_Sym *sym, const char **namep,
422
                             flagword *flagsp ATTRIBUTE_UNUSED,
423
                             asection **secp ATTRIBUTE_UNUSED,
424
                             bfd_vma *valp ATTRIBUTE_UNUSED)
425
{
426
  static const char *const stt_types[] = { "NOTYPE", "OBJECT", "FUNCTION" };
427
 
428
  if ((abfd->flags & DYNAMIC) == 0
429
      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
430
          || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
431
    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
432
 
433
  if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER)
434
    {
435
      int reg;
436
      struct _bfd_sparc_elf_app_reg *p;
437
 
438
      reg = (int)sym->st_value;
439
      switch (reg & ~1)
440
        {
441
        case 2: reg -= 2; break;
442
        case 6: reg -= 4; break;
443
        default:
444
          (*_bfd_error_handler)
445
            (_("%B: Only registers %%g[2367] can be declared using STT_REGISTER"),
446
             abfd);
447
          return FALSE;
448
        }
449
 
450
      if (info->output_bfd->xvec != abfd->xvec
451
          || (abfd->flags & DYNAMIC) != 0)
452
        {
453
          /* STT_REGISTER only works when linking an elf64_sparc object.
454
             If STT_REGISTER comes from a dynamic object, don't put it into
455
             the output bfd.  The dynamic linker will recheck it.  */
456
          *namep = NULL;
457
          return TRUE;
458
        }
459
 
460
      p = _bfd_sparc_elf_hash_table(info)->app_regs + reg;
461
 
462
      if (p->name != NULL && strcmp (p->name, *namep))
463
        {
464
          (*_bfd_error_handler)
465
            (_("Register %%g%d used incompatibly: %s in %B, previously %s in %B"),
466
             abfd, p->abfd, (int) sym->st_value,
467
             **namep ? *namep : "#scratch",
468
             *p->name ? p->name : "#scratch");
469
          return FALSE;
470
        }
471
 
472
      if (p->name == NULL)
473
        {
474
          if (**namep)
475
            {
476
              struct elf_link_hash_entry *h;
477
 
478
              h = (struct elf_link_hash_entry *)
479
                bfd_link_hash_lookup (info->hash, *namep, FALSE, FALSE, FALSE);
480
 
481
              if (h != NULL)
482
                {
483
                  unsigned char type = h->type;
484
 
485
                  if (type > STT_FUNC)
486
                    type = 0;
487
                  (*_bfd_error_handler)
488
                    (_("Symbol `%s' has differing types: REGISTER in %B, previously %s in %B"),
489
                     abfd, p->abfd, *namep, stt_types[type]);
490
                  return FALSE;
491
                }
492
 
493
              p->name = bfd_hash_allocate (&info->hash->table,
494
                                           strlen (*namep) + 1);
495
              if (!p->name)
496
                return FALSE;
497
 
498
              strcpy (p->name, *namep);
499
            }
500
          else
501
            p->name = "";
502
          p->bind = ELF_ST_BIND (sym->st_info);
503
          p->abfd = abfd;
504
          p->shndx = sym->st_shndx;
505
        }
506
      else
507
        {
508
          if (p->bind == STB_WEAK
509
              && ELF_ST_BIND (sym->st_info) == STB_GLOBAL)
510
            {
511
              p->bind = STB_GLOBAL;
512
              p->abfd = abfd;
513
            }
514
        }
515
      *namep = NULL;
516
      return TRUE;
517
    }
518
  else if (*namep && **namep
519
           && info->output_bfd->xvec == abfd->xvec)
520
    {
521
      int i;
522
      struct _bfd_sparc_elf_app_reg *p;
523
 
524
      p = _bfd_sparc_elf_hash_table(info)->app_regs;
525
      for (i = 0; i < 4; i++, p++)
526
        if (p->name != NULL && ! strcmp (p->name, *namep))
527
          {
528
            unsigned char type = ELF_ST_TYPE (sym->st_info);
529
 
530
            if (type > STT_FUNC)
531
              type = 0;
532
            (*_bfd_error_handler)
533
              (_("Symbol `%s' has differing types: %s in %B, previously REGISTER in %B"),
534
               abfd, p->abfd, *namep, stt_types[type]);
535
            return FALSE;
536
          }
537
    }
538
  return TRUE;
539
}
540
 
541
/* This function takes care of emitting STT_REGISTER symbols
542
   which we cannot easily keep in the symbol hash table.  */
543
 
544
static bfd_boolean
545
elf64_sparc_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
546
                              struct bfd_link_info *info,
547
                              PTR finfo,
548
                              int (*func) (PTR, const char *,
549
                                           Elf_Internal_Sym *,
550
                                           asection *,
551
                                           struct elf_link_hash_entry *))
552
{
553
  int reg;
554
  struct _bfd_sparc_elf_app_reg *app_regs =
555
    _bfd_sparc_elf_hash_table(info)->app_regs;
556
  Elf_Internal_Sym sym;
557
 
558
  /* We arranged in size_dynamic_sections to put the STT_REGISTER entries
559
     at the end of the dynlocal list, so they came at the end of the local
560
     symbols in the symtab.  Except that they aren't STB_LOCAL, so we need
561
     to back up symtab->sh_info.  */
562
  if (elf_hash_table (info)->dynlocal)
563
    {
564
      bfd * dynobj = elf_hash_table (info)->dynobj;
565
      asection *dynsymsec = bfd_get_section_by_name (dynobj, ".dynsym");
566
      struct elf_link_local_dynamic_entry *e;
567
 
568
      for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
569
        if (e->input_indx == -1)
570
          break;
571
      if (e)
572
        {
573
          elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
574
            = e->dynindx;
575
        }
576
    }
577
 
578
  if (info->strip == strip_all)
579
    return TRUE;
580
 
581
  for (reg = 0; reg < 4; reg++)
582
    if (app_regs [reg].name != NULL)
583
      {
584
        if (info->strip == strip_some
585
            && bfd_hash_lookup (info->keep_hash,
586
                                app_regs [reg].name,
587
                                FALSE, FALSE) == NULL)
588
          continue;
589
 
590
        sym.st_value = reg < 2 ? reg + 2 : reg + 4;
591
        sym.st_size = 0;
592
        sym.st_other = 0;
593
        sym.st_info = ELF_ST_INFO (app_regs [reg].bind, STT_REGISTER);
594
        sym.st_shndx = app_regs [reg].shndx;
595
        sym.st_target_internal = 0;
596
        if ((*func) (finfo, app_regs [reg].name, &sym,
597
                     sym.st_shndx == SHN_ABS
598
                     ? bfd_abs_section_ptr : bfd_und_section_ptr,
599
                     NULL) != 1)
600
          return FALSE;
601
      }
602
 
603
  return TRUE;
604
}
605
 
606
static int
607
elf64_sparc_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
608
{
609
  if (ELF_ST_TYPE (elf_sym->st_info) == STT_REGISTER)
610
    return STT_REGISTER;
611
  else
612
    return type;
613
}
614
 
615
/* A STB_GLOBAL,STT_REGISTER symbol should be BSF_GLOBAL
616
   even in SHN_UNDEF section.  */
617
 
618
static void
619
elf64_sparc_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
620
{
621
  elf_symbol_type *elfsym;
622
 
623
  elfsym = (elf_symbol_type *) asym;
624
  if (elfsym->internal_elf_sym.st_info
625
      == ELF_ST_INFO (STB_GLOBAL, STT_REGISTER))
626
    {
627
      asym->flags |= BSF_GLOBAL;
628
    }
629
}
630
 
631
 
632
/* Functions for dealing with the e_flags field.  */
633
 
634
/* Merge backend specific data from an object file to the output
635
   object file when linking.  */
636
 
637
static bfd_boolean
638
elf64_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
639
{
640
  bfd_boolean error;
641
  flagword new_flags, old_flags;
642
  int new_mm, old_mm;
643
 
644
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
645
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
646
    return TRUE;
647
 
648
  new_flags = elf_elfheader (ibfd)->e_flags;
649
  old_flags = elf_elfheader (obfd)->e_flags;
650
 
651
  if (!elf_flags_init (obfd))   /* First call, no flags set */
652
    {
653
      elf_flags_init (obfd) = TRUE;
654
      elf_elfheader (obfd)->e_flags = new_flags;
655
    }
656
 
657
  else if (new_flags == old_flags)      /* Compatible flags are ok */
658
    ;
659
 
660
  else                                  /* Incompatible flags */
661
    {
662
      error = FALSE;
663
 
664
#define EF_SPARC_ISA_EXTENSIONS \
665
  (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3 | EF_SPARC_HAL_R1)
666
 
667
      if ((ibfd->flags & DYNAMIC) != 0)
668
        {
669
          /* We don't want dynamic objects memory ordering and
670
             architecture to have any role. That's what dynamic linker
671
             should do.  */
672
          new_flags &= ~(EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS);
673
          new_flags |= (old_flags
674
                        & (EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS));
675
        }
676
      else
677
        {
678
          /* Choose the highest architecture requirements.  */
679
          old_flags |= (new_flags & EF_SPARC_ISA_EXTENSIONS);
680
          new_flags |= (old_flags & EF_SPARC_ISA_EXTENSIONS);
681
          if ((old_flags & (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3))
682
              && (old_flags & EF_SPARC_HAL_R1))
683
            {
684
              error = TRUE;
685
              (*_bfd_error_handler)
686
                (_("%B: linking UltraSPARC specific with HAL specific code"),
687
                 ibfd);
688
            }
689
          /* Choose the most restrictive memory ordering.  */
690
          old_mm = (old_flags & EF_SPARCV9_MM);
691
          new_mm = (new_flags & EF_SPARCV9_MM);
692
          old_flags &= ~EF_SPARCV9_MM;
693
          new_flags &= ~EF_SPARCV9_MM;
694
          if (new_mm < old_mm)
695
            old_mm = new_mm;
696
          old_flags |= old_mm;
697
          new_flags |= old_mm;
698
        }
699
 
700
      /* Warn about any other mismatches */
701
      if (new_flags != old_flags)
702
        {
703
          error = TRUE;
704
          (*_bfd_error_handler)
705
            (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
706
             ibfd, (long) new_flags, (long) old_flags);
707
        }
708
 
709
      elf_elfheader (obfd)->e_flags = old_flags;
710
 
711
      if (error)
712
        {
713
          bfd_set_error (bfd_error_bad_value);
714
          return FALSE;
715
        }
716
    }
717
  return TRUE;
718
}
719
 
720
/* MARCO: Set the correct entry size for the .stab section.  */
721
 
722
static bfd_boolean
723
elf64_sparc_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
724
                           Elf_Internal_Shdr *hdr ATTRIBUTE_UNUSED,
725
                           asection *sec)
726
{
727
  const char *name;
728
 
729
  name = bfd_get_section_name (abfd, sec);
730
 
731
  if (strcmp (name, ".stab") == 0)
732
    {
733
      /* Even in the 64bit case the stab entries are only 12 bytes long.  */
734
      elf_section_data (sec)->this_hdr.sh_entsize = 12;
735
    }
736
 
737
  return TRUE;
738
}
739
 
740
/* Print a STT_REGISTER symbol to file FILE.  */
741
 
742
static const char *
743
elf64_sparc_print_symbol_all (bfd *abfd ATTRIBUTE_UNUSED, PTR filep,
744
                              asymbol *symbol)
745
{
746
  FILE *file = (FILE *) filep;
747
  int reg, type;
748
 
749
  if (ELF_ST_TYPE (((elf_symbol_type *) symbol)->internal_elf_sym.st_info)
750
      != STT_REGISTER)
751
    return NULL;
752
 
753
  reg = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
754
  type = symbol->flags;
755
  fprintf (file, "REG_%c%c%11s%c%c    R", "GOLI" [reg / 8], '0' + (reg & 7), "",
756
                 ((type & BSF_LOCAL)
757
                  ? (type & BSF_GLOBAL) ? '!' : 'l'
758
                  : (type & BSF_GLOBAL) ? 'g' : ' '),
759
                 (type & BSF_WEAK) ? 'w' : ' ');
760
  if (symbol->name == NULL || symbol->name [0] == '\0')
761
    return "#scratch";
762
  else
763
    return symbol->name;
764
}
765
 
766
static enum elf_reloc_type_class
767
elf64_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
768
{
769
  switch ((int) ELF64_R_TYPE (rela->r_info))
770
    {
771
    case R_SPARC_RELATIVE:
772
      return reloc_class_relative;
773
    case R_SPARC_JMP_SLOT:
774
      return reloc_class_plt;
775
    case R_SPARC_COPY:
776
      return reloc_class_copy;
777
    default:
778
      return reloc_class_normal;
779
    }
780
}
781
 
782
/* Relocations in the 64 bit SPARC ELF ABI are more complex than in
783
   standard ELF, because R_SPARC_OLO10 has secondary addend in
784
   ELF64_R_TYPE_DATA field.  This structure is used to redirect the
785
   relocation handling routines.  */
786
 
787
const struct elf_size_info elf64_sparc_size_info =
788
{
789
  sizeof (Elf64_External_Ehdr),
790
  sizeof (Elf64_External_Phdr),
791
  sizeof (Elf64_External_Shdr),
792
  sizeof (Elf64_External_Rel),
793
  sizeof (Elf64_External_Rela),
794
  sizeof (Elf64_External_Sym),
795
  sizeof (Elf64_External_Dyn),
796
  sizeof (Elf_External_Note),
797
  4,            /* hash-table entry size.  */
798
  /* Internal relocations per external relocations.
799
     For link purposes we use just 1 internal per
800
     1 external, for assembly and slurp symbol table
801
     we use 2.  */
802
  1,
803
  64,           /* arch_size.  */
804
  3,            /* log_file_align.  */
805
  ELFCLASS64,
806
  EV_CURRENT,
807
  bfd_elf64_write_out_phdrs,
808
  bfd_elf64_write_shdrs_and_ehdr,
809
  bfd_elf64_checksum_contents,
810
  elf64_sparc_write_relocs,
811
  bfd_elf64_swap_symbol_in,
812
  bfd_elf64_swap_symbol_out,
813
  elf64_sparc_slurp_reloc_table,
814
  bfd_elf64_slurp_symbol_table,
815
  bfd_elf64_swap_dyn_in,
816
  bfd_elf64_swap_dyn_out,
817
  bfd_elf64_swap_reloc_in,
818
  bfd_elf64_swap_reloc_out,
819
  bfd_elf64_swap_reloca_in,
820
  bfd_elf64_swap_reloca_out
821
};
822
 
823
#define TARGET_BIG_SYM  bfd_elf64_sparc_vec
824
#define TARGET_BIG_NAME "elf64-sparc"
825
#define ELF_ARCH        bfd_arch_sparc
826
#define ELF_MAXPAGESIZE 0x100000
827
#define ELF_COMMONPAGESIZE 0x2000
828
 
829
/* This is the official ABI value.  */
830
#define ELF_MACHINE_CODE EM_SPARCV9
831
 
832
/* This is the value that we used before the ABI was released.  */
833
#define ELF_MACHINE_ALT1 EM_OLD_SPARCV9
834
 
835
#define elf_backend_reloc_type_class \
836
  elf64_sparc_reloc_type_class
837
#define bfd_elf64_get_reloc_upper_bound \
838
  elf64_sparc_get_reloc_upper_bound
839
#define bfd_elf64_get_dynamic_reloc_upper_bound \
840
  elf64_sparc_get_dynamic_reloc_upper_bound
841
#define bfd_elf64_canonicalize_reloc \
842
  elf64_sparc_canonicalize_reloc
843
#define bfd_elf64_canonicalize_dynamic_reloc \
844
  elf64_sparc_canonicalize_dynamic_reloc
845
#define elf_backend_add_symbol_hook \
846
  elf64_sparc_add_symbol_hook
847
#define elf_backend_get_symbol_type \
848
  elf64_sparc_get_symbol_type
849
#define elf_backend_symbol_processing \
850
  elf64_sparc_symbol_processing
851
#define elf_backend_print_symbol_all \
852
  elf64_sparc_print_symbol_all
853
#define elf_backend_output_arch_syms \
854
  elf64_sparc_output_arch_syms
855
#define bfd_elf64_bfd_merge_private_bfd_data \
856
  elf64_sparc_merge_private_bfd_data
857
#define elf_backend_fake_sections \
858
  elf64_sparc_fake_sections
859
#define elf_backend_size_info \
860
  elf64_sparc_size_info
861
 
862
#define elf_backend_plt_sym_val \
863
  _bfd_sparc_elf_plt_sym_val
864
#define bfd_elf64_bfd_link_hash_table_create \
865
  _bfd_sparc_elf_link_hash_table_create
866
#define bfd_elf64_bfd_link_hash_table_free \
867
  _bfd_sparc_elf_link_hash_table_free
868
#define elf_info_to_howto \
869
  _bfd_sparc_elf_info_to_howto
870
#define elf_backend_copy_indirect_symbol \
871
  _bfd_sparc_elf_copy_indirect_symbol
872
#define bfd_elf64_bfd_reloc_type_lookup \
873
  _bfd_sparc_elf_reloc_type_lookup
874
#define bfd_elf64_bfd_reloc_name_lookup \
875
  _bfd_sparc_elf_reloc_name_lookup
876
#define bfd_elf64_bfd_relax_section \
877
  _bfd_sparc_elf_relax_section
878
#define bfd_elf64_new_section_hook \
879
  _bfd_sparc_elf_new_section_hook
880
 
881
#define elf_backend_create_dynamic_sections \
882
  _bfd_sparc_elf_create_dynamic_sections
883
#define elf_backend_relocs_compatible \
884
  _bfd_elf_relocs_compatible
885
#define elf_backend_check_relocs \
886
  _bfd_sparc_elf_check_relocs
887
#define elf_backend_adjust_dynamic_symbol \
888
  _bfd_sparc_elf_adjust_dynamic_symbol
889
#define elf_backend_omit_section_dynsym \
890
  _bfd_sparc_elf_omit_section_dynsym
891
#define elf_backend_size_dynamic_sections \
892
  _bfd_sparc_elf_size_dynamic_sections
893
#define elf_backend_relocate_section \
894
  _bfd_sparc_elf_relocate_section
895
#define elf_backend_finish_dynamic_symbol \
896
  _bfd_sparc_elf_finish_dynamic_symbol
897
#define elf_backend_finish_dynamic_sections \
898
  _bfd_sparc_elf_finish_dynamic_sections
899
 
900
#define bfd_elf64_mkobject \
901
  _bfd_sparc_elf_mkobject
902
#define elf_backend_object_p \
903
  _bfd_sparc_elf_object_p
904
#define elf_backend_gc_mark_hook \
905
  _bfd_sparc_elf_gc_mark_hook
906
#define elf_backend_gc_sweep_hook \
907
  _bfd_sparc_elf_gc_sweep_hook
908
#define elf_backend_init_index_section \
909
  _bfd_elf_init_1_index_section
910
 
911
#define elf_backend_can_gc_sections 1
912
#define elf_backend_can_refcount 1
913
#define elf_backend_want_got_plt 0
914
#define elf_backend_plt_readonly 0
915
#define elf_backend_want_plt_sym 1
916
#define elf_backend_got_header_size 8
917
#define elf_backend_rela_normal 1
918
 
919
/* Section 5.2.4 of the ABI specifies a 256-byte boundary for the table.  */
920
#define elf_backend_plt_alignment 8
921
 
922
#define elf_backend_post_process_headers        _bfd_elf_set_osabi
923
 
924
#include "elf64-target.h"
925
 
926
/* FreeBSD support */
927
#undef  TARGET_BIG_SYM
928
#define TARGET_BIG_SYM bfd_elf64_sparc_freebsd_vec
929
#undef  TARGET_BIG_NAME
930
#define TARGET_BIG_NAME "elf64-sparc-freebsd"
931
#undef  ELF_OSABI
932
#define ELF_OSABI ELFOSABI_FREEBSD
933
 
934
#undef  elf64_bed
935
#define elf64_bed                               elf64_sparc_fbsd_bed
936
 
937
#include "elf64-target.h"
938
 
939
/* Solaris 2.  */
940
 
941
#undef  TARGET_BIG_SYM
942
#define TARGET_BIG_SYM                          bfd_elf64_sparc_sol2_vec
943
#undef  TARGET_BIG_NAME
944
#define TARGET_BIG_NAME                         "elf64-sparc-sol2"
945
 
946
/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
947
   objects won't be recognized.  */
948
#undef  ELF_OSABI
949
 
950
#undef elf64_bed
951
#define elf64_bed                               elf64_sparc_sol2_bed
952
 
953
/* The 64-bit static TLS arena size is rounded to the nearest 16-byte
954
   boundary.  */
955
#undef elf_backend_static_tls_alignment
956
#define elf_backend_static_tls_alignment        16
957
 
958
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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