/* Ubicom IP2xxx specific support for 32-bit ELF
- Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2012
- Free Software Foundation, Inc.
+ Copyright (C) 2000-2015 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
pr) /* pcrel_offset */
/* This reloc does nothing. */
- IP2K_HOWTO (R_IP2K_NONE, 0,2,32, FALSE, 0, "R_IP2K_NONE", 0, 0),
+ IP2K_HOWTO (R_IP2K_NONE, 0,3,0, FALSE, 0, "R_IP2K_NONE", 0, 0),
/* A 16 bit absolute relocation. */
IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff),
/* A 32 bit absolute relocation. */
{
bfd_byte code[4];
int table_index = 0;
-
+
/* Check current page-jmp. */
if (addr + 4 > sec->size)
return -1;
if ((! IS_PAGE_OPCODE (code + 0))
|| (! IS_JMP_OPCODE (code + 2)))
return -1;
-
+
/* Search back. */
while (1)
{
{
bfd_byte code[16];
int table_index = 0;
-
+
/* Check current page-jmp. */
if (addr + 4 > sec->size)
return -1;
if ((! IS_PAGE_OPCODE (code + 0))
|| (! IS_JMP_OPCODE (code + 2)))
return -1;
-
+
/* Search back. */
while (1)
{
&& (IS_INC_1SP_OPCODE (code + 12))
&& (IS_JMP_OPCODE (code + 14)))
return table_index;
-
+
if ((! IS_PAGE_OPCODE (code + 0))
|| (! IS_JMP_OPCODE (code + 2)))
return -1;
if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
{
asection *sym_sec;
-
+
/* A local symbol. */
isym = isymbuf + ELF32_R_SYM (irel->r_info);
sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-
+
if (sym_sec == sec)
{
const char *name;
bfd_vma baseaddr = BASEADDR (sec);
bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
+ irel->r_addend;
-
+
if ((baseaddr + addr) <= symval
&& symval <= (baseaddr + endaddr))
irel->r_addend += count;
/* Go hunt up a function and fix its line info if needed. */
- stabp = stabcontents + irel->r_offset - 8;
+ stabp = stabcontents + irel->r_offset - 8;
/* Go pullout the stab entry. */
type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
value = bfd_h_get_32 (abfd, stabp + VALOFF);
-
+
name = bfd_get_stab_name (type);
-
+
if (strcmp (name, "FUN") == 0)
{
int function_adjusted = 0;
{
/* Adjust the value. */
value += count;
-
+
/* We need to put it back. */
bfd_h_put_32 (abfd, value,stabp + VALOFF);
}
/* Delete the PAGE insn. */
if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
return FALSE;
-
+
/* Modified => will need to iterate relaxation again. */
*again = TRUE;
-
+
return TRUE;
}
Elf_Internal_Rela *ireltest = irel;
bfd_byte code[4];
bfd_vma addr;
-
+
/* Test all page instructions. */
addr = irel->r_offset;
while (1)
Elf_Internal_Rela *ireltest = irel;
bfd_byte code[12];
bfd_vma addr;
-
+
/* Test all page instructions. */
addr = irel->r_offset;
Elf_Internal_Rela *irel;
int switch_table_128;
int switch_table_256;
-
+
/* Walk thru the section looking for relaxation opportunities. */
for (irel = misc->irelbase; irel < irelend; irel++)
{
/* We don't have to do anything for a relocatable link,
if this section does not have relocs, or if this is
not a code section. */
- if (link_info->relocatable
+ if (bfd_link_relocatable (link_info)
|| (sec->flags & SEC_RELOC) == 0
|| sec->reloc_count == 0
|| (sec->flags & SEC_CODE) == 0)
unsigned int r_type;
r_type = ELF32_R_TYPE (dst->r_info);
+ if (r_type >= (unsigned int) R_IP2K_max)
+ {
+ _bfd_error_handler (_("%B: invalid IP2K reloc number: %d"), abfd, r_type);
+ r_type = 0;
+ }
cache_ptr->howto = & ip2k_elf_howto_table [r_type];
}
}
else
{
- bfd_boolean warned;
+ bfd_boolean warned, ignored;
bfd_boolean unresolved_reloc;
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);
name = h->root.root.string;
}
if (sec != NULL && discarded_section (sec))
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
- rel, relend, howto, contents);
+ rel, 1, relend, howto, 0, contents);
- if (info->relocatable)
+ if (bfd_link_relocatable (info))
continue;
/* Finally, the sole IP2K-specific part. */
return TRUE;
}
-#define TARGET_BIG_SYM bfd_elf32_ip2k_vec
+#define TARGET_BIG_SYM ip2k_elf32_vec
#define TARGET_BIG_NAME "elf32-ip2k"
#define ELF_ARCH bfd_arch_ip2k