diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/elf64-mips.c | 23 | ||||
-rw-r--r-- | bfd/elfn32-mips.c | 23 |
3 files changed, 55 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8e2308e..f70fa2f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2013-05-06 Paul Brook <paul@codesourcery.com> + + * elf64-mips.c (elf_mips_gnu_pcrel32): New. + (bfd_elf64_bfd_reloc_type_lookup, bfd_elf64_bfd_reloc_name_lookup, + mips_elf64_rtype_to_howto): Handle R_MIPS_PC32. + * elfn32-mips.c (elf_mips_gnu_pcrel32): New. + (bfd_elfn32_bfd_reloc_type_lookup, bfd_elfn32_bfd_reloc_name_lookup, + mips_elfn32_rtype_to_howto): Handle R_MIPS_PC32. + 2013-05-06 Alan Modra <amodra@gmail.com> * elf64-ppc.c (opd_entry_value): Handle case where symbol diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 9981bb1..e692099 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -2622,6 +2622,23 @@ static reloc_howto_type elf_mips_gnu_rela16_s2 = 0, /* src_mask */ 0x0000ffff, /* dst_mask */ TRUE); /* pcrel_offset */ + +/* 32 bit pc-relative. Used for compact EH tables. */ +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 */ + /* Originally a VxWorks extension, but now used for other systems too. */ static reloc_howto_type elf_mips_copy_howto = @@ -3257,6 +3274,8 @@ bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, return &elf_mips_gnu_vtinherit_howto; case BFD_RELOC_VTABLE_ENTRY: return &elf_mips_gnu_vtentry_howto; + case BFD_RELOC_32_PCREL: + return &elf_mips_gnu_pcrel32; case BFD_RELOC_MIPS_COPY: return &elf_mips_copy_howto; case BFD_RELOC_MIPS_JUMP_SLOT: @@ -3304,6 +3323,8 @@ bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, return &elf_mips_gnu_rel16_s2; if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0) return &elf_mips_gnu_rela16_s2; + if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0) + return &elf_mips_gnu_pcrel32; if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0) return &elf_mips_copy_howto; if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0) @@ -3328,6 +3349,8 @@ mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p) return &elf_mips_gnu_rela16_s2; else return &elf_mips_gnu_rel16_s2; + case R_MIPS_PC32: + return &elf_mips_gnu_pcrel32; case R_MIPS_COPY: return &elf_mips_copy_howto; case R_MIPS_JUMP_SLOT: diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 119f31b..131de33 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2587,6 +2587,23 @@ static reloc_howto_type elf_mips_gnu_rela16_s2 = 0, /* src_mask */ 0x0000ffff, /* dst_mask */ TRUE); /* pcrel_offset */ + +/* 32 bit pc-relative. Used for compact EH tables. */ +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 */ + /* Originally a VxWorks extension, but now used for other systems too. */ static reloc_howto_type elf_mips_copy_howto = @@ -3073,6 +3090,8 @@ bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, return &elf_mips_gnu_vtinherit_howto; case BFD_RELOC_VTABLE_ENTRY: return &elf_mips_gnu_vtentry_howto; + case BFD_RELOC_32_PCREL: + return &elf_mips_gnu_pcrel32; case BFD_RELOC_MIPS_COPY: return &elf_mips_copy_howto; case BFD_RELOC_MIPS_JUMP_SLOT: @@ -3121,6 +3140,8 @@ bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, return &elf_mips_gnu_rel16_s2; if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0) return &elf_mips_gnu_rela16_s2; + if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0) + return &elf_mips_gnu_pcrel32; if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0) return &elf_mips_copy_howto; if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0) @@ -3145,6 +3166,8 @@ mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p) return &elf_mips_gnu_rela16_s2; else return &elf_mips_gnu_rel16_s2; + case R_MIPS_PC32: + return &elf_mips_gnu_pcrel32; case R_MIPS_COPY: return &elf_mips_copy_howto; case R_MIPS_JUMP_SLOT: |