diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2ede7d324b2..8a42e46563e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-05-15 Richard Sandiford + + * elfxx-mips.c (_bfd_mips_elf_check_relocs): Record both local and + global GOT entries for GOT_PAGE relocations against global symbols. + 2011-05-13 Bernd Schmidt * config.bfd (tic6x-*-elf, tic6x-*-uclinux): New. diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index b804eeaf059..815b6af9aac 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -7743,7 +7743,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (!mips_elf_record_got_page_entry (info, abfd, r_symndx, addend)) return FALSE; - break; } /* Fall through. */ diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index ba0aa4397e9..11383beb07f 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-05-15 Richard Sandiford + + * lib/ld-lib.exp (run_ld_link_tests): Simplify pass/fail logic. + Fail if the link command fails and if no test rules are defined. + * ld-mips-elf/reloc-6a.s, ld-mips-elf/reloc-6b.s: New tests. + * ld-mips-elf/mips-elf.exp: Run them. + 2011-05-13 Bernd Schmidt * ld-tic6x/dsbt.ld (OUTPUT_FORMAT): Add. diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 23619652969..372f454a942 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -298,6 +298,18 @@ if {$has_newabi} { } run_dump_test "reloc-4" run_dump_test "reloc-5" +if { $has_newabi } { + run_ld_link_tests { + {"reloc test 6a" "-shared" + "-n32" "reloc-6a.s" + {} + "reloc-6a.so"} + {"reloc test 6b" "tmpdir/reloc-6a.so" + "-n32" "reloc-6b.s" + {} + "reloc-6b"} + } +} if {$has_newabi && $linux_gnu} { run_dump_test "eh-frame1-n32" diff --git a/ld/testsuite/ld-mips-elf/reloc-6a.s b/ld/testsuite/ld-mips-elf/reloc-6a.s new file mode 100644 index 00000000000..4d84e837e5c --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reloc-6a.s @@ -0,0 +1,11 @@ + .globl us + .globl gs +us: +gs: +ls: + lw $4,%got_page(us)($gp) + addiu $4,$4,%got_ofst(us) + lw $4,%got_page(gs)($gp) + addiu $4,$4,%got_ofst(gs) + lw $4,%got_page(ls)($gp) + addiu $4,$4,%got_ofst(ls) diff --git a/ld/testsuite/ld-mips-elf/reloc-6b.s b/ld/testsuite/ld-mips-elf/reloc-6b.s new file mode 100644 index 00000000000..aa2a726cf95 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reloc-6b.s @@ -0,0 +1,11 @@ + .globl __start + .globl gs +__start: +gs: +ls: + lw $4,%got_page(us)($gp) + addiu $4,$4,%got_ofst(us) + lw $4,%got_page(gs)($gp) + addiu $4,$4,%got_ofst(gs) + lw $4,%got_page(ls)($gp) + addiu $4,$4,%got_ofst(ls) diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 2fb8c4a7060..34de7c8d39f 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -978,26 +978,21 @@ proc run_ld_link_tests { ldtests } { } # Catch assembler errors. - if { $is_unresolved != 0 } { + if { $is_unresolved } { unresolved $testname continue } if { [regexp ".*\\.a$" $binfile] } { if { ![ar_simple_create $ar $ld_options $binfile "$objfiles"] } { - fail $testname set failed 1 - } else { - set failed 0 } } elseif { ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] } { set maybe_failed 1 set ld_output "$exec_output" - } else { - set failed 0 } - if { $failed == 0 } { + if { !$failed } { foreach actionlist $actions { set action [lindex $actionlist 0] set progopts [lindex $actionlist 1] @@ -1034,10 +1029,7 @@ proc run_ld_link_tests { ldtests } { break } set maybe_failed 0 - } elseif { $maybe_failed != 0 } { - set failed 1 - break - } elseif { $dump_prog != "" } { + } elseif { !$maybe_failed && $dump_prog != "" } { set dumpfile [lindex $actionlist 2] set binary $dump_prog @@ -1079,18 +1071,14 @@ proc run_ld_link_tests { ldtests } { remote_file host delete "dump.out" } } - - if { $failed != 0 } { - fail $testname - } else { if { $is_unresolved == 0 } { - pass $testname - } } } - # Catch action errors. - if { $is_unresolved != 0 } { + if { $is_unresolved } { unresolved $testname - continue + } elseif { $maybe_failed || $failed } { + fail $testname + } else { + pass $testname } } }