/* Ubicom IP2xxx specific support for 32-bit ELF
- Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+ Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2012
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
bfd_byte *contents)
{
bfd_byte code[4];
- int index = 0;
-
+ 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)
{
ip2k_get_mem (abfd, contents + addr - 4, 4, code);
if ((IS_ADD_W_WREG_OPCODE (code + 0))
&& (IS_ADD_PCL_W_OPCODE (code + 2)))
- return index;
+ return table_index;
if ((! IS_PAGE_OPCODE (code + 0))
|| (! IS_JMP_OPCODE (code + 2)))
return -1;
- index++;
+ table_index++;
addr -= 4;
}
}
bfd_byte *contents)
{
bfd_byte code[16];
- int index = 0;
-
+ 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 + 10))
&& (IS_PAGE_OPCODE (code + 12))
&& (IS_JMP_OPCODE (code + 14)))
- return index;
+ return table_index;
if ((IS_ADD_W_WREG_OPCODE (code + 2))
&& (IS_SNC_OPCODE (code + 4))
&& (IS_SNC_OPCODE (code + 10))
&& (IS_INC_1SP_OPCODE (code + 12))
&& (IS_JMP_OPCODE (code + 14)))
- return index;
-
+ return table_index;
+
if ((! IS_PAGE_OPCODE (code + 0))
|| (! IS_JMP_OPCODE (code + 2)))
return -1;
- index++;
+ table_index++;
addr -= 4;
}
}
Elf_Internal_Shdr *symtab_hdr;
Elf_Internal_Sym *isymbuf, *isym, *isymend;
unsigned int shndx;
- bfd_byte *contents;
Elf_Internal_Rela *irel, *irelend, *irelbase;
struct elf_link_hash_entry **sym_hashes;
struct elf_link_hash_entry **end_hashes;
shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
- contents = elf_section_data (sec)->this_hdr.contents;
-
irelbase = elf_section_data (sec)->relocs;
irelend = irelbase + sec->reloc_count;
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;
- unsigned long strx;
- unsigned char type, other;
- unsigned short desc;
+ unsigned char type;
bfd_vma value;
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. */
- strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
- other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
- desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
value = bfd_h_get_32 (abfd, stabp + VALOFF);
-
+
name = bfd_get_stab_name (type);
-
+
if (strcmp (name, "FUN") == 0)
{
int function_adjusted = 0;
for (;stabp < stabend; stabp += STABSIZE)
{
/* Go pullout the stab entry. */
- strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
- other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
- desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
value = bfd_h_get_32 (abfd, stabp + VALOFF);
name = bfd_get_stab_name (type);
{
/* 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++)
{
static bfd_boolean new_pass = FALSE;
static bfd_boolean changed = FALSE;
struct misc misc;
- asection *stab;
/* Assume nothing changes. */
*again = FALSE;
if (internal_relocs == NULL)
goto error_return;
- /* Make sure the stac.rela stuff gets read in. */
- stab = bfd_get_section_by_name (abfd, ".stab");
-
- if (stab)
- {
- /* So stab does exits. */
- Elf_Internal_Rela * irelbase;
-
- irelbase = _bfd_elf_link_read_relocs (abfd, stab, NULL, NULL,
- link_info->keep_memory);
- }
-
/* Get section contents cached copy if it exists. */
if (contents == NULL)
{
r_type = ELF32_R_TYPE (rel->r_info);
r_symndx = ELF32_R_SYM (rel->r_info);
- howto = ip2k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
+ howto = ip2k_elf_howto_table + r_type;
h = NULL;
sym = NULL;
sec = NULL;
}
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 && elf_discarded_section (sec))
- {
- /* For relocs against symbols from removed linkonce sections,
- or sections discarded by a linker script, we just want the
- section contents zeroed. Avoid any special processing. */
- _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
- rel->r_info = 0;
- rel->r_addend = 0;
- continue;
- }
+ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, 1, relend, howto, 0, contents);
if (info->relocatable)
continue;