/* TILE-Gx-specific support for ELF.
- Copyright 2011, 2012 Free Software Foundation, Inc.
+ Copyright 2011, 2012, 2013 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
};
/* Reuse an existing info 10 bundle. */
-static const bfd_byte const *tilegx64_plt_tail_entry =
+static const bfd_byte *const tilegx64_plt_tail_entry =
&tilegx64_short_plt_entry[4 * TILEGX_BUNDLE_SIZE_IN_BYTES];
static const bfd_byte
};
/* Reuse an existing info 10 bundle. */
-static const bfd_byte const *tilegx32_plt_tail_entry =
+static const bfd_byte *const tilegx32_plt_tail_entry =
&tilegx64_short_plt_entry[4 * TILEGX_BUNDLE_SIZE_IN_BYTES];
static int
while (h->root.type == bfd_link_hash_indirect
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ /* PR15323, ref flags aren't set for references in the same
+ object. */
+ h->root.non_ir_ref = 1;
}
r_type = tilegx_elf_tls_transition (info, r_type, h == NULL,
if (h != NULL)
{
switch (TILEGX_ELF_R_TYPE (rel->r_info))
- {
- case R_TILEGX_GNU_VTINHERIT:
- case R_TILEGX_GNU_VTENTRY:
- break;
- }
+ {
+ case R_TILEGX_GNU_VTINHERIT:
+ case R_TILEGX_GNU_VTENTRY:
+ return NULL;
+ }
+ }
+
+ /* FIXME: The test here, in check_relocs and in relocate_section
+ dealing with TLS optimization, ought to be !info->executable. */
+ if (info->shared)
+ {
+ switch (TILEGX_ELF_R_TYPE (rel->r_info))
+ {
+ case R_TILEGX_TLS_GD_CALL:
+ /* This reloc implicitly references __tls_get_addr. We know
+ another reloc will reference the same symbol as the one
+ on this reloc, so the real symbol and section will be
+ gc marked when processing the other reloc. That lets
+ us handle __tls_get_addr here. */
+ h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
+ FALSE, FALSE, TRUE);
+ BFD_ASSERT (h != NULL);
+ h->mark = 1;
+ if (h->u.weakdef != NULL)
+ h->u.weakdef->mark = 1;
+ sym = NULL;
+ }
}
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
/* Mask to extract the bits corresponding to an instruction in a
specific pipe of a bundle, minus the destination operand and the
first source operand. */
-static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
+static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00
};
}
else
{
- bfd_boolean warned;
+ bfd_boolean warned ATTRIBUTE_UNUSED;
+ bfd_boolean ignored ATTRIBUTE_UNUSED;
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
- unresolved_reloc, warned);
+ unresolved_reloc, warned, ignored);
if (warned)
{
/* To avoid generating warning messages about truncated
local_got_offsets[r_symndx] |= 1;
}
}
- relocation = off;
+ relocation = off - got_base;
break;
case R_TILEGX_JUMPOFF_X1_PLT:
if (off >= (bfd_vma) -2)
abort ();
- relocation = off;
+ relocation = off - got_base;
unresolved_reloc = FALSE;
howto = tilegx_elf_howto_table + r_type;
break;
}
enum elf_reloc_type_class
-tilegx_reloc_type_class (const Elf_Internal_Rela *rela)
+tilegx_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
+ const asection *rel_sec ATTRIBUTE_UNUSED,
+ const Elf_Internal_Rela *rela)
{
switch ((int) TILEGX_ELF_R_TYPE (rela->r_info))
{