diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-mips.c | 30 |
2 files changed, 28 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0b57442..6607934 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +1999-08-02 Mark Mitchell <mark@codesourcery.com> + + * elf32-mips.c (_bfd_mips_elf_relocate_section): Handle R_MIPS_26 + and R_MIPS16_26 relocations correctly when relocating. + (_bfd_mips_elf_check_relocs): Don't assume that R_MIPS_CALL_HI16 + and R_MIPS_CALL_LO16 are for global symbols. + 1999-08-02 Jakub Jelinek <jj@ultra.linux.cz> * elflink.h (elf_bfd_final_link): Copy the whole isym, not just diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 8ac5dcf..b4e7189 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -6552,6 +6552,11 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, | ((addend & 0x7e00000) >> 16) | (addend & 0x1f)); } + else if (r_type == R_MIPS16_26 + || r_type == R_MIPS16_26) + /* The addend is stored without its two least + significant bits (which are always zero.) */ + addend << 2; } else addend = rel->r_addend; @@ -6590,6 +6595,11 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, The subsequent R_MIPS_LO16 will handle the low-order bits. */ if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16) addend >>= 16; + /* If the relocation is for an R_MIPS_26 relocation, then + the two low-order bits are not stored in the object file; + they are implicitly zero. */ + else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26) + addend >>= 2; if (rela_relocation_p) /* If this is a RELA relocation, just update the addend. @@ -7373,16 +7383,18 @@ _bfd_mips_elf_check_relocs (abfd, info, sec, relocs) case R_MIPS_CALL_HI16: case R_MIPS_CALL_LO16: - /* This symbol requires a global offset table entry. */ - if (!mips_elf_record_global_got_symbol (h, info, g)) - return false; - - /* We need a stub, not a plt entry for the undefined - function. But we record it as if it needs plt. See - elf_adjust_dynamic_symbol in elflink.h. */ - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - h->type = STT_FUNC; + if (h != NULL) + { + /* This symbol requires a global offset table entry. */ + if (!mips_elf_record_global_got_symbol (h, info, g)) + return false; + /* We need a stub, not a plt entry for the undefined + function. But we record it as if it needs plt. See + elf_adjust_dynamic_symbol in elflink.h. */ + h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; + h->type = STT_FUNC; + } break; case R_MIPS_GOT16: |