diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-08-03 06:04:21 +0000 |
---|---|---|
committer | Mark Mitchell <mark@codesourcery.com> | 1999-08-03 06:04:21 +0000 |
commit | 5a44662b54e8ca902fa85726853b753107346023 (patch) | |
tree | 92535f4bfb53d2c2c50342809c99bbc592d1feef /bfd/elf32-mips.c | |
parent | c3332e24e81df74a8f62966dfa4b5f475a20523e (diff) | |
download | gdb-5a44662b54e8ca902fa85726853b753107346023.zip gdb-5a44662b54e8ca902fa85726853b753107346023.tar.gz gdb-5a44662b54e8ca902fa85726853b753107346023.tar.bz2 |
* 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.
Diffstat (limited to 'bfd/elf32-mips.c')
-rw-r--r-- | bfd/elf32-mips.c | 30 |
1 files changed, 21 insertions, 9 deletions
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: |