Line 1... |
Line 1... |
/* SPARC-specific support for ELF
|
/* SPARC-specific support for ELF
|
Copyright 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
Copyright 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
Line 256... |
Line 256... |
HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD32",FALSE,0,0x00000000,TRUE),
|
HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD32",FALSE,0,0x00000000,TRUE),
|
HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD64",FALSE,0,0x00000000,TRUE),
|
HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD64",FALSE,0,0x00000000,TRUE),
|
HOWTO(R_SPARC_TLS_DTPOFF32,0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",FALSE,0,0xffffffff,TRUE),
|
HOWTO(R_SPARC_TLS_DTPOFF32,0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",FALSE,0,0xffffffff,TRUE),
|
HOWTO(R_SPARC_TLS_DTPOFF64,0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF64",FALSE,0,MINUS_ONE,TRUE),
|
HOWTO(R_SPARC_TLS_DTPOFF64,0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF64",FALSE,0,MINUS_ONE,TRUE),
|
HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF32",FALSE,0,0x00000000,TRUE),
|
HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF32",FALSE,0,0x00000000,TRUE),
|
HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF64",FALSE,0,0x00000000,TRUE)
|
HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF64",FALSE,0,0x00000000,TRUE),
|
|
HOWTO(R_SPARC_GOTDATA_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_HIX22",FALSE,0,0x003fffff, FALSE),
|
|
HOWTO(R_SPARC_GOTDATA_LOX10,0,2,0,FALSE,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_GOTDATA_LOX10",FALSE,0,0x000003ff, FALSE),
|
|
HOWTO(R_SPARC_GOTDATA_OP_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_OP_HIX22",FALSE,0,0x003fffff, FALSE),
|
|
HOWTO(R_SPARC_GOTDATA_OP_LOX10,0,2,0,FALSE,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_GOTDATA_OP_LOX10",FALSE,0,0x000003ff, FALSE),
|
|
HOWTO(R_SPARC_GOTDATA_OP,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOTDATA_OP",FALSE,0,0x00000000,TRUE),
|
};
|
};
|
static reloc_howto_type sparc_vtinherit_howto =
|
static reloc_howto_type sparc_vtinherit_howto =
|
HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", FALSE,0, 0, FALSE);
|
HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", FALSE,0, 0, FALSE);
|
static reloc_howto_type sparc_vtentry_howto =
|
static reloc_howto_type sparc_vtentry_howto =
|
HOWTO (R_SPARC_GNU_VTENTRY, 0,2,0,FALSE,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_SPARC_GNU_VTENTRY", FALSE,0,0, FALSE);
|
HOWTO (R_SPARC_GNU_VTENTRY, 0,2,0,FALSE,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_SPARC_GNU_VTENTRY", FALSE,0,0, FALSE);
|
Line 347... |
Line 352... |
{ BFD_RELOC_SPARC_HIX22, R_SPARC_HIX22 },
|
{ BFD_RELOC_SPARC_HIX22, R_SPARC_HIX22 },
|
{ BFD_RELOC_SPARC_LOX10, R_SPARC_LOX10 },
|
{ BFD_RELOC_SPARC_LOX10, R_SPARC_LOX10 },
|
{ BFD_RELOC_SPARC_H44, R_SPARC_H44 },
|
{ BFD_RELOC_SPARC_H44, R_SPARC_H44 },
|
{ BFD_RELOC_SPARC_M44, R_SPARC_M44 },
|
{ BFD_RELOC_SPARC_M44, R_SPARC_M44 },
|
{ BFD_RELOC_SPARC_L44, R_SPARC_L44 },
|
{ BFD_RELOC_SPARC_L44, R_SPARC_L44 },
|
|
{ BFD_RELOC_SPARC_GOTDATA_HIX22, R_SPARC_GOTDATA_HIX22 },
|
|
{ BFD_RELOC_SPARC_GOTDATA_LOX10, R_SPARC_GOTDATA_LOX10 },
|
|
{ BFD_RELOC_SPARC_GOTDATA_OP_HIX22, R_SPARC_GOTDATA_OP_HIX22 },
|
|
{ BFD_RELOC_SPARC_GOTDATA_OP_LOX10, R_SPARC_GOTDATA_OP_LOX10 },
|
|
{ BFD_RELOC_SPARC_GOTDATA_OP, R_SPARC_GOTDATA_OP },
|
{ BFD_RELOC_SPARC_REGISTER, R_SPARC_REGISTER },
|
{ BFD_RELOC_SPARC_REGISTER, R_SPARC_REGISTER },
|
{ BFD_RELOC_VTABLE_INHERIT, R_SPARC_GNU_VTINHERIT },
|
{ BFD_RELOC_VTABLE_INHERIT, R_SPARC_GNU_VTINHERIT },
|
{ BFD_RELOC_VTABLE_ENTRY, R_SPARC_GNU_VTENTRY },
|
{ BFD_RELOC_VTABLE_ENTRY, R_SPARC_GNU_VTENTRY },
|
{ BFD_RELOC_SPARC_REV32, R_SPARC_REV32 },
|
{ BFD_RELOC_SPARC_REV32, R_SPARC_REV32 },
|
};
|
};
|
Line 887... |
Line 897... |
|
|
htab = _bfd_sparc_elf_hash_table (info);
|
htab = _bfd_sparc_elf_hash_table (info);
|
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
|
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
|
BFD_ASSERT (htab->sgot != NULL);
|
BFD_ASSERT (htab->sgot != NULL);
|
|
|
htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
|
htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
|
SEC_ALLOC
|
|
| SEC_LOAD
|
|
| SEC_HAS_CONTENTS
|
|
| SEC_IN_MEMORY
|
|
| SEC_LINKER_CREATED
|
|
| SEC_READONLY);
|
|
if (htab->srelgot == NULL
|
if (htab->srelgot == NULL
|
|| ! bfd_set_section_alignment (dynobj, htab->srelgot,
|
|| ! bfd_set_section_alignment (dynobj, htab->srelgot,
|
htab->word_align_power))
|
htab->word_align_power))
|
return FALSE;
|
return FALSE;
|
|
|
Line 1176... |
Line 1180... |
/* Fall through */
|
/* Fall through */
|
|
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT22:
|
case R_SPARC_GOT22:
|
|
case R_SPARC_GOTDATA_HIX22:
|
|
case R_SPARC_GOTDATA_LOX10:
|
|
case R_SPARC_GOTDATA_OP_HIX22:
|
|
case R_SPARC_GOTDATA_OP_LOX10:
|
case R_SPARC_TLS_GD_HI22:
|
case R_SPARC_TLS_GD_HI22:
|
case R_SPARC_TLS_GD_LO10:
|
case R_SPARC_TLS_GD_LO10:
|
/* This symbol requires a global offset table entry. */
|
/* This symbol requires a global offset table entry. */
|
{
|
{
|
int tls_type, old_tls_type;
|
int tls_type, old_tls_type;
|
Line 1188... |
Line 1196... |
{
|
{
|
default:
|
default:
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT22:
|
case R_SPARC_GOT22:
|
|
case R_SPARC_GOTDATA_HIX22:
|
|
case R_SPARC_GOTDATA_LOX10:
|
|
case R_SPARC_GOTDATA_OP_HIX22:
|
|
case R_SPARC_GOTDATA_OP_LOX10:
|
tls_type = GOT_NORMAL;
|
tls_type = GOT_NORMAL;
|
break;
|
break;
|
case R_SPARC_TLS_GD_HI22:
|
case R_SPARC_TLS_GD_HI22:
|
case R_SPARC_TLS_GD_LO10:
|
case R_SPARC_TLS_GD_LO10:
|
tls_type = GOT_TLS_GD;
|
tls_type = GOT_TLS_GD;
|
Line 1309... |
Line 1321... |
it as WDISP30. */
|
it as WDISP30. */
|
if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
|
if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
|
goto r_sparc_plt32;
|
goto r_sparc_plt32;
|
break;
|
break;
|
}
|
}
|
|
/* PR 7027: We need similar behaviour for 64-bit binaries. */
|
|
else if (r_type == R_SPARC_WPLT30)
|
|
break;
|
|
|
/* It does not make sense to have a procedure linkage
|
/* It does not make sense to have a procedure linkage
|
table entry for a local symbol. */
|
table entry for a local symbol. */
|
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
return FALSE;
|
return FALSE;
|
Line 1428... |
Line 1443... |
/* When creating a shared object, we must copy these
|
/* When creating a shared object, we must copy these
|
relocs into the output file. We create a reloc
|
relocs into the output file. We create a reloc
|
section in dynobj and make room for the reloc. */
|
section in dynobj and make room for the reloc. */
|
if (sreloc == NULL)
|
if (sreloc == NULL)
|
{
|
{
|
const char *name;
|
|
bfd *dynobj;
|
|
|
|
name = (bfd_elf_string_from_elf_section
|
|
(abfd,
|
|
elf_elfheader (abfd)->e_shstrndx,
|
|
elf_section_data (sec)->rel_hdr.sh_name));
|
|
if (name == NULL)
|
|
return FALSE;
|
|
|
|
BFD_ASSERT (CONST_STRNEQ (name, ".rela")
|
|
&& strcmp (bfd_get_section_name (abfd, sec),
|
|
name + 5) == 0);
|
|
|
|
if (htab->elf.dynobj == NULL)
|
if (htab->elf.dynobj == NULL)
|
htab->elf.dynobj = abfd;
|
htab->elf.dynobj = abfd;
|
dynobj = htab->elf.dynobj;
|
|
|
|
sreloc = bfd_get_section_by_name (dynobj, name);
|
sreloc = _bfd_elf_make_dynamic_reloc_section
|
if (sreloc == NULL)
|
(sec, htab->elf.dynobj, htab->word_align_power,
|
{
|
abfd, /*rela?*/ TRUE);
|
flagword flags;
|
|
|
|
flags = (SEC_HAS_CONTENTS | SEC_READONLY
|
if (sreloc == NULL)
|
| SEC_IN_MEMORY | SEC_LINKER_CREATED);
|
|
if ((sec->flags & SEC_ALLOC) != 0)
|
|
flags |= SEC_ALLOC | SEC_LOAD;
|
|
sreloc = bfd_make_section_with_flags (dynobj,
|
|
name,
|
|
flags);
|
|
if (sreloc == NULL
|
|
|| ! bfd_set_section_alignment (dynobj, sreloc,
|
|
htab->word_align_power))
|
|
return FALSE;
|
return FALSE;
|
}
|
}
|
elf_section_data (sec)->sreloc = sreloc;
|
|
}
|
|
|
|
/* If this is a global symbol, we count the number of
|
/* If this is a global symbol, we count the number of
|
relocations we need for this symbol. */
|
relocations we need for this symbol. */
|
if (h != NULL)
|
if (h != NULL)
|
head = &((struct _bfd_sparc_elf_link_hash_entry *) h)->dyn_relocs;
|
head = &((struct _bfd_sparc_elf_link_hash_entry *) h)->dyn_relocs;
|
else
|
else
|
{
|
{
|
/* Track dynamic relocs needed for local syms too.
|
/* Track dynamic relocs needed for local syms too.
|
We really need local syms available to do this
|
We really need local syms available to do this
|
easily. Oh well. */
|
easily. Oh well. */
|
|
|
asection *s;
|
asection *s;
|
void *vpp;
|
void *vpp;
|
|
Elf_Internal_Sym *isym;
|
|
|
s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
|
isym = bfd_sym_from_r_symndx (&htab->sym_cache,
|
sec, r_symndx);
|
abfd, r_symndx);
|
if (s == NULL)
|
if (isym == NULL)
|
return FALSE;
|
return FALSE;
|
|
|
|
s = bfd_section_from_elf_index (abfd, isym->st_shndx);
|
|
if (s == NULL)
|
|
s = sec;
|
|
|
vpp = &elf_section_data (s)->local_dynrel;
|
vpp = &elf_section_data (s)->local_dynrel;
|
head = (struct _bfd_sparc_elf_dyn_relocs **) vpp;
|
head = (struct _bfd_sparc_elf_dyn_relocs **) vpp;
|
}
|
}
|
|
|
p = *head;
|
p = *head;
|
Line 1620... |
Line 1612... |
case R_SPARC_TLS_IE_HI22:
|
case R_SPARC_TLS_IE_HI22:
|
case R_SPARC_TLS_IE_LO10:
|
case R_SPARC_TLS_IE_LO10:
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT22:
|
case R_SPARC_GOT22:
|
|
case R_SPARC_GOTDATA_HIX22:
|
|
case R_SPARC_GOTDATA_LOX10:
|
|
case R_SPARC_GOTDATA_OP_HIX22:
|
|
case R_SPARC_GOTDATA_OP_LOX10:
|
if (h != NULL)
|
if (h != NULL)
|
{
|
{
|
if (h->got.refcount > 0)
|
if (h->got.refcount > 0)
|
h->got.refcount--;
|
h->got.refcount--;
|
}
|
}
|
Line 2014... |
Line 2010... |
else
|
else
|
pp = &p->next;
|
pp = &p->next;
|
}
|
}
|
}
|
}
|
|
|
|
if (htab->is_vxworks)
|
|
{
|
|
struct _bfd_sparc_elf_dyn_relocs **pp;
|
|
|
|
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
|
|
{
|
|
if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
|
|
*pp = p->next;
|
|
else
|
|
pp = &p->next;
|
|
}
|
|
}
|
|
|
/* Also discard relocs on undefined weak syms with non-default
|
/* Also discard relocs on undefined weak syms with non-default
|
visibility. */
|
visibility. */
|
if (eh->dyn_relocs != NULL
|
if (eh->dyn_relocs != NULL
|
&& h->root.type == bfd_link_hash_undefweak)
|
&& h->root.type == bfd_link_hash_undefweak)
|
{
|
{
|
Line 2176... |
Line 2185... |
/* Input section has been discarded, either because
|
/* Input section has been discarded, either because
|
it is a copy of a linkonce section or due to
|
it is a copy of a linkonce section or due to
|
linker script /DISCARD/, so we'll be discarding
|
linker script /DISCARD/, so we'll be discarding
|
the relocs too. */
|
the relocs too. */
|
}
|
}
|
|
else if (htab->is_vxworks
|
|
&& strcmp (p->sec->output_section->name,
|
|
".tls_vars") == 0)
|
|
{
|
|
/* Relocations in vxworks .tls_vars sections are
|
|
handled specially by the loader. */
|
|
}
|
else if (p->count != 0)
|
else if (p->count != 0)
|
{
|
{
|
srel = elf_section_data (p->sec)->sreloc;
|
srel = elf_section_data (p->sec)->sreloc;
|
srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
|
srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
|
if ((p->sec->output_section->flags & SEC_READONLY) != 0)
|
if ((p->sec->output_section->flags & SEC_READONLY) != 0)
|
Line 2433... |
Line 2449... |
_bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
|
_bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
|
struct bfd_section *section,
|
struct bfd_section *section,
|
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
|
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
|
bfd_boolean *again)
|
bfd_boolean *again)
|
{
|
{
|
|
if (link_info->relocatable)
|
|
(*link_info->callbacks->einfo)
|
|
(_("%P%F: --relax and -r may not be used together\n"));
|
|
|
*again = FALSE;
|
*again = FALSE;
|
sec_do_relax (section) = 1;
|
sec_do_relax (section) = 1;
|
return TRUE;
|
return TRUE;
|
}
|
}
|
|
|
Line 2486... |
Line 2506... |
bfd_vma got_base;
|
bfd_vma got_base;
|
asection *sreloc;
|
asection *sreloc;
|
Elf_Internal_Rela *rel;
|
Elf_Internal_Rela *rel;
|
Elf_Internal_Rela *relend;
|
Elf_Internal_Rela *relend;
|
int num_relocs;
|
int num_relocs;
|
|
bfd_boolean is_vxworks_tls;
|
|
|
htab = _bfd_sparc_elf_hash_table (info);
|
htab = _bfd_sparc_elf_hash_table (info);
|
symtab_hdr = &elf_symtab_hdr (input_bfd);
|
symtab_hdr = &elf_symtab_hdr (input_bfd);
|
sym_hashes = elf_sym_hashes (input_bfd);
|
sym_hashes = elf_sym_hashes (input_bfd);
|
local_got_offsets = elf_local_got_offsets (input_bfd);
|
local_got_offsets = elf_local_got_offsets (input_bfd);
|
Line 2498... |
Line 2519... |
got_base = 0;
|
got_base = 0;
|
else
|
else
|
got_base = elf_hash_table (info)->hgot->root.u.def.value;
|
got_base = elf_hash_table (info)->hgot->root.u.def.value;
|
|
|
sreloc = elf_section_data (input_section)->sreloc;
|
sreloc = elf_section_data (input_section)->sreloc;
|
|
/* We have to handle relocations in vxworks .tls_vars sections
|
|
specially, because the dynamic loader is 'weird'. */
|
|
is_vxworks_tls = (htab->is_vxworks && info->shared
|
|
&& !strcmp (input_section->output_section->name,
|
|
".tls_vars"));
|
|
|
rel = relocs;
|
rel = relocs;
|
if (ABI_64_P (output_bfd))
|
if (ABI_64_P (output_bfd))
|
num_relocs = NUM_SHDR_ENTRIES (& elf_section_data (input_section)->rel_hdr);
|
num_relocs = NUM_SHDR_ENTRIES (& elf_section_data (input_section)->rel_hdr);
|
else
|
else
|
Line 2578... |
Line 2604... |
if (info->relocatable)
|
if (info->relocatable)
|
continue;
|
continue;
|
|
|
switch (r_type)
|
switch (r_type)
|
{
|
{
|
|
case R_SPARC_GOTDATA_HIX22:
|
|
case R_SPARC_GOTDATA_LOX10:
|
|
case R_SPARC_GOTDATA_OP_HIX22:
|
|
case R_SPARC_GOTDATA_OP_LOX10:
|
|
/* We don't support these code transformation optimizations
|
|
yet, so just leave the sequence alone and treat as
|
|
GOT22/GOT10. */
|
|
if (r_type == R_SPARC_GOTDATA_HIX22
|
|
|| r_type == R_SPARC_GOTDATA_OP_HIX22)
|
|
r_type = R_SPARC_GOT22;
|
|
else
|
|
r_type = R_SPARC_GOT10;
|
|
/* Fall through. */
|
|
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT10:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT13:
|
case R_SPARC_GOT22:
|
case R_SPARC_GOT22:
|
/* Relocation is to the entry for this symbol in the global
|
/* Relocation is to the entry for this symbol in the global
|
offset table. */
|
offset table. */
|
Line 2696... |
Line 2736... |
section to another when using -K pic. We treat it as
|
section to another when using -K pic. We treat it as
|
WDISP30. */
|
WDISP30. */
|
if (h == NULL)
|
if (h == NULL)
|
break;
|
break;
|
}
|
}
|
|
/* PR 7027: We need similar behaviour for 64-bit binaries. */
|
|
else if (r_type == R_SPARC_WPLT30 && h == NULL)
|
|
break;
|
else
|
else
|
{
|
{
|
BFD_ASSERT (h != NULL);
|
BFD_ASSERT (h != NULL);
|
}
|
}
|
|
|
Line 2764... |
Line 2807... |
case R_SPARC_H44:
|
case R_SPARC_H44:
|
case R_SPARC_M44:
|
case R_SPARC_M44:
|
case R_SPARC_L44:
|
case R_SPARC_L44:
|
case R_SPARC_UA64:
|
case R_SPARC_UA64:
|
r_sparc_plt32:
|
r_sparc_plt32:
|
if ((input_section->flags & SEC_ALLOC) == 0)
|
if ((input_section->flags & SEC_ALLOC) == 0
|
|
|| is_vxworks_tls)
|
break;
|
break;
|
|
|
if ((info->shared
|
if ((info->shared
|
&& (h == NULL
|
&& (h == NULL
|
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
Line 3227... |
Line 3271... |
insn = (insn & ~0x7c000) | 0x1c000;
|
insn = (insn & ~0x7c000) | 0x1c000;
|
bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
|
bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
|
}
|
}
|
continue;
|
continue;
|
|
|
|
case R_SPARC_GOTDATA_OP:
|
|
/* We don't support gotdata code transformation optimizations
|
|
yet, so simply leave the sequence as-is. */
|
|
continue;
|
|
|
case R_SPARC_TLS_IE_LD:
|
case R_SPARC_TLS_IE_LD:
|
case R_SPARC_TLS_IE_LDX:
|
case R_SPARC_TLS_IE_LDX:
|
if (! info->shared && (h == NULL || h->dynindx == -1))
|
if (! info->shared && (h == NULL || h->dynindx == -1))
|
{
|
{
|
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
|