/* BFD back-end for National Semiconductor's CRX ELF
- Copyright 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright 2004, 2005, 2006, 2007, 2009, 2010, 2012
+ Free Software Foundation, Inc.
Written by Tomer Levi, NSC, Israel.
This file is part of BFD, the Binary File Descriptor library.
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
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
#include "sysdep.h"
#include "bfd.h"
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REL4", /* name */
FALSE, /* partial_inplace */
- 0xf, /* src_mask */
+ 0x0, /* src_mask */
0xf, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REL8", /* name */
FALSE, /* partial_inplace */
- 0xff, /* src_mask */
+ 0x0, /* src_mask */
0xff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REL8_CMP", /* name */
FALSE, /* partial_inplace */
- 0xff, /* src_mask */
+ 0x0, /* src_mask */
0xff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REL16", /* name */
FALSE, /* partial_inplace */
- 0xffff, /* src_mask */
+ 0x0, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REL24", /* name */
FALSE, /* partial_inplace */
- 0xffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REL32", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REGREL12", /* name */
FALSE, /* partial_inplace */
- 0xfff, /* src_mask */
+ 0x0, /* src_mask */
0xfff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REGREL22", /* name */
FALSE, /* partial_inplace */
- 0x3fffff, /* src_mask */
+ 0x0, /* src_mask */
0x3fffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REGREL28", /* name */
FALSE, /* partial_inplace */
- 0xfffffff, /* src_mask */
+ 0x0, /* src_mask */
0xfffffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_REGREL32", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_ABS16", /* name */
FALSE, /* partial_inplace */
- 0xffff, /* src_mask */
+ 0x0, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_ABS32", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_NUM8", /* name */
FALSE, /* partial_inplace */
- 0xff, /* src_mask */
+ 0x0, /* src_mask */
0xff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_NUM16", /* name */
FALSE, /* partial_inplace */
- 0xffff, /* src_mask */
+ 0x0, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_NUM32", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_IMM16", /* name */
FALSE, /* partial_inplace */
- 0xffff, /* src_mask */
+ 0x0, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_IMM32", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
-
+
/* An 8 bit switch table entry. This is generated for an expression
such as ``.byte L1 - L2''. The offset holds the difference
between the reloc address and L2. */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_SWITCH8", /* name */
FALSE, /* partial_inplace */
- 0xff, /* src_mask */
+ 0x0, /* src_mask */
0xff, /* dst_mask */
TRUE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_SWITCH16", /* name */
FALSE, /* partial_inplace */
- 0xffff, /* src_mask */
+ 0x0, /* src_mask */
0xffff, /* dst_mask */
TRUE), /* pcrel_offset */
bfd_elf_generic_reloc, /* special_function */
"R_CRX_SWITCH32", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
+ 0x0, /* src_mask */
0xffffffff, /* dst_mask */
TRUE) /* pcrel_offset */
};
case R_CRX_SWITCH8:
case R_CRX_SWITCH16:
case R_CRX_SWITCH32:
- /* We only care about the addend, where the difference between
+ /* We only care about the addend, where the difference between
expressions is kept. */
Rvalue = 0;
-
+
default:
break;
}
/* Delete some bytes from a section while relaxing. */
static bfd_boolean
-elf32_crx_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
+elf32_crx_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
asection *sec, bfd_vma addr, int count)
{
Elf_Internal_Shdr *symtab_hdr;
unsigned int sec_shndx;
bfd_byte *contents;
Elf_Internal_Rela *irel, *irelend;
- Elf_Internal_Rela *irelalign;
bfd_vma toaddr;
Elf_Internal_Sym *isym;
Elf_Internal_Sym *isymend;
contents = elf_section_data (sec)->this_hdr.contents;
- /* The deletion must stop at the next ALIGN reloc for an aligment
- power larger than the number of bytes we are deleting. */
-
- irelalign = NULL;
toaddr = sec->size;
irel = elf_section_data (sec)->relocs;
&& isym->st_value > addr
&& isym->st_value < toaddr)
{
- /* Adjust the addend of SWITCH relocations in this section,
+ /* Adjust the addend of SWITCH relocations in this section,
which reference this local symbol. */
for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
{
{
struct elf_link_hash_entry *sym_hash = *sym_hashes;
- /* The '--wrap SYMBOL' option is causing a pain when the object file,
- containing the definition of __wrap_SYMBOL, includes a direct
- call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
- the same symbol (which is __wrap_SYMBOL), but still exist as two
- different symbols in 'sym_hashes', we don't want to adjust
- the global symbol __wrap_SYMBOL twice.
+ /* The '--wrap SYMBOL' option is causing a pain when the object file,
+ containing the definition of __wrap_SYMBOL, includes a direct
+ call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
+ the same symbol (which is __wrap_SYMBOL), but still exist as two
+ different symbols in 'sym_hashes', we don't want to adjust
+ the global symbol __wrap_SYMBOL twice.
This check is only relevant when symbols are being wrapped. */
if (link_info->wrap_hash != NULL)
{
struct elf_link_hash_entry **cur_sym_hashes;
-
+
/* Loop only over the symbols whom been already checked. */
- for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
+ for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
cur_sym_hashes++)
{
- /* If the current symbol is identical to 'sym_hash', that means
+ /* If the current symbol is identical to 'sym_hash', that means
the symbol was already adjusted (or at least checked). */
if (*cur_sym_hashes == sym_hash)
break;
bfd_size_type amt;
internal_relocs = (_bfd_elf_link_read_relocs
- (input_bfd, input_section, (PTR) NULL,
+ (input_bfd, input_section, NULL,
(Elf_Internal_Rela *) NULL, FALSE));
if (internal_relocs == NULL)
goto error_return;
}
else
{
- bfd_boolean unresolved_reloc, warned;
+ bfd_boolean unresolved_reloc, warned, ignored;
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 (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;
/* Get a copy of the native relocations. */
internal_relocs = (_bfd_elf_link_read_relocs
- (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
+ (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
link_info->keep_memory));
if (internal_relocs == NULL)
goto error_return;