aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-mips.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-08-03 06:04:21 +0000
committerMark Mitchell <mark@codesourcery.com>1999-08-03 06:04:21 +0000
commit5a44662b54e8ca902fa85726853b753107346023 (patch)
tree92535f4bfb53d2c2c50342809c99bbc592d1feef /bfd/elf32-mips.c
parentc3332e24e81df74a8f62966dfa4b5f475a20523e (diff)
downloadgdb-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.c30
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: