From 092dcd755dcdcf664b25a7011fd15957f124c29f Mon Sep 17 00:00:00 2001 From: Chris Demetriou Date: Mon, 14 Jun 2004 18:25:10 +0000 Subject: [ bfd/ChangeLog ] 2004-06-14 Chris Demetriou * elf32-mips.c (elf_mips_gnu_pcrel32): Add (undoing 2004-04-24 removal) with updated comment. (bfd_elf32_bfd_reloc_type_lookup): Add back case for BFD_RELOC_32_PCREL. (mips_elf32_rtype_to_howto): Add back case for R_MIPS_PC32. * elfxx-mips.c (mips_elf_calculate_relocation): Likewise. [ include/elf/ChangeLog ] 2004-06-14 Chris Demetriou * mips.h (R_MIPS_PC32): Add back (undoing removal on 2004-04-24), with an updated comment. --- bfd/ChangeLog | 9 +++++++++ bfd/elf32-mips.c | 23 +++++++++++++++++++++++ bfd/elfxx-mips.c | 5 +++++ 3 files changed, 37 insertions(+) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 63bd2ad..8ef353e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2004-06-14 Chris Demetriou + + * elf32-mips.c (elf_mips_gnu_pcrel32): Add (undoing 2004-04-24 + removal) with updated comment. + (bfd_elf32_bfd_reloc_type_lookup): Add back case for + BFD_RELOC_32_PCREL. + (mips_elf32_rtype_to_howto): Add back case for R_MIPS_PC32. + * elfxx-mips.c (mips_elf_calculate_relocation): Likewise. + 2004-06-12 Alan Modra * elf64-x86-64.c (elf64_x86_64_relocate_section): Ignore reloc diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 63f1062..2e6eeb9 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -615,6 +615,25 @@ static reloc_howto_type elf_mips_gnu_rel16_s2 = 0xffff, /* dst_mask */ TRUE); /* pcrel_offset */ +/* 32 bit pc-relative. This was a GNU extension used by embedded-PIC. + It was co-opted by mips-linux for exception-handling data. It is no + longer used, but should continue to be supported by the linker for + backward compatibility. (GCC stopped using it in May, 2004.) */ +static reloc_howto_type elf_mips_gnu_pcrel32 = + HOWTO (R_MIPS_PC32, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + TRUE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MIPS_PC32", /* name */ + TRUE, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + TRUE); /* pcrel_offset */ + /* GNU extension to record C++ vtable hierarchy */ static reloc_howto_type elf_mips_gnu_vtinherit_howto = HOWTO (R_MIPS_GNU_VTINHERIT, /* type */ @@ -1071,6 +1090,8 @@ bfd_elf32_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) return &elf_mips_gnu_vtentry_howto; case BFD_RELOC_16_PCREL_S2: return &elf_mips_gnu_rel16_s2; + case BFD_RELOC_32_PCREL: + return &elf_mips_gnu_pcrel32; } } @@ -1092,6 +1113,8 @@ mips_elf32_rtype_to_howto (unsigned int r_type, return &elf_mips_gnu_vtentry_howto; case R_MIPS_GNU_REL16_S2: return &elf_mips_gnu_rel16_s2; + case R_MIPS_PC32: + return &elf_mips_gnu_pcrel32; default: BFD_ASSERT (r_type < (unsigned int) R_MIPS_max); return &elf_mips_howto_table_rel[r_type]; diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 21748f2..cbacd4e 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -3336,6 +3336,11 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, value &= howto->dst_mask; break; + case R_MIPS_PC32: + value = symbol + addend - p; + value &= howto->dst_mask; + break; + case R_MIPS_GNU_REL16_S2: value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p; overflowed_p = mips_elf_overflow_p (value, 18); -- cgit v1.1