MIPS/BFD: Correctly handle `bfd_reloc_outofrange' with branches
Fix internal errors like: ld: BFD (GNU Binutils) 2.26.51.20160526 internal error, aborting at .../bfd/elfxx-mips.c:10278 in _bfd_mips_elf_relocate_section ld: Please report this bug. triggered by the `bfd_reloc_outofrange' condition on branch relocations. bfd/ * elfxx-mips.c (b_reloc_p): New function. (_bfd_mips_elf_relocate_section) <bfd_reloc_outofrange>: Handle branch relocations. ld/ * testsuite/ld-mips-elf/unaligned-branch.d: New test. * testsuite/ld-mips-elf/unaligned-branch.s: New test source. * testsuite/ld-mips-elf/unaligned-text.s: New test source. * testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
This commit is contained in:
parent
3b4412a041
commit
99aefae681
7 changed files with 85 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
|
||||
|
||||
* elfxx-mips.c (b_reloc_p): New function.
|
||||
(_bfd_mips_elf_relocate_section) <bfd_reloc_outofrange>: Handle
|
||||
branch relocations.
|
||||
|
||||
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
|
||||
|
||||
* elfxx-mips.c (mips_elf_calculate_relocation): <R_MIPS16_26>
|
||||
|
|
|
@ -2215,6 +2215,15 @@ jal_reloc_p (int r_type)
|
|||
|| r_type == R_MICROMIPS_26_S1);
|
||||
}
|
||||
|
||||
static inline bfd_boolean
|
||||
b_reloc_p (int r_type)
|
||||
{
|
||||
return (r_type == R_MIPS_PC26_S2
|
||||
|| r_type == R_MIPS_PC21_S2
|
||||
|| r_type == R_MIPS_PC16
|
||||
|| r_type == R_MIPS_GNU_REL16_S2);
|
||||
}
|
||||
|
||||
static inline bfd_boolean
|
||||
aligned_pcrel_reloc_p (int r_type)
|
||||
{
|
||||
|
@ -10261,6 +10270,8 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
msg = NULL;
|
||||
if (jal_reloc_p (howto->type))
|
||||
msg = _("JALX to a non-word-aligned address");
|
||||
else if (b_reloc_p (howto->type))
|
||||
msg = _("Branch to a non-instruction-aligned address");
|
||||
else if (aligned_pcrel_reloc_p (howto->type))
|
||||
msg = _("PC-relative load from unaligned address");
|
||||
if (msg)
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
|
||||
|
||||
* testsuite/ld-mips-elf/unaligned-branch.d: New test.
|
||||
* testsuite/ld-mips-elf/unaligned-branch.s: New test source.
|
||||
* testsuite/ld-mips-elf/unaligned-text.s: New test source.
|
||||
* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
|
||||
|
||||
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
|
||||
|
||||
* testsuite/ld-mips-elf/unaligned-syms.s: Rename to...
|
||||
|
|
|
@ -199,6 +199,8 @@ if $has_newabi {
|
|||
[list [list ld $abi_ldflags(n32)]]
|
||||
}
|
||||
|
||||
run_dump_test "unaligned-branch" [list [list ld $abi_ldflags(o32)]]
|
||||
|
||||
run_dump_test "unaligned-lwpc-0" [list [list ld $abi_ldflags(o32)]]
|
||||
run_dump_test "unaligned-lwpc-1" [list [list ld $abi_ldflags(o32)]]
|
||||
run_dump_test "unaligned-ldpc-0" [list [list ld $abi_ldflags(o32)]]
|
||||
|
|
23
ld/testsuite/ld-mips-elf/unaligned-branch.d
Normal file
23
ld/testsuite/ld-mips-elf/unaligned-branch.d
Normal file
|
@ -0,0 +1,23 @@
|
|||
#name: MIPS branch to unaligned symbol
|
||||
#source: unaligned-branch.s
|
||||
#source: unaligned-text.s
|
||||
#as: -EB -32 -mips32r6
|
||||
#ld: -EB -Ttext 0x10000000 -e 0x10000000
|
||||
#error: \A[^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x14\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x1c\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x24\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x28\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x30\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x38\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x3c\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x44\): Branch to a non-instruction-aligned address\n
|
||||
#error: [^\n]*: In function `foo':\n
|
||||
#error: \(\.text\+0x4c\): Branch to a non-instruction-aligned address\Z
|
21
ld/testsuite/ld-mips-elf/unaligned-branch.s
Normal file
21
ld/testsuite/ld-mips-elf/unaligned-branch.s
Normal file
|
@ -0,0 +1,21 @@
|
|||
.text
|
||||
.align 4
|
||||
.globl foo
|
||||
.ent foo
|
||||
foo:
|
||||
b bar0
|
||||
beqzc $2, bar0
|
||||
bc bar0
|
||||
b bar1
|
||||
beqzc $2, bar1
|
||||
bc bar1
|
||||
b bar2
|
||||
beqzc $2, bar2
|
||||
bc bar2
|
||||
b bar3
|
||||
beqzc $2, bar3
|
||||
bc bar3
|
||||
b bar4
|
||||
beqzc $2, bar4
|
||||
bc bar4
|
||||
.end foo
|
15
ld/testsuite/ld-mips-elf/unaligned-text.s
Normal file
15
ld/testsuite/ld-mips-elf/unaligned-text.s
Normal file
|
@ -0,0 +1,15 @@
|
|||
.macro sym n:req
|
||||
.if \n
|
||||
.globl bar\@
|
||||
.type bar\@, @object
|
||||
bar\@ :
|
||||
.byte 0
|
||||
.size bar\@, . - bar\@
|
||||
sym \n - 1
|
||||
.endif
|
||||
.endm
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.space 32
|
||||
sym 16
|
Loading…
Reference in a new issue