* config/tc-mips.c (mips_fix_adjustable): On REL targets also
	reject PC-relative relocations.

	gas/testsuite/
	* gas/mips/branch-misc-2.d: Adjust for relocation change.
	* gas/mips/branch-misc-2pic.d: Likewise.
	* gas/mips/branch-misc-4.d: New test for PC-relative relocation
	overflow.
	* gas/mips/branch-misc-4-64.d: Likewise.
	* gas/mips/branch-misc-4.s: Source for the new tests.
	* testsuite/gas/mips/mips.exp: Run the new tests.
This commit is contained in:
Maciej W. Rozycki 2011-02-28 15:44:53 +00:00
parent 5c4f07bae1
commit ce70d90a3e
9 changed files with 117 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
* config/tc-mips.c (mips_fix_adjustable): On REL targets also
reject PC-relative relocations.
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
* config/tc-mips.c (md_convert_frag): Correct message

View File

@ -14248,8 +14248,12 @@ mips_fix_adjustable (fixS *fixp)
&& (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
return 0;
/* There is no place to store an in-place offset for JALR relocations. */
if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
/* There is no place to store an in-place offset for JALR relocations.
Likewise an in-range offset of PC-relative relocations may overflow
the in-place relocatable field if recalculated against the start
address of the symbol's containing section. */
if (HAVE_IN_PLACE_ADDENDS
&& (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
return 0;
#ifdef OBJ_ELF

View File

@ -1,3 +1,13 @@
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
* gas/mips/branch-misc-2.d: Adjust for relocation change.
* gas/mips/branch-misc-2pic.d: Likewise.
* gas/mips/branch-misc-4.d: New test for PC-relative relocation
overflow.
* gas/mips/branch-misc-4-64.d: Likewise.
* gas/mips/branch-misc-4.s: Source for the new tests.
* testsuite/gas/mips/mips.exp: Run the new tests.
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
* gas/mips/relax-swap1.l: Adjust for message capitalization

View File

@ -39,6 +39,6 @@ Disassembly of section .text:
[ ]*b0: R_MIPS_PC16 x2
0+00b4 <[^>]*> 00000000 nop
0+00b8 <[^>]*> 1000ffff b 000000b8 <g6\+0x10>
[ ]*b8: R_MIPS_PC16 \.data
[ ]*b8: R_MIPS_PC16 \.Ldata
0+00bc <[^>]*> 00000000 nop
\.\.\.

View File

@ -40,6 +40,6 @@ Disassembly of section .text:
[ ]*b0: R_MIPS_PC16 x2
0+00b4 <[^>]*> 00000000 nop
0+00b8 <[^>]*> 1000ffff b 000000b8 <g6\+0x10>
[ ]*b8: R_MIPS_PC16 \.data
[ ]*b8: R_MIPS_PC16 \.Ldata
0+00bc <[^>]*> 00000000 nop
\.\.\.

View File

@ -0,0 +1,35 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS branch-misc-4-64
#as: -64
#source: branch-misc-4.s
# Verify PC-relative relocations do not overflow.
.*: +file format .*mips.*
Disassembly of section \.text:
\.\.\.
[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <foo\+0x[0-9a-f]+>
[ ]*[0-9a-f]+: R_MIPS_PC16 bar\+0xf+fffc
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
[0-9a-f]+ <[^>]*> 00000000 nop
[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <foo\+0x[0-9a-f]+>
[ ]*[0-9a-f]+: R_MIPS_PC16 \.init\+0x4
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x4
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x4
[0-9a-f]+ <[^>]*> 00000000 nop
\.\.\.
Disassembly of section \.init:
[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <bar\+0x[0-9a-f]+>
[ ]*[0-9a-f]+: R_MIPS_PC16 foo\+0xf+fffc
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
[0-9a-f]+ <[^>]*> 00000000 nop
[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <bar\+0x[0-9a-f]+>
[ ]*[0-9a-f]+: R_MIPS_PC16 \.text\+0x40004
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x40004
[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x40004
[0-9a-f]+ <[^>]*> 00000000 nop
\.\.\.

View File

@ -0,0 +1,26 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS branch-misc-4
#as: -32
# Verify PC-relative relocations do not overflow.
.*: +file format .*mips.*
Disassembly of section \.text:
\.\.\.
([0-9a-f]+) <[^>]*> 1000ffff b \1 <foo>
[ ]*[0-9a-f]+: R_MIPS_PC16 bar
[0-9a-f]+ <[^>]*> 00000000 nop
([0-9a-f]+) <[^>]*> 1000ffff b \1 <\.Lfoo>
[ ]*[0-9a-f]+: R_MIPS_PC16 \.Lbar
[0-9a-f]+ <[^>]*> 00000000 nop
\.\.\.
Disassembly of section \.init:
([0-9a-f]+) <[^>]*> 1000ffff b \1 <bar>
[ ]*[0-9a-f]+: R_MIPS_PC16 foo
[0-9a-f]+ <[^>]*> 00000000 nop
([0-9a-f]+) <[^>]*> 1000ffff b \1 <\.Lbar>
[ ]*[0-9a-f]+: R_MIPS_PC16 \.Lfoo
[0-9a-f]+ <[^>]*> 00000000 nop
\.\.\.

View File

@ -0,0 +1,28 @@
# Source file to verify PC-relative relocations do not overflow.
.text
.space 0x40000
.globl foo
.ent foo
foo:
b bar
.Lfoo:
b .Lbar
.end foo
# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 2
.space 8
.section .init, "ax", @progbits
.globl bar
.ent bar
bar:
b foo
.Lbar:
b .Lfoo
.end bar
# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 2
.space 8

View File

@ -830,6 +830,11 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "jalr2"
run_dump_test_arches "aent" [mips_arch_list_matching mips1]
run_dump_test_arches "branch-misc-4" \
[mips_arch_list_matching mips1]
run_dump_test_arches "branch-misc-4-64" \
[mips_arch_list_matching mips3]
}
if $has_newabi {