diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp
index 5c925476e23..1bc8760e72b 100644
--- a/ld/testsuite/config/default.exp
+++ b/ld/testsuite/config/default.exp
@@ -155,7 +155,7 @@ if {! [info exists env(CCC_OVERRIDE_OPTIONS)]} {
 # installed, but to the O32 ABI in the build tree, because of some
 # specs-file hacks.  Make sure we use an ABI that is compatible with
 # the one we expect.
-if {[istarget mips64*-*-linux*] &&
+if {[istarget mips*64*-*-linux*] && ![istarget mips*64*-*-linux-gnuabi64] &&
     (![board_info [target_info name] exists multilib_flags] ||
      ![string match "*-mabi" [board_info [target_info name] multilib_flags]])
    } {
@@ -263,6 +263,24 @@ proc ld_exec { target output } {
 	default_ld_exec $target $output
 }
 
+#
+# xfail_from_runlist
+# 	mark a test xfail and remove it from the runlist
+proc xfail_from_runlist { runlist name } {
+  set i 0
+  set rtl $runlist
+  foreach t $runlist {
+    set tn [lindex $t 0]
+    if [string equal $name $tn] {
+      xfail $tn
+      set rtl [lreplace $rtl $i $i]
+    }
+    incr i
+  }
+  return $rtl
+}
+
+
 # From gas-defs.exp, to support run_dump_test.
 if ![info exists AS] then {
     set AS $as
diff --git a/ld/testsuite/ld-elf/indirect.exp b/ld/testsuite/ld-elf/indirect.exp
index ce4771371dd..dfbb097378b 100644
--- a/ld/testsuite/ld-elf/indirect.exp
+++ b/ld/testsuite/ld-elf/indirect.exp
@@ -219,7 +219,9 @@ proc check_dynamic_syms { test } {
 
 foreach t [list indirect5a indirect5b indirect6a indirect6b] {
     set testname [concat $t "dynsym"]
-    if { [check_dynamic_syms tmpdir/$t] } {
+    if { [istarget mips*] } {
+	xfail $testname
+    } elseif { [check_dynamic_syms tmpdir/$t] } {
 	pass $testname
     } else {
 	fail $testname
@@ -252,7 +254,9 @@ run_ld_link_exec_tests $pie_tests
 
 foreach t [list indirect5c indirect5d indirect6c indirect6d] {
     set testname [concat $t "dynsym"]
-    if { [check_dynamic_syms tmpdir/$t] } {
+    if { [istarget mips*] } {
+	xfail $testname
+    } elseif { [check_dynamic_syms tmpdir/$t] } {
 	pass $testname
     } else {
 	fail $testname
diff --git a/ld/testsuite/ld-elf/pr23658-2.rd b/ld/testsuite/ld-elf/pr23658-2.rd
index 9f89c4b40ae..e414ae3250d 100644
--- a/ld/testsuite/ld-elf/pr23658-2.rd
+++ b/ld/testsuite/ld-elf/pr23658-2.rd
@@ -1,5 +1,5 @@
 #...
- +[0-9]+ +\.interp \.note.4 \.note.1 \.note.2 \.note.3.*
+ +[0-9]+ +(\.MIPS\.abiflags \.MIPS\.options \.dynamic \.hash \.dynsym \.dynstr \.text |)\.interp \.note.4 \.note.1 \.note.2 \.note.3.*
 #...
  +[0-9]+ +\.note\.4 \.note\.1 +
  +[0-9]+ +\.note\.2 .note\.3 +
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index 1eef9f45667..2019275dda3 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -774,9 +774,6 @@ set build_tests {
   {"Build libpr16496b.a"
    "" "-fPIC"
    {pr16496b.c} {} "libpr16496b.a"}
-  {"Build libpr16496b.so"
-   "-shared -Wl,--no-as-needed tmpdir/pr16496b.o tmpdir/libpr16496a.so" ""
-   {dummy.c} {{objdump {-R} pr16496b.od}} "libpr16496b.so"}
   {"Build libpr16452a.so"
    "-shared -Wl,-soname,libpr16452a.so,--version-script=pr16452.map" "-fPIC"
    {pr16452a.c} {} "libpr16452a.so"}
@@ -797,6 +794,15 @@ set build_tests {
    {pr18458b.c} {} "libpr18458b.so"}
 }
 
+# MIPS PIC uses different way: .MIPS.stub
+if { ![istarget mips*-linux*] } {
+    append build_tests {
+       {"Build libpr16496b.so"
+	"-shared -Wl,--no-as-needed tmpdir/pr16496b.o tmpdir/libpr16496a.so" ""
+	{dummy.c} {{objdump {-R} pr16496b.od}} "libpr16496b.so"}
+    }
+}
+
 run_cc_link_tests [list \
     [list \
 	"Build libpr2404a.so" \
diff --git a/ld/testsuite/ld-elfvers/vers.exp b/ld/testsuite/ld-elfvers/vers.exp
index b266cc0226f..2ab5487d440 100644
--- a/ld/testsuite/ld-elfvers/vers.exp
+++ b/ld/testsuite/ld-elfvers/vers.exp
@@ -801,13 +801,13 @@ build_exec "vers3" vers3.c vers3 "-Wl,--no-as-needed" vers1.so vers3.ver vers3.d
 
 # This test fails on MIPS.  On the MIPS we must put foo in the dynamic
 # symbol table, which the test does not expect.
-setup_xfail "mips*-*-irix*"
+setup_xfail "mips*-*-irix*" "mips*-linux-*"
 build_exec "vers4" vers4.c vers4 "" "" "" "" vers4.sym
 
 build_exec "vers4a" vers4.c vers4a "-Wl,-export-dynamic" "" vers4a.ver vers4a.dsym vers4a.sym
 
 # Verify that --no-export-dynamic undoes the effect of --export-dynamic.
-setup_xfail "mips*-*-irix*"
+setup_xfail "mips*-*-irix*" "mips*-linux-*"
 build_exec "vers4b" vers4.c vers4b "-Wl,-export-dynamic -Wl,--no-export-dynamic" "" "" "" vers4.sym
 
 
@@ -932,18 +932,20 @@ set as_pic_flags ""
 if [istarget sparc*-*-*] {
   set as_pic_flags "-K PIC"
 }
-run_ld_link_tests [list "\"vers24a\"
+if { ![istarget mips*-*-*] } {
+  run_ld_link_tests [list "\"vers24a\"
 			 \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
 			 \"$as_pic_flags $as_options\" {vers24a.c vers24b.c} { { readelf -Wrs vers24.rd } }
 			 \"libvers24a.so\" \"-fpic\""]
-run_ld_link_tests [list "\"vers24b\"
+  run_ld_link_tests [list "\"vers24b\"
 			 \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
 			 \"$as_pic_flags $as_options\" {vers24b.c vers24a.c} { { readelf -Wrs vers24.rd } }
 			 \"libvers24b.so\" \"-fpic\""]
-run_ld_link_tests [list "\"vers24c\"
+  run_ld_link_tests [list "\"vers24c\"
 			 \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
 			 \"$as_pic_flags $as_options\" {vers24c.c} { { readelf -Wrs vers24.rd } }
 			 \"libvers24c.so\" \"-fpic\""]
+}
 
 # Test versioned definition vs. normal definition in different files.
 if [string match "yes" $pic] then {
diff --git a/ld/testsuite/ld-gc/gc.exp b/ld/testsuite/ld-gc/gc.exp
index bca0397ee02..e342c3ba2fe 100644
--- a/ld/testsuite/ld-gc/gc.exp
+++ b/ld/testsuite/ld-gc/gc.exp
@@ -151,6 +151,10 @@ if { [check_compiler_available] } {
     }
 }
 
+set save_asflags $ASFLAGS
+if { [istarget "mips*-*-linux*"] } {
+    append ASFLAGS " -KPIC"
+}
 set symdefs ""
 if [is_pecoff_format] {
     set symdefs {{ld {--defsym __main=main --defsym ___main=main}}}
@@ -174,6 +178,7 @@ if { [check_compiler_available] } {
     }
     run_dump_test "pr19161" $symdefs
 }
+set ASFLAGS $save_asflags
 
 if { [is_elf_format] && [check_shared_lib_support] \
      && [check_compiler_available] } {
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index ee0522b073f..4565bc9570c 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -1101,7 +1101,7 @@ if { $has_abi(o32) } {
 }
 
 run_dump_test_o32 "mips16-local-stubs-1"
-run_dump_test_n32 "mips16-local-stubs-1"
+run_dump_test_n32 "mips16-local-stubs-1" noarch
 
 set mips16_fp_stub_test [list \
     [list "Floating-point stub for mips16 functions" \
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index e7e7952bb1b..a4b546d4253 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -557,7 +557,7 @@ if { ! [istarget "arm*-*-*"] } {
 # when using the LTO plugin.  The HPPA target however requires an
 # executable stack for syscall restarts and signal returns, so we
 # skip this test for that target.
-if { ! [istarget "hppa*-*-*"] } {
+if { ! [istarget "hppa*-*-*"] && ! [istarget "mips*-linux*"] } {
     lappend lto_link_elf_tests \
   [list "PR ld/12982" \
    "-O2 -flto -fuse-linker-plugin" "-O2 -flto" \
@@ -909,6 +909,10 @@ if { [at_least_gcc_version 4 7] } {
     }
 }
 
+set save_asflags $ASFLAGS
+if { [istarget "mips*-*-linux*"] } {
+    append ASFLAGS " -KPIC"
+}
 # Run "ld -r" to generate inputs for complex LTO tests.
 run_dump_test "lto-3r"
 remote_exec host "mv" "tmpdir/dump tmpdir/lto-3.o"
@@ -922,7 +926,12 @@ run_ld_link_tests [list \
    "-r tmpdir/pr19317.o" "" "" \
    {dummy.s} {} "pr19317-r.o"] \
 ]
+set ASFLAGS $save_asflags
 
+if { [istarget "mips*-*-linux*"] } {
+  set lto_run_tests [xfail_from_runlist $lto_run_tests "PR ld/15323 (4)"]
+  set lto_run_tests [xfail_from_runlist $lto_run_tests "PR ld/19317 (3)"]
+}
 run_ld_link_exec_tests $lto_run_tests
 
 if { [is_elf_format] } {
diff --git a/ld/testsuite/ld-plugin/plugin.exp b/ld/testsuite/ld-plugin/plugin.exp
index bbb8cedbc2c..ce7d406c998 100644
--- a/ld/testsuite/ld-plugin/plugin.exp
+++ b/ld/testsuite/ld-plugin/plugin.exp
@@ -295,6 +295,15 @@ if { !$can_compile || $failed_compile } {
     return
 }
 
+if { [istarget "mips*-*-linux*"] } {
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile lost symbol"]
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile replace symbol"]
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile resolve symbol"]
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile lost symbol with source"]
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile replace symbol with source"]
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile resolve symbol with source"]
+  set plugin_tests [xfail_from_runlist $plugin_tests "plugin claimfile resolve symbol with source"]
+}
 run_ld_link_tests $plugin_tests
 
 if { [is_elf_format] \
@@ -355,6 +364,12 @@ if { [regexp "0+ T func" "$plugin_nm_output"] &&
 
 # Check if ar --plugin works.
 file delete tmpdir/libfunc.a
+if { [istarget "mips*-*-linux*"] } {
+  set plugin_src_tests [xfail_from_runlist $plugin_src_tests "plugin 2 with source lib"]
+  set plugin_src_tests [xfail_from_runlist $plugin_src_tests "load plugin 2 with source"]
+  set plugin_src_tests [xfail_from_runlist $plugin_src_tests "plugin 3 with source lib"]
+  set plugin_src_tests [xfail_from_runlist $plugin_src_tests "load plugin 3 with source"]
+}
 if [ar_simple_create $ar "--plugin $plugin2_path" "tmpdir/libfunc.a" \
 			 "tmpdir/main.o $srcdir/$subdir/func.c"] {
     set testname "ar --plugin"
diff --git a/ld/testsuite/ld-selective/selective.exp b/ld/testsuite/ld-selective/selective.exp
index 813a52d54de..2531a5e5df8 100644
--- a/ld/testsuite/ld-selective/selective.exp
+++ b/ld/testsuite/ld-selective/selective.exp
@@ -52,7 +52,7 @@ set ldflags "--gc-sections -Bstatic"
 
 if [istarget mips*-*] {
     # MIPS16 doesn't support PIC code.
-    set cflags "-mno-abicalls $cflags"
+    set cflags "-mno-abicalls -fno-PIC $cflags"
     # MIPS ELF uses __start by default, we override it.
     set ldflags "-e _start $ldflags"
 }
diff --git a/ld/testsuite/ld-shared/shared.exp b/ld/testsuite/ld-shared/shared.exp
index f56e42f667b..3b0adddf023 100644
--- a/ld/testsuite/ld-shared/shared.exp
+++ b/ld/testsuite/ld-shared/shared.exp
@@ -220,7 +220,7 @@ if ![ld_compile "$CC_FOR_TARGET $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.
 	 || ![ld_compile "$CC_FOR_TARGET $PLT_CFLAGS $SHCFLAG" $srcdir/$subdir/sh2.c $tmpdir/sh2np.o] } {
 	unsupported "shared (non PIC)"
     } else { if { [is_xcoff_format] } {
-	shared_test shnp "shared (nonPIC)" mainnp.o sh1np.o sh2np.o xcoff
+	shared_test shnp "shared (non PIC)" mainnp.o sh1np.o sh2np.o xcoff
     } else {
 	# Solaris defaults to -z text.
 	setup_xfail "*-*-solaris2*"
@@ -242,6 +242,7 @@ if ![ld_compile "$CC_FOR_TARGET $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.
 	    setup_xfail "arm*-*-linux*"
 	}
 	setup_xfail "aarch64*-*-linux*"
+	setup_xfail "mips*-*-linux*"
 	shared_test shnp "shared (non PIC)" mainnp.o sh1np.o sh2np.o shared
 
 	# Test ELF shared library relocations with a non-zero load
@@ -323,6 +324,7 @@ if ![ld_compile "$CC_FOR_TARGET $SHCFLAG $picflag" $srcdir/$subdir/main.c $tmpdi
 		setup_xfail "arm*-*-linux*"
 	    }
 	    setup_xfail "aarch64*-*-linux*"
+	    setup_xfail "mips*-*-linux*"
 	    shared_test shmpnp "shared (PIC main, non PIC so)" mainp.o sh1np.o sh2np.o shared
 	}
     } else {
