diff options
Diffstat (limited to 'bfd/elf32-mt.c')
-rw-r--r-- | bfd/elf32-mt.c | 92 |
1 files changed, 36 insertions, 56 deletions
diff --git a/bfd/elf32-mt.c b/bfd/elf32-mt.c index 320ef1e34157..a1d86523b836 100644 --- a/bfd/elf32-mt.c +++ b/bfd/elf32-mt.c @@ -1,5 +1,5 @@ /* Morpho Technologies MT specific support for 32-bit ELF - Copyright 2001, 2002, 2003, 2004, 2005 + Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -18,8 +18,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "elf-bfd.h" #include "elf/mt.h" @@ -187,6 +187,22 @@ mt_reloc_type_lookup return NULL; } +static reloc_howto_type * +mt_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, + const char *r_name) +{ + unsigned int i; + + for (i = 0; + i < sizeof (mt_elf_howto_table) / sizeof (mt_elf_howto_table[0]); + i++) + if (mt_elf_howto_table[i].name != NULL + && strcasecmp (mt_elf_howto_table[i].name, r_name) == 0) + return &mt_elf_howto_table[i]; + + return NULL; +} + bfd_reloc_status_type mt_elf_relocate_hi16 (bfd * input_bfd, @@ -309,7 +325,6 @@ mt_elf_relocate_section r_symndx = ELF32_R_SYM (rel->r_info); - /* This is a final link. */ howto = mt_elf_howto_table + ELF32_R_TYPE (rel->r_info); h = NULL; sym = NULL; @@ -338,6 +353,19 @@ mt_elf_relocate_section 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 (info->relocatable) + continue; /* Finally, the sole MT-specific part. */ switch (r_type) @@ -394,57 +422,6 @@ mt_elf_relocate_section return TRUE; } -/* Return the section that should be marked against GC for a given - relocation. */ - -static asection * -mt_elf_gc_mark_hook - (asection * sec, - struct bfd_link_info * info ATTRIBUTE_UNUSED, - Elf_Internal_Rela * rel ATTRIBUTE_UNUSED, - struct elf_link_hash_entry * h, - Elf_Internal_Sym * sym) -{ - if (h != NULL) - { - switch (h->root.type) - { - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - return h->root.u.def.section; - - case bfd_link_hash_common: - return h->root.u.c.p->section; - - default: - break; - } - } - else - { - if (!(elf_bad_symtab (sec->owner) - && ELF_ST_BIND (sym->st_info) != STB_LOCAL) - && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE) - && sym->st_shndx != SHN_COMMON)) - return bfd_section_from_elf_index (sec->owner, sym->st_shndx); - } - - return NULL; -} - -/* Update the got entry reference counts for the section being - removed. */ - -static bfd_boolean -mt_elf_gc_sweep_hook - (bfd * abfd ATTRIBUTE_UNUSED, - struct bfd_link_info * info ATTRIBUTE_UNUSED, - asection * sec ATTRIBUTE_UNUSED, - const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED) -{ - return TRUE; -} - /* Look through the relocs for a section during the first phase. Since we don't do .gots or .plts, we just need to consider the virtual table relocs for gc. */ @@ -538,6 +515,10 @@ mt_elf_copy_private_bfd_data (bfd * ibfd, bfd * obfd) elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; elf_flags_init (obfd) = TRUE; + + /* Copy object attributes. */ + _bfd_elf_copy_obj_attributes (ibfd, obfd); + return TRUE; } @@ -631,9 +612,8 @@ mt_elf_print_private_bfd_data (bfd * abfd, void * ptr) #define elf_backend_relocate_section mt_elf_relocate_section #define bfd_elf32_bfd_reloc_type_lookup mt_reloc_type_lookup +#define bfd_elf32_bfd_reloc_name_lookup mt_reloc_name_lookup -#define elf_backend_gc_mark_hook mt_elf_gc_mark_hook -#define elf_backend_gc_sweep_hook mt_elf_gc_sweep_hook #define elf_backend_check_relocs mt_elf_check_relocs #define elf_backend_object_p mt_elf_object_p #define elf_backend_rela_normal 1 |