From: Maciej W. Rozycki Date: Mon, 28 Feb 2011 15:44:53 +0000 (+0000) Subject: gas/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ce70d90a3e5e00fd49b46164a43e3dfbcf1cf404;p=binutils-gdb.git gas/ * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index e5dd2bdcfc9..316abb73c7b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2011-02-28 Maciej W. Rozycki + + * config/tc-mips.c (mips_fix_adjustable): On REL targets also + reject PC-relative relocations. + 2011-02-28 Maciej W. Rozycki * config/tc-mips.c (md_convert_frag): Correct message diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 4b7dcdcdd84..897ed0f8361 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -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 diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 8eca541b67d..1b0dfde8327 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2011-02-28 Maciej W. Rozycki + + * 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 * gas/mips/relax-swap1.l: Adjust for message capitalization diff --git a/gas/testsuite/gas/mips/branch-misc-2.d b/gas/testsuite/gas/mips/branch-misc-2.d index ffd823c7b62..205d68542f8 100644 --- a/gas/testsuite/gas/mips/branch-misc-2.d +++ b/gas/testsuite/gas/mips/branch-misc-2.d @@ -39,6 +39,6 @@ Disassembly of section .text: [ ]*b0: R_MIPS_PC16 x2 0+00b4 <[^>]*> 00000000 nop 0+00b8 <[^>]*> 1000ffff b 000000b8 -[ ]*b8: R_MIPS_PC16 \.data +[ ]*b8: R_MIPS_PC16 \.Ldata 0+00bc <[^>]*> 00000000 nop \.\.\. diff --git a/gas/testsuite/gas/mips/branch-misc-2pic.d b/gas/testsuite/gas/mips/branch-misc-2pic.d index 5b42b29603e..bc604311a99 100644 --- a/gas/testsuite/gas/mips/branch-misc-2pic.d +++ b/gas/testsuite/gas/mips/branch-misc-2pic.d @@ -40,6 +40,6 @@ Disassembly of section .text: [ ]*b0: R_MIPS_PC16 x2 0+00b4 <[^>]*> 00000000 nop 0+00b8 <[^>]*> 1000ffff b 000000b8 -[ ]*b8: R_MIPS_PC16 \.data +[ ]*b8: R_MIPS_PC16 \.Ldata 0+00bc <[^>]*> 00000000 nop \.\.\. diff --git a/gas/testsuite/gas/mips/branch-misc-4-64.d b/gas/testsuite/gas/mips/branch-misc-4-64.d new file mode 100644 index 00000000000..13c77d7f86a --- /dev/null +++ b/gas/testsuite/gas/mips/branch-misc-4-64.d @@ -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]+ +[ ]*[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]+ +[ ]*[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]+ +[ ]*[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]+ +[ ]*[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 + \.\.\. diff --git a/gas/testsuite/gas/mips/branch-misc-4.d b/gas/testsuite/gas/mips/branch-misc-4.d new file mode 100644 index 00000000000..6c4e99c64fe --- /dev/null +++ b/gas/testsuite/gas/mips/branch-misc-4.d @@ -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 +[ ]*[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 +[ ]*[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 + \.\.\. diff --git a/gas/testsuite/gas/mips/branch-misc-4.s b/gas/testsuite/gas/mips/branch-misc-4.s new file mode 100644 index 00000000000..0b7a8170350 --- /dev/null +++ b/gas/testsuite/gas/mips/branch-misc-4.s @@ -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 diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index 056dd75c090..ad11f0225ec 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -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 {