diff options
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r-- | bfd/elf32-arm.c | 66 |
1 files changed, 14 insertions, 52 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 9008a4b..5b78dc3 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -2466,19 +2466,6 @@ stub_hash_newfunc (struct bfd_hash_entry *entry, return entry; } -/* Return true if NAME is the name of the relocation section associated - with S. */ - -static bfd_boolean -reloc_section_p (struct elf32_arm_link_hash_table *htab, - const char *name, asection *s) -{ - if (htab->use_rel) - return CONST_STRNEQ (name, ".rel") && strcmp (s->name, name + 4) == 0; - else - return CONST_STRNEQ (name, ".rela") && strcmp (s->name, name + 5) == 0; -} - /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up shortcuts to them in our hash table. */ @@ -5960,19 +5947,11 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, if (sreloc == NULL) { - const char * name; + sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd, input_section, + ! globals->use_rel); - name = (bfd_elf_string_from_elf_section - (input_bfd, - elf_elfheader (input_bfd)->e_shstrndx, - elf_section_data (input_section)->rel_hdr.sh_name)); - if (name == NULL) + if (sreloc == NULL) return bfd_reloc_notsupported; - - BFD_ASSERT (reloc_section_p (globals, name, input_section)); - - sreloc = bfd_get_section_by_name (dynobj, name); - BFD_ASSERT (sreloc != NULL); } skip = FALSE; @@ -9278,40 +9257,23 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info, /* When creating a shared object, we must copy these reloc types into the output file. We create a reloc section in dynobj and make room for this reloc. */ - if (sreloc == NULL) + if (sreloc == NULL) { - const char * name; + sreloc = _bfd_elf_make_dynamic_reloc_section + (sec, dynobj, 2, abfd, ! htab->use_rel); - name = (bfd_elf_string_from_elf_section - (abfd, - elf_elfheader (abfd)->e_shstrndx, - elf_section_data (sec)->rel_hdr.sh_name)); - if (name == NULL) + if (sreloc == NULL) return FALSE; - BFD_ASSERT (reloc_section_p (htab, name, sec)); - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) + /* BPABI objects never have dynamic relocations mapped. */ + if (! htab->symbian_p) { - flagword flags; - - flags = (SEC_HAS_CONTENTS | SEC_READONLY - | SEC_IN_MEMORY | SEC_LINKER_CREATED); - if ((sec->flags & SEC_ALLOC) != 0 - /* BPABI objects never have dynamic - relocations mapped. */ - && !htab->symbian_p) - flags |= SEC_ALLOC | SEC_LOAD; - sreloc = bfd_make_section_with_flags (dynobj, - name, - flags); - if (sreloc == NULL - || ! bfd_set_section_alignment (dynobj, sreloc, 2)) - return FALSE; - } + flagword flags; - elf_section_data (sec)->sreloc = sreloc; + flags = bfd_get_section_flags (dynobj, sreloc); + flags &= ~(SEC_LOAD | SEC_ALLOC); + bfd_set_section_flags (dynobj, sreloc, flags); + } } /* If this is a global symbol, we count the number of |