diff options
author | Nick Clifton <nickc@redhat.com> | 2003-08-20 08:37:19 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2003-08-20 08:37:19 +0000 |
commit | 8d7cab1f462b2032b5977c11a0ef57ba61107dbc (patch) | |
tree | 29043610c2d2b8bf639c77148b60c7022c893bee /bfd/elf32-arm.h | |
parent | d04e7b07c8d389527908c19a24a778185fac2c18 (diff) | |
download | gdb-8d7cab1f462b2032b5977c11a0ef57ba61107dbc.tar.gz |
Better handking for unresolved symbols
Diffstat (limited to 'bfd/elf32-arm.h')
-rw-r--r-- | bfd/elf32-arm.h | 72 |
1 files changed, 22 insertions, 50 deletions
diff --git a/bfd/elf32-arm.h b/bfd/elf32-arm.h index 2c62ec665ba..a28c558f1db 100644 --- a/bfd/elf32-arm.h +++ b/bfd/elf32-arm.h @@ -1963,19 +1963,16 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section, } else { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - while ( h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - - if ( h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) + bfd_boolean warned; + bfd_boolean unresolved_reloc; + + RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, + symtab_hdr, relocation, + sec, unresolved_reloc, info, + warned); + + if (unresolved_reloc || relocation != 0) { - int relocation_needed = 1; - - sec = h->root.u.def.section; - /* In these cases, we don't need the relocation value. We check specially because in some obscure cases sec->output_section will be NULL. */ @@ -1998,64 +1995,39 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section, && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0)) ) - relocation_needed = 0; + relocation = 0; break; case R_ARM_GOTPC: - relocation_needed = 0; + relocation = 0; break; case R_ARM_GOT32: if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL - (elf_hash_table(info)->dynamic_sections_created, + (elf_hash_table (info)->dynamic_sections_created, info->shared, h)) && (!info->shared || (!info->symbolic && h->dynindx != -1) || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)) - relocation_needed = 0; + relocation = 0; break; case R_ARM_PLT32: if (h->plt.offset != (bfd_vma)-1) - relocation_needed = 0; + relocation = 0; break; default: - if (sec->output_section == NULL) - { - (*_bfd_error_handler) - (_("%s: warning: unresolvable relocation %d against symbol `%s' from %s section"), - bfd_archive_filename (input_bfd), - r_type, - h->root.root.string, - bfd_get_section_name (input_bfd, input_section)); - relocation_needed = 0; - } + if (unresolved_reloc) + _bfd_error_handler + (_("%s: warning: unresolvable relocation %d against symbol `%s' from %s section"), + bfd_archive_filename (input_bfd), + r_type, + h->root.root.string, + bfd_get_section_name (input_bfd, input_section)); + break; } - - if (relocation_needed) - relocation = h->root.u.def.value - + sec->output_section->vma - + sec->output_offset; - else - relocation = 0; - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else if (info->shared && !info->symbolic - && !info->no_undefined - && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) - relocation = 0; - else - { - if (!((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset, - (!info->shared || info->no_undefined - || ELF_ST_VISIBILITY (h->other))))) - return FALSE; - relocation = 0; } } |