/* M16C/M32C specific support for 32-bit ELF.
- Copyright (C) 2005, 2006, 2007
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
}
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;
- }
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
if (info->relocatable)
{
_bfd_elf_print_private_bfd_data (abfd, ptr);
flags = elf_elfheader (abfd)->e_flags;
- fprintf (file, _("private flags = 0x%lx:"), (long)flags);
+ fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
switch (flags & EF_M32C_CPU_MASK)
{
{
struct relax_plt_data *data = (struct relax_plt_data *) xdata;
- if (h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
if (h->plt.offset != (bfd_vma) -1)
{
bfd_vma address;
{
bfd_vma *entry = (bfd_vma *) xdata;
- if (h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
if (h->plt.offset != (bfd_vma) -1)
{
h->plt.offset = *entry;
m32c_offset_for_reloc (bfd *abfd,
Elf_Internal_Rela *rel,
Elf_Internal_Shdr *symtab_hdr,
- Elf_External_Sym_Shndx *shndx_buf,
+ Elf_External_Sym_Shndx *shndx_buf ATTRIBUTE_UNUSED,
Elf_Internal_Sym *intsyms)
{
bfd_vma symval;
{
/* A local symbol. */
Elf_Internal_Sym *isym;
- Elf_External_Sym_Shndx *shndx;
asection *ssec;
-
isym = intsyms + ELF32_R_SYM (rel->r_info);
ssec = bfd_section_from_elf_index (abfd, isym->st_shndx);
- shndx = shndx_buf + (shndx_buf ? ELF32_R_SYM (rel->r_info) : 0);
-
symval = isym->st_value;
if (ssec)
symval += ssec->output_section->vma
bfd_byte *contents;
Elf_Internal_Rela *irel;
Elf_Internal_Rela *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;
for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
{
-
+ /* If the symbol is in the range of memory we just moved, we
+ have to adjust its value. */
if ((int) isym->st_shndx == sec_shndx
&& isym->st_value > addr
&& isym->st_value < toaddr)
{
isym->st_value -= count;
}
+ /* If the symbol *spans* the bytes we just deleted (i.e. it's
+ *end* is in the moved bytes but it's *start* isn't), then we
+ must adjust its size. */
+ if ((int) isym->st_shndx == sec_shndx
+ && isym->st_value < addr
+ && isym->st_value + isym->st_size > addr
+ && isym->st_value + isym->st_size < toaddr)
+ {
+ isym->st_size -= count;
+ }
}
/* Now adjust the global symbols defined in this section. */
struct elf_link_hash_entry * sym_hash = * sym_hashes;
if (sym_hash &&
- ( sym_hash->root.type == bfd_link_hash_defined
+ (sym_hash->root.type == bfd_link_hash_defined
|| sym_hash->root.type == bfd_link_hash_defweak)
- && sym_hash->root.u.def.section == sec
- && sym_hash->root.u.def.value > addr
- && sym_hash->root.u.def.value < toaddr)
+ && sym_hash->root.u.def.section == sec)
{
- sym_hash->root.u.def.value -= count;
+ if (sym_hash->root.u.def.value > addr
+ && sym_hash->root.u.def.value < toaddr)
+ {
+ sym_hash->root.u.def.value -= count;
+ }
+ if (sym_hash->root.u.def.value < addr
+ && sym_hash->root.u.def.value + sym_hash->size > addr
+ && sym_hash->root.u.def.value + sym_hash->size < toaddr)
+ {
+ sym_hash->size -= count;
+ }
}
}
#define ELF_ARCH bfd_arch_m32c
#define ELF_MACHINE_CODE EM_M32C
#define ELF_MACHINE_ALT1 EM_M32C_OLD
-#define ELF_MAXPAGESIZE 0x1000
+#define ELF_MAXPAGESIZE 0x100
#if 0
#define TARGET_BIG_SYM bfd_elf32_m32c_vec