mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-11 19:33:33 +08:00
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
@ -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>
|
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
|
||||||
|
|
||||||
* elfxx-mips.c (mips_elf_calculate_relocation): <R_MIPS16_26>
|
* 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);
|
|| 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
|
static inline bfd_boolean
|
||||||
aligned_pcrel_reloc_p (int r_type)
|
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;
|
msg = NULL;
|
||||||
if (jal_reloc_p (howto->type))
|
if (jal_reloc_p (howto->type))
|
||||||
msg = _("JALX to a non-word-aligned address");
|
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))
|
else if (aligned_pcrel_reloc_p (howto->type))
|
||||||
msg = _("PC-relative load from unaligned address");
|
msg = _("PC-relative load from unaligned address");
|
||||||
if (msg)
|
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>
|
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
|
||||||
|
|
||||||
* testsuite/ld-mips-elf/unaligned-syms.s: Rename to...
|
* testsuite/ld-mips-elf/unaligned-syms.s: Rename to...
|
||||||
|
@ -199,6 +199,8 @@ if $has_newabi {
|
|||||||
[list [list ld $abi_ldflags(n32)]]
|
[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-0" [list [list ld $abi_ldflags(o32)]]
|
||||||
run_dump_test "unaligned-lwpc-1" [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)]]
|
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 New Issue
Block a user