[1/2] Change gdb_load_shlibs to gdb_load_shlib

Message ID 1460502865-10999-1-git-send-email-simon.marchi@ericsson.com
State Changes Requested, archived
Headers

Commit Message

Simon Marchi April 12, 2016, 11:14 p.m. UTC
  Note: this series should be applied on top of
  https://sourceware.org/ml/gdb-patches/2016-04/msg00252.html

-------

This patch renames gdb_load_shlibs to gdb_load_shlib, and changes its
arguments so that it can only take a single library at the time.

The following patch requires to be able to get the destination path of a
loaded shared library, so it's more straightforward if the procedure can
only accept one argument.

On top of the mass renaming, there are a handful of locations where I
had to split up a gdb_load_shlibs in two gdb_load_shlib.

gdb/testsuite/ChangeLog:

	* lib/gdb.exp (gdb_load_shlibs): Rename to...
	(gdb_load_shlib): ... this.  Accept a single parameter.  Return
	result of gdb_remote_download.
	* gdb.arch/ftrace-insn-reloc.exp: Adjust gdb_load_shlibs ->
	gdb_load_shlib.
	* gdb.base/catch-load.exp (one_catch_load_test): Likewise.
	* gdb.base/ctxobj.exp: Likewise.
	* gdb.base/dprintf-pending.exp: Likewise.
	* gdb.base/dso2dso.exp: Likewise.
	* gdb.base/fixsection.exp: Likewise.
	* gdb.base/gcore-relro.exp: Likewise.
	* gdb.base/gdb1555.exp: Likewise.
	* gdb.base/global-var-nested-by-dso.exp: Likewise.
	* gdb.base/gnu-ifunc.exp: Likewise.
	* gdb.base/hbreak-in-shr-unsupported.exp: Likewise.
	* gdb.base/jit-so.exp (one_jit_test): Likewise.
	* gdb.base/pending.exp: Likewise.
	* gdb.base/print-file-var.exp: Likewise.
	* gdb.base/print-symbol-loading.exp: Likewise.
	* gdb.base/shlib-call.exp: Likewise.
	* gdb.base/shreloc.exp: Likewise.
	* gdb.base/so-impl-ld.exp: Likewise.
	* gdb.base/solib-disc.exp: Likewise.
	* gdb.base/solib-nodir.exp: Likewise.
	* gdb.base/solib-overlap.exp: Likewise.
	* gdb.base/solib-symbol.exp: Likewise.
	* gdb.base/solib-weak.exp (do_test): Likewise.
	* gdb.base/sym-file.exp: Likewise.
	* gdb.base/symtab-search-order.exp: Likewise.
	* gdb.base/type-opaque.exp: Likewise.
	* gdb.base/unload.exp: Likewise.
	* gdb.base/watchpoint-solib.exp: Likewise.
	* gdb.compile/compile.exp: Likewise.
	* gdb.cp/gdb2384.exp: Likewise.
	* gdb.cp/infcall-dlopen.exp: Likewise.
	* gdb.cp/re-set-overloaded.exp: Likewise.
	* gdb.fortran/library-module.exp: Likewise.
	* gdb.opt/solib-intra-step.exp: Likewise.
	* gdb.python/py-finish-breakpoint.exp: Likewise.
	* gdb.python/py-shared.exp: Likewise.
	* gdb.reverse/solib-precsave.exp: Likewise.
	* gdb.reverse/solib-reverse.exp: Likewise.
	* gdb.server/solib-list.exp: Likewise.
	* gdb.threads/dlopen-libpthread.exp: Likewise.
	* gdb.threads/tls-shared.exp: Likewise.
	* gdb.threads/tls-so_extern.exp: Likewise.
	* gdb.trace/change-loc.exp: Likewise.
	* gdb.trace/ftrace-lock.exp: Likewise.
	* gdb.trace/ftrace.exp: Likewise.
	* gdb.trace/mi-tracepoint-changed.exp (test_reconnect): Likewise.
	* gdb.trace/pending.exp: Likewise.
	* gdb.trace/range-stepping.exp: Likewise.
	* gdb.trace/strace.exp (strace_remove_socket): Likewise.
	(strace_info_marker): Likewise.
	(strace_probe_marker): Likewise.
	(strace_trace_on_same_addr): Likewise.
	(strace_trace_on_diff_addr): Likewise.
	* gdb.trace/trace-break.exp: Likewise.
	* gdb.trace/trace-condition.exp: Likewise.
	* gdb.trace/trace-mt.exp: Likewise.
---
 gdb/testsuite/gdb.arch/ftrace-insn-reloc.exp         |  2 +-
 gdb/testsuite/gdb.base/catch-load.exp                |  2 +-
 gdb/testsuite/gdb.base/ctxobj.exp                    |  3 ++-
 gdb/testsuite/gdb.base/dprintf-pending.exp           |  4 ++--
 gdb/testsuite/gdb.base/dso2dso.exp                   |  3 ++-
 gdb/testsuite/gdb.base/fixsection.exp                |  2 +-
 gdb/testsuite/gdb.base/gcore-relro.exp               |  4 ++--
 gdb/testsuite/gdb.base/gdb1555.exp                   |  2 +-
 gdb/testsuite/gdb.base/global-var-nested-by-dso.exp  |  3 ++-
 gdb/testsuite/gdb.base/gnu-ifunc.exp                 |  2 +-
 gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp |  2 +-
 gdb/testsuite/gdb.base/jit-so.exp                    |  2 +-
 gdb/testsuite/gdb.base/pending.exp                   |  4 ++--
 gdb/testsuite/gdb.base/print-file-var.exp            |  3 ++-
 gdb/testsuite/gdb.base/print-symbol-loading.exp      |  2 +-
 gdb/testsuite/gdb.base/shlib-call.exp                |  3 ++-
 gdb/testsuite/gdb.base/shreloc.exp                   |  3 ++-
 gdb/testsuite/gdb.base/so-impl-ld.exp                |  2 +-
 gdb/testsuite/gdb.base/solib-disc.exp                |  2 +-
 gdb/testsuite/gdb.base/solib-nodir.exp               |  2 +-
 gdb/testsuite/gdb.base/solib-overlap.exp             |  3 ++-
 gdb/testsuite/gdb.base/solib-symbol.exp              |  2 +-
 gdb/testsuite/gdb.base/solib-weak.exp                |  3 ++-
 gdb/testsuite/gdb.base/sym-file.exp                  |  2 +-
 gdb/testsuite/gdb.base/symtab-search-order.exp       |  2 +-
 gdb/testsuite/gdb.base/type-opaque.exp               |  2 +-
 gdb/testsuite/gdb.base/unload.exp                    |  3 ++-
 gdb/testsuite/gdb.base/watchpoint-solib.exp          |  2 +-
 gdb/testsuite/gdb.compile/compile.exp                |  2 +-
 gdb/testsuite/gdb.cp/gdb2384.exp                     |  2 +-
 gdb/testsuite/gdb.cp/infcall-dlopen.exp              |  2 +-
 gdb/testsuite/gdb.cp/re-set-overloaded.exp           |  2 +-
 gdb/testsuite/gdb.fortran/library-module.exp         |  2 +-
 gdb/testsuite/gdb.opt/solib-intra-step.exp           |  2 +-
 gdb/testsuite/gdb.python/py-finish-breakpoint.exp    | 12 ++++++------
 gdb/testsuite/gdb.python/py-shared.exp               |  2 +-
 gdb/testsuite/gdb.reverse/solib-precsave.exp         |  4 ++--
 gdb/testsuite/gdb.reverse/solib-reverse.exp          |  4 ++--
 gdb/testsuite/gdb.server/solib-list.exp              |  2 +-
 gdb/testsuite/gdb.threads/dlopen-libpthread.exp      |  2 +-
 gdb/testsuite/gdb.threads/tls-shared.exp             |  2 +-
 gdb/testsuite/gdb.threads/tls-so_extern.exp          |  2 +-
 gdb/testsuite/gdb.trace/change-loc.exp               |  6 +++---
 gdb/testsuite/gdb.trace/ftrace-lock.exp              |  2 +-
 gdb/testsuite/gdb.trace/ftrace.exp                   |  2 +-
 gdb/testsuite/gdb.trace/mi-tracepoint-changed.exp    |  8 ++++----
 gdb/testsuite/gdb.trace/pending.exp                  |  6 +++---
 gdb/testsuite/gdb.trace/range-stepping.exp           |  2 +-
 gdb/testsuite/gdb.trace/strace.exp                   | 12 ++++++------
 gdb/testsuite/gdb.trace/trace-break.exp              |  2 +-
 gdb/testsuite/gdb.trace/trace-condition.exp          |  2 +-
 gdb/testsuite/gdb.trace/trace-mt.exp                 |  2 +-
 gdb/testsuite/lib/gdb.exp                            | 12 ++++++------
 53 files changed, 89 insertions(+), 80 deletions(-)
  

Comments

Pedro Alves April 13, 2016, 6:18 p.m. UTC | #1
On 04/13/2016 12:14 AM, Simon Marchi wrote:
> Note: this series should be applied on top of
>   https://sourceware.org/ml/gdb-patches/2016-04/msg00252.html
> 
> -------
> 
> This patch renames gdb_load_shlibs to gdb_load_shlib, and changes its
> arguments so that it can only take a single library at the time.
> 
> The following patch requires to be able to get the destination path of a
> loaded shared library, so it's more straightforward if the procedure can
> only accept one argument.
> 
> On top of the mass renaming, there are a handful of locations where I
> had to split up a gdb_load_shlibs in two gdb_load_shlib.
> 

I'd have been nicer and more focused if you split this in two:

 #1 - make gdb_load_shlibs accept only one shlib.
 #2 - do the trivial mass rename.

> -proc gdb_load_shlibs { args } {
> -    foreach file $args {
> -	gdb_remote_download target [shlib_target_file $file]
> -    }
> +proc gdb_load_shlib { file } {
> +    set dest [gdb_remote_download target [shlib_target_file $file]]
>  
>      if {[is_remote target]} {
>  	# If the target is remote, we need to tell gdb where to find the
> @@ -4237,8 +4235,10 @@ proc gdb_load_shlibs { args } {
>  	# We could set this even when not testing remotely, but a user
>  	# generally won't set it unless necessary.  In order to make the tests
>  	# more like the real-life scenarios, we don't set it for local testing.
> -	gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "" ""
> +	gdb_test "set solib-search-path [file dirname [lindex $file 0]]" "" ""

$file is no longer a list, so [lindex $file 0] can just be $file.

With:

 gdb_load_shlib $libobj1
 gdb_load_shlib $libobj2

We'll now only end up with $libobj2's dirname in the solib-search-path.
This usually won't be a problem since the dirnames will be the same,
though I guess some test might be doing something with subdirs.
Grepping a bit I found solib-search.exp, though it's currently disabled
on remote testing.

Do we need to maintain a list of dirnames, and clear it somewhere?

Thanks,
Pedro Alves
  
Simon Marchi April 13, 2016, 9:05 p.m. UTC | #2
On 16-04-13 02:18 PM, Pedro Alves wrote:
> On 04/13/2016 12:14 AM, Simon Marchi wrote:
>> Note: this series should be applied on top of
>>   https://sourceware.org/ml/gdb-patches/2016-04/msg00252.html
>>
>> -------
>>
>> This patch renames gdb_load_shlibs to gdb_load_shlib, and changes its
>> arguments so that it can only take a single library at the time.
>>
>> The following patch requires to be able to get the destination path of a
>> loaded shared library, so it's more straightforward if the procedure can
>> only accept one argument.
>>
>> On top of the mass renaming, there are a handful of locations where I
>> had to split up a gdb_load_shlibs in two gdb_load_shlib.
>>
> 
> I'd have been nicer and more focused if you split this in two:
> 
>  #1 - make gdb_load_shlibs accept only one shlib.
>  #2 - do the trivial mass rename.

Right, I'll have it split in v2.

>> -proc gdb_load_shlibs { args } {
>> -    foreach file $args {
>> -	gdb_remote_download target [shlib_target_file $file]
>> -    }
>> +proc gdb_load_shlib { file } {
>> +    set dest [gdb_remote_download target [shlib_target_file $file]]
>>  
>>      if {[is_remote target]} {
>>  	# If the target is remote, we need to tell gdb where to find the
>> @@ -4237,8 +4235,10 @@ proc gdb_load_shlibs { args } {
>>  	# We could set this even when not testing remotely, but a user
>>  	# generally won't set it unless necessary.  In order to make the tests
>>  	# more like the real-life scenarios, we don't set it for local testing.
>> -	gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "" ""
>> +	gdb_test "set solib-search-path [file dirname [lindex $file 0]]" "" ""
> 
> $file is no longer a list, so [lindex $file 0] can just be $file.

Right, fixed.

> With:
> 
>  gdb_load_shlib $libobj1
>  gdb_load_shlib $libobj2
> 
> We'll now only end up with $libobj2's dirname in the solib-search-path.
> This usually won't be a problem since the dirnames will be the same,
> though I guess some test might be doing something with subdirs.
> Grepping a bit I found solib-search.exp, though it's currently disabled
> on remote testing.

Ah that's true. For some reason I thought it appended to the list in GDB.

In the original implementation, it only used the dirname of the first passed
shared library, didn't it?  So the behavior will change (we will keep the
directory of the last one, where we used to keep the directory of the first
one), but is the situation worse than it was?

> Do we need to maintain a list of dirnames, and clear it somewhere?

If a test case needs to have multiple different values in solib-search-path,
we have multiple options.

Option #1

Maintain a list somewhere in the TCL code.  It's not my favorite, because
we already have a ton of global stuff hard to keep track of.

Option #2

Get the current value using "show solib-search-path" and append the new value
to it.

Option #3

Initially I thought of a lazy way to achieve what I want.  I thought to
make gdb_load_shlibs return a list of the destination paths (one for each
passed solib).  This way I wouldn't have had to modify all the callers.  If
we used this approach, we could build the list of all the directories and pass
that to set solib-search-path.

Options #4

Maybe it's not a big deal, tests that do some special solib path stuff can
just override solib-search-path as they see fit.  The setting of
solib-search-path in gdb_load_shlib[s] is only for convenience in the
general case.


Simon
  
Yao Qi April 14, 2016, 9:33 a.m. UTC | #3
Simon Marchi <simon.marchi@ericsson.com> writes:

> -proc gdb_load_shlibs { args } {
> -    foreach file $args {
> -	gdb_remote_download target [shlib_target_file $file]
> -    }
> +proc gdb_load_shlib { file } {
> +    set dest [gdb_remote_download target [shlib_target_file $file]]

Why don't define a new proc gdb_load_shlib but leave gdb_load_shlibs
there?  gdb_load_shlibs can invoke gdb_load_shlib in a loop, and callers
of gdb_load_shlibs are not changed.
  
Pedro Alves April 14, 2016, 11:28 a.m. UTC | #4
On 04/13/2016 10:05 PM, Simon Marchi wrote:
> On 16-04-13 02:18 PM, Pedro Alves wrote:

>> We'll now only end up with $libobj2's dirname in the solib-search-path.
>> This usually won't be a problem since the dirnames will be the same,
>> though I guess some test might be doing something with subdirs.
>> Grepping a bit I found solib-search.exp, though it's currently disabled
>> on remote testing.
> 
> Ah that's true. For some reason I thought it appended to the list in GDB.
> 
> In the original implementation, it only used the dirname of the first passed
> shared library, didn't it?  

You're right.  I only realized that after hitting send.

> So the behavior will change (we will keep the
> directory of the last one, where we used to keep the directory of the first
> one), but is the situation worse than it was?

Probably not.

> 
>> Do we need to maintain a list of dirnames, and clear it somewhere?
> 
> If a test case needs to have multiple different values in solib-search-path,
> we have multiple options.
> 
> Option #1
> 
> Maintain a list somewhere in the TCL code.  It's not my favorite, because
> we already have a ton of global stuff hard to keep track of.

Indeed.

> 
> Option #2
> 
> Get the current value using "show solib-search-path" and append the new value
> to it.

Interesting idea.

> 
> Option #3
> 
> Initially I thought of a lazy way to achieve what I want.  I thought to
> make gdb_load_shlibs return a list of the destination paths (one for each
> passed solib).  This way I wouldn't have had to modify all the callers.  If
> we used this approach, we could build the list of all the directories and pass
> that to set solib-search-path.
> 

Right.  Several tests call gdb_load_shlibs once for each lib, and we'd
need to merge those, for correct solib-search-path.

> Options #4
> 
> Maybe it's not a big deal, tests that do some special solib path stuff can
> just override solib-search-path as they see fit.

If testing something that needs to exercise something related to debugging a
set of libraries laid out in different directories like, e.g. having:

 plugin.so
 dir_1/plugin.so
 dir_1/dir_2/plugin.so
 dir_2/plugin.so
 dir_2/dir_1/plugin.so
 dir_2/dir_2/plugin.so

and exercising symbol the search code in solib.c:solib_find (e.g.,
mess with PATH/LD_LIBRARY_PATH), you still shouldn't need solib-search-path
when testing locally, and the testcase shouldn't need to explicitly
set solib-search-path.

It's just theoretical at this point though, given that as you found,
we already have the issue.

> The setting of
> solib-search-path in gdb_load_shlib[s] is only for convenience in the
> general case.

Since this turns out to be a pre-existing issue, I'm fine with ignoring 
it for now.

Thanks,
Pedro Alves
  
Simon Marchi April 14, 2016, 3:17 p.m. UTC | #5
On 16-04-14 05:33 AM, Yao Qi wrote:
> Simon Marchi <simon.marchi@ericsson.com> writes:
> 
>> -proc gdb_load_shlibs { args } {
>> -    foreach file $args {
>> -	gdb_remote_download target [shlib_target_file $file]
>> -    }
>> +proc gdb_load_shlib { file } {
>> +    set dest [gdb_remote_download target [shlib_target_file $file]]
> 
> Why don't define a new proc gdb_load_shlib but leave gdb_load_shlibs
> there?  gdb_load_shlibs can invoke gdb_load_shlib in a loop, and callers
> of gdb_load_shlibs are not changed.

It would have been the lazy but clever way to do it, for sure.  I hadn't
thought of that.

I am not sure I like it though, because it makes multiple procs that do kind
of the same thing, but with subtle differences.  That's what causes confusion
later.  It's the same feeling I had about gdb_download and gdb_remote_download...

Pedro (and others), what do you think?
  
Pedro Alves April 14, 2016, 3:27 p.m. UTC | #6
On 04/14/2016 04:17 PM, Simon Marchi wrote:
> On 16-04-14 05:33 AM, Yao Qi wrote:
>> Simon Marchi <simon.marchi@ericsson.com> writes:
>>
>>> -proc gdb_load_shlibs { args } {
>>> -    foreach file $args {
>>> -	gdb_remote_download target [shlib_target_file $file]
>>> -    }
>>> +proc gdb_load_shlib { file } {
>>> +    set dest [gdb_remote_download target [shlib_target_file $file]]
>>
>> Why don't define a new proc gdb_load_shlib but leave gdb_load_shlibs
>> there?  gdb_load_shlibs can invoke gdb_load_shlib in a loop, and callers
>> of gdb_load_shlibs are not changed.
> 
> It would have been the lazy but clever way to do it, for sure.  I hadn't
> thought of that.
> 
> I am not sure I like it though, because it makes multiple procs that do kind
> of the same thing, but with subtle differences.  That's what causes confusion
> later.  It's the same feeling I had about gdb_download and gdb_remote_download...
> 
> Pedro (and others), what do you think?

I agree that that may end up causing confusion.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/testsuite/gdb.arch/ftrace-insn-reloc.exp b/gdb/testsuite/gdb.arch/ftrace-insn-reloc.exp
index b7f7653..22ec90f 100644
--- a/gdb/testsuite/gdb.arch/ftrace-insn-reloc.exp
+++ b/gdb/testsuite/gdb.arch/ftrace-insn-reloc.exp
@@ -38,7 +38,7 @@  if ![gdb_target_supports_trace] {
 }
 
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 # Can't use prepare_for_testing, because that splits compiling into
 # building objects and then linking, and we'd fail with "linker input
diff --git a/gdb/testsuite/gdb.base/catch-load.exp b/gdb/testsuite/gdb.base/catch-load.exp
index 69a9407..5908e32 100644
--- a/gdb/testsuite/gdb.base/catch-load.exp
+++ b/gdb/testsuite/gdb.base/catch-load.exp
@@ -51,7 +51,7 @@  proc one_catch_load_test {scenario kind match sostop} {
 	global decimal gdb_prompt
 
 	clean_restart $testfile
-	gdb_load_shlibs $binfile2
+	gdb_load_shlib $binfile2
 
 	if {![runto_main]} {
 	    fail "can't run to main"
diff --git a/gdb/testsuite/gdb.base/ctxobj.exp b/gdb/testsuite/gdb.base/ctxobj.exp
index a4f5f37..9229ad6 100644
--- a/gdb/testsuite/gdb.base/ctxobj.exp
+++ b/gdb/testsuite/gdb.base/ctxobj.exp
@@ -55,7 +55,8 @@  if { [gdb_compile "${srcdir}/${subdir}/${executable}.c" \
 }
 
 clean_restart $executable
-gdb_load_shlibs $libobj1 $libobj2
+gdb_load_shlib $libobj1
+gdb_load_shlib $libobj2
 
 if ![runto_main] {
     untested "could not run to main"
diff --git a/gdb/testsuite/gdb.base/dprintf-pending.exp b/gdb/testsuite/gdb.base/dprintf-pending.exp
index ed7f5e8..5758c1b 100644
--- a/gdb/testsuite/gdb.base/dprintf-pending.exp
+++ b/gdb/testsuite/gdb.base/dprintf-pending.exp
@@ -63,7 +63,7 @@  with_test_prefix "without symbols" {
 	"single pending dprintf info"
 
     gdb_load ${binfile}
-    gdb_load_shlibs $lib_sl
+    gdb_load_shlib $lib_sl
 
     gdb_run_cmd
 
@@ -71,7 +71,7 @@  with_test_prefix "without symbols" {
 }
 
 clean_restart ${binfile}
-gdb_load_shlibs $lib_sl
+gdb_load_shlib $lib_sl
 
 #
 # Test setting, querying, and modifying pending breakpoints
diff --git a/gdb/testsuite/gdb.base/dso2dso.exp b/gdb/testsuite/gdb.base/dso2dso.exp
index 919eda4..336d46a 100644
--- a/gdb/testsuite/gdb.base/dso2dso.exp
+++ b/gdb/testsuite/gdb.base/dso2dso.exp
@@ -57,7 +57,8 @@  if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable \
 }
 
 clean_restart $binfile
-gdb_load_shlibs $binfile_libdso2 $binfile_libdso1
+gdb_load_shlib $binfile_libdso2
+gdb_load_shlib $binfile_libdso1
 
 if { ![runto_main] } {
   return -1
diff --git a/gdb/testsuite/gdb.base/fixsection.exp b/gdb/testsuite/gdb.base/fixsection.exp
index 66f585f..07b7bb5 100644
--- a/gdb/testsuite/gdb.base/fixsection.exp
+++ b/gdb/testsuite/gdb.base/fixsection.exp
@@ -44,7 +44,7 @@  gdb_exit
 gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/gcore-relro.exp b/gdb/testsuite/gdb.base/gcore-relro.exp
index 888300f..0467c90 100644
--- a/gdb/testsuite/gdb.base/gcore-relro.exp
+++ b/gdb/testsuite/gdb.base/gcore-relro.exp
@@ -36,7 +36,7 @@  set objfile [standard_output_file ${testfile}.o]
  }
 
 clean_restart ${binfile}
-gdb_load_shlibs ${binfile_lib}
+gdb_load_shlib ${binfile_lib}
 
 if ![runto lib] {
     return -1
@@ -49,7 +49,7 @@  if {![gdb_gcore_cmd $gcorefile "save a corefile"]} {
 # Now restart gdb and load the corefile.
 
 clean_restart ${binfile}
-gdb_load_shlibs ${binfile_lib}
+gdb_load_shlib ${binfile_lib}
 
 gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile"
 
diff --git a/gdb/testsuite/gdb.base/gdb1555.exp b/gdb/testsuite/gdb.base/gdb1555.exp
index 2c6fcc6..5d11195 100644
--- a/gdb/testsuite/gdb.base/gdb1555.exp
+++ b/gdb/testsuite/gdb.base/gdb1555.exp
@@ -42,7 +42,7 @@  if { [gdb_compile_shlib $libsrc $libobj {debug}] != ""
 }
 
 clean_restart ${binfile}
-gdb_load_shlibs $libobj
+gdb_load_shlib $libobj
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/global-var-nested-by-dso.exp b/gdb/testsuite/gdb.base/global-var-nested-by-dso.exp
index cf70bb1..c8bdd2b 100644
--- a/gdb/testsuite/gdb.base/global-var-nested-by-dso.exp
+++ b/gdb/testsuite/gdb.base/global-var-nested-by-dso.exp
@@ -45,7 +45,8 @@  if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable \
 }
 
 clean_restart $binfile
-gdb_load_shlibs $binfile_lib1 $binfile_lib2
+gdb_load_shlib $binfile_lib1
+gdb_load_shlib $binfile_lib2
 
 if { ![runto_main] } {
   return -1
diff --git a/gdb/testsuite/gdb.base/gnu-ifunc.exp b/gdb/testsuite/gdb.base/gnu-ifunc.exp
index 3d4ea37..097e48a9 100644
--- a/gdb/testsuite/gdb.base/gnu-ifunc.exp
+++ b/gdb/testsuite/gdb.base/gnu-ifunc.exp
@@ -59,7 +59,7 @@  if { [gdb_compile_shlib ${srcdir}/${subdir}/$libsrc $lib_so $lib_opts] != ""
 # Start with a fresh gdb.
 
 clean_restart $executable
-gdb_load_shlibs ${lib_so}
+gdb_load_shlib ${lib_so}
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp
index cc3c1fc..03a6b74 100644
--- a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp
+++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp
@@ -41,7 +41,7 @@  if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib_src} ${lib_so} $lib_opts] != "
 }
 
 clean_restart $binfile
-gdb_load_shlibs $lib_so
+gdb_load_shlib $lib_so
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/jit-so.exp b/gdb/testsuite/gdb.base/jit-so.exp
index 0135473..0db3259 100644
--- a/gdb/testsuite/gdb.base/jit-so.exp
+++ b/gdb/testsuite/gdb.base/jit-so.exp
@@ -68,7 +68,7 @@  proc one_jit_test {count match_str} {
 	global verbose testfile srcfile2 binfile2 binfile2_dlopen solib_binfile_target solib_binfile_test_msg
 
 	clean_restart $testfile
-	gdb_load_shlibs $binfile2
+	gdb_load_shlib $binfile2
 
 	# This is just to help debugging when things fail
 	if {$verbose > 0} {
diff --git a/gdb/testsuite/gdb.base/pending.exp b/gdb/testsuite/gdb.base/pending.exp
index 9685266..935fa14 100644
--- a/gdb/testsuite/gdb.base/pending.exp
+++ b/gdb/testsuite/gdb.base/pending.exp
@@ -62,7 +62,7 @@  gdb_test "info break" \
 "single pending breakpoint info (without symbols)"
 
 gdb_load ${binfile}
-gdb_load_shlibs $lib_sl
+gdb_load_shlib $lib_sl
 
 set pendfunc1_loc [gdb_get_line_number "y = x + 4" ${libfile}.c]
 
@@ -79,7 +79,7 @@  gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 
 gdb_load ${binfile}
-gdb_load_shlibs $lib_sl
+gdb_load_shlib $lib_sl
 
 #
 # Test setting, querying, and modifying pending breakpoints
diff --git a/gdb/testsuite/gdb.base/print-file-var.exp b/gdb/testsuite/gdb.base/print-file-var.exp
index 112585a..ec28828 100644
--- a/gdb/testsuite/gdb.base/print-file-var.exp
+++ b/gdb/testsuite/gdb.base/print-file-var.exp
@@ -46,7 +46,8 @@  if { [gdb_compile "${srcdir}/${subdir}/${executable}.c" \
 }
 
 clean_restart $executable
-gdb_load_shlibs $libobj1 $libobj2
+gdb_load_shlib $libobj1
+gdb_load_shlib $libobj2
 
 if ![runto_main] {
     untested "could not run to main"
diff --git a/gdb/testsuite/gdb.base/print-symbol-loading.exp b/gdb/testsuite/gdb.base/print-symbol-loading.exp
index 2d0e22a..ac7d67a 100644
--- a/gdb/testsuite/gdb.base/print-symbol-loading.exp
+++ b/gdb/testsuite/gdb.base/print-symbol-loading.exp
@@ -38,7 +38,7 @@  if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } {
 }
 
 clean_restart ${binfile}
-gdb_load_shlibs ${binfile_lib}
+gdb_load_shlib ${binfile_lib}
 
 if ![runto lib] {
     return -1
diff --git a/gdb/testsuite/gdb.base/shlib-call.exp b/gdb/testsuite/gdb.base/shlib-call.exp
index 81d2e03..80491b7 100644
--- a/gdb/testsuite/gdb.base/shlib-call.exp
+++ b/gdb/testsuite/gdb.base/shlib-call.exp
@@ -57,7 +57,8 @@  if { [gdb_compile_shlib ${lib1src} ${lib1} $lib_opts] != ""
 # Start with a fresh gdb.
 
 clean_restart ${binfile}
-gdb_load_shlibs $lib1 $lib2
+gdb_load_shlib $lib1
+gdb_load_shlib $lib2
 
 gdb_test_no_output "set print sevenbit-strings"
 gdb_test_no_output "set print address off"
diff --git a/gdb/testsuite/gdb.base/shreloc.exp b/gdb/testsuite/gdb.base/shreloc.exp
index 3b1ec24..548568e 100644
--- a/gdb/testsuite/gdb.base/shreloc.exp
+++ b/gdb/testsuite/gdb.base/shreloc.exp
@@ -72,7 +72,8 @@  if { [gdb_compile_shlib $lib1src $lib1_sl $lib_opts] != ""} {
 # Start with a fresh gdb.
 
 clean_restart $binfile
-gdb_load_shlibs $lib1_sl $lib2_sl
+gdb_load_shlib $lib1_sl
+gdb_load_shlib $lib2_sl
 
 # Load up the shared objects
 if ![runto_main] then {
diff --git a/gdb/testsuite/gdb.base/so-impl-ld.exp b/gdb/testsuite/gdb.base/so-impl-ld.exp
index 67d2804..4223d4c 100644
--- a/gdb/testsuite/gdb.base/so-impl-ld.exp
+++ b/gdb/testsuite/gdb.base/so-impl-ld.exp
@@ -40,7 +40,7 @@  if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
 # Start with a fresh gdb
 
 clean_restart ${binfile}
-gdb_load_shlibs $lib_sl
+gdb_load_shlib $lib_sl
 
 # This program implicitly loads SOM shared libraries.
 #
diff --git a/gdb/testsuite/gdb.base/solib-disc.exp b/gdb/testsuite/gdb.base/solib-disc.exp
index 2d3e6f4..66cf960 100644
--- a/gdb/testsuite/gdb.base/solib-disc.exp
+++ b/gdb/testsuite/gdb.base/solib-disc.exp
@@ -53,7 +53,7 @@  gdb_exit
 gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs $libobj
+gdb_load_shlib $libobj
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/solib-nodir.exp b/gdb/testsuite/gdb.base/solib-nodir.exp
index 5391ac7..e4f15d0 100644
--- a/gdb/testsuite/gdb.base/solib-nodir.exp
+++ b/gdb/testsuite/gdb.base/solib-nodir.exp
@@ -41,7 +41,7 @@  if { [get_compiler_info]
 }
 
 clean_restart $executable
-gdb_load_shlibs ${binlibfile}
+gdb_load_shlib ${binlibfile}
 
 gdb_test_no_output "set env LD_LIBRARY_PATH=:"
 gdb_test "cd ${binlibfiledir}" "Working directory [string_to_regexp ${binlibfiledir}]\\." "cd OBJDIR/${subdir}"
diff --git a/gdb/testsuite/gdb.base/solib-overlap.exp b/gdb/testsuite/gdb.base/solib-overlap.exp
index e7e084c..40fdd09 100644
--- a/gdb/testsuite/gdb.base/solib-overlap.exp
+++ b/gdb/testsuite/gdb.base/solib-overlap.exp
@@ -99,7 +99,8 @@  foreach prelink_lib1 {0x40000000 0x50000000} { with_test_prefix "$prelink_lib1"
 
     clean_restart ${binfile_base}
     # This testcase currently does not support remote targets.
-    # gdb_load_shlibs ${binfile_lib1} ${binfile_lib2}
+    # gdb_load_shlib ${binfile_lib1}
+    # gdb_load_shlib ${binfile_lib2}
 
     # Here we should get:
     # warning: .dynamic section for ".../solib-overlap-lib1.so" is not at the expected address (wrong library or version mismatch?)
diff --git a/gdb/testsuite/gdb.base/solib-symbol.exp b/gdb/testsuite/gdb.base/solib-symbol.exp
index eabd24c..1ff4b3d 100644
--- a/gdb/testsuite/gdb.base/solib-symbol.exp
+++ b/gdb/testsuite/gdb.base/solib-symbol.exp
@@ -44,7 +44,7 @@  gdb_exit
 gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs $binfile_lib
+gdb_load_shlib $binfile_lib
 
 # Set a breakpoint in the binary.
 gdb_test "br foo2" \
diff --git a/gdb/testsuite/gdb.base/solib-weak.exp b/gdb/testsuite/gdb.base/solib-weak.exp
index 74bc1f3..939df3f 100644
--- a/gdb/testsuite/gdb.base/solib-weak.exp
+++ b/gdb/testsuite/gdb.base/solib-weak.exp
@@ -94,7 +94,8 @@  proc do_test { lib1opts lib2opts lib1first } {
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
     gdb_load ${binfile}
-    gdb_load_shlibs $lib1 $lib2
+    gdb_load_shlib $lib1
+    gdb_load_shlib $lib2
 
     runto_main
 
diff --git a/gdb/testsuite/gdb.base/sym-file.exp b/gdb/testsuite/gdb.base/sym-file.exp
index e95eafe..6febac3 100644
--- a/gdb/testsuite/gdb.base/sym-file.exp
+++ b/gdb/testsuite/gdb.base/sym-file.exp
@@ -73,7 +73,7 @@  if {[prepare_for_testing $testfile  $binfile "$srcfile $srcfile2" $exec_opts]} {
     return
 }
 
-gdb_load_shlibs ${lib_so}
+gdb_load_shlib ${lib_so}
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/symtab-search-order.exp b/gdb/testsuite/gdb.base/symtab-search-order.exp
index c60aa35..f8f9036 100644
--- a/gdb/testsuite/gdb.base/symtab-search-order.exp
+++ b/gdb/testsuite/gdb.base/symtab-search-order.exp
@@ -40,7 +40,7 @@  if { [gdb_compile_shlib $lib1src $lib1 $lib_opts] != ""
 # Start with a fresh gdb.
 
 clean_restart $binfile
-gdb_load_shlibs $lib1
+gdb_load_shlib $lib1
 
 if ![runto_main] {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/type-opaque.exp b/gdb/testsuite/gdb.base/type-opaque.exp
index 6f42e8f..2b12752 100644
--- a/gdb/testsuite/gdb.base/type-opaque.exp
+++ b/gdb/testsuite/gdb.base/type-opaque.exp
@@ -40,7 +40,7 @@  if { [gdb_compile_shlib $libsrc $libobj {debug}] != ""
 }
 
 clean_restart ${binfile}
-gdb_load_shlibs ${libobj}
+gdb_load_shlib ${libobj}
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.base/unload.exp b/gdb/testsuite/gdb.base/unload.exp
index 6d4133d..c058d3a 100644
--- a/gdb/testsuite/gdb.base/unload.exp
+++ b/gdb/testsuite/gdb.base/unload.exp
@@ -62,7 +62,8 @@  gdb_exit
 gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs $lib_sl $lib_sl2
+gdb_load_shlib $lib_sl
+gdb_load_shlib $lib_sl2
 
 #
 # Test setting a breakpoint in a dynamically loaded library which is
diff --git a/gdb/testsuite/gdb.base/watchpoint-solib.exp b/gdb/testsuite/gdb.base/watchpoint-solib.exp
index 04faebe..bd50064 100644
--- a/gdb/testsuite/gdb.base/watchpoint-solib.exp
+++ b/gdb/testsuite/gdb.base/watchpoint-solib.exp
@@ -52,7 +52,7 @@  gdb_exit
 gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs $lib_sl
+gdb_load_shlib $lib_sl
 
 runto_main
 
diff --git a/gdb/testsuite/gdb.compile/compile.exp b/gdb/testsuite/gdb.compile/compile.exp
index a8bfc24..f3c1cb9 100644
--- a/gdb/testsuite/gdb.compile/compile.exp
+++ b/gdb/testsuite/gdb.compile/compile.exp
@@ -371,7 +371,7 @@  if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile2} $libbin {debug}] != ""
 }
 
 clean_restart $binfile
-gdb_load_shlibs $libbin
+gdb_load_shlib $libbin
 
 if ![runto_main] {
     return -1
diff --git a/gdb/testsuite/gdb.cp/gdb2384.exp b/gdb/testsuite/gdb.cp/gdb2384.exp
index e945e1b..66c6cb1 100644
--- a/gdb/testsuite/gdb.cp/gdb2384.exp
+++ b/gdb/testsuite/gdb.cp/gdb2384.exp
@@ -41,7 +41,7 @@  if { [gdb_compile_shlib $srcdir/$subdir/$srcfile2 $sofile {debug c++}] != ""
 }
 
 clean_restart ${binfile}
-gdb_load_shlibs ${sofile}
+gdb_load_shlib ${sofile}
 
 
 if ![runto_main] then {
diff --git a/gdb/testsuite/gdb.cp/infcall-dlopen.exp b/gdb/testsuite/gdb.cp/infcall-dlopen.exp
index 9ac6131..25ead40 100644
--- a/gdb/testsuite/gdb.cp/infcall-dlopen.exp
+++ b/gdb/testsuite/gdb.cp/infcall-dlopen.exp
@@ -31,7 +31,7 @@  if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile2} ${libfile} {debug c++}]
     return -1
 }
 
-gdb_load_shlibs $libfile
+gdb_load_shlib $libfile
 
 if { ![runto_main] } {
     return -1
diff --git a/gdb/testsuite/gdb.cp/re-set-overloaded.exp b/gdb/testsuite/gdb.cp/re-set-overloaded.exp
index 18cb2f3..3d5d607 100644
--- a/gdb/testsuite/gdb.cp/re-set-overloaded.exp
+++ b/gdb/testsuite/gdb.cp/re-set-overloaded.exp
@@ -33,7 +33,7 @@  if { [gdb_compile_shlib $srcdir/$subdir/$srcfile2 $sofile {debug c++}] != ""
 }
 
 clean_restart $testfile
-gdb_load_shlibs ${sofile}
+gdb_load_shlib ${sofile}
 
 gdb_test_no_output "set breakpoint pending yes"
 gdb_test "break C::C" {Breakpoint [0-9]+ \(C::C\) pending\.} "break C::C"
diff --git a/gdb/testsuite/gdb.fortran/library-module.exp b/gdb/testsuite/gdb.fortran/library-module.exp
index ded844a..8a913ed 100644
--- a/gdb/testsuite/gdb.fortran/library-module.exp
+++ b/gdb/testsuite/gdb.fortran/library-module.exp
@@ -39,7 +39,7 @@  if  { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable [list debug f90
 
 clean_restart $testfile
 
-gdb_load_shlibs $libfile
+gdb_load_shlib $libfile
 
 if ![runto MAIN__] then {
     perror "couldn't run to breakpoint MAIN__"
diff --git a/gdb/testsuite/gdb.opt/solib-intra-step.exp b/gdb/testsuite/gdb.opt/solib-intra-step.exp
index 3e0ec85..c8c156f 100644
--- a/gdb/testsuite/gdb.opt/solib-intra-step.exp
+++ b/gdb/testsuite/gdb.opt/solib-intra-step.exp
@@ -41,7 +41,7 @@  if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != ""
 }
 
 clean_restart ${binfile}
-gdb_load_shlibs $binfile_lib
+gdb_load_shlib $binfile_lib
 
 if ![runto_main] then {
   return 0
diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp
index 5b4160b..81c7bbd 100644
--- a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp
+++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp
@@ -61,7 +61,7 @@  if { [skip_python_tests] } { continue }
 #
 
 clean_restart ${testfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 if ![runto_main] then {
     fail "Cannot run to main."
@@ -108,7 +108,7 @@  gdb_test "python MyFinishBreakpoint (None, gdb.selected_frame ())" \
 #
 
 clean_restart ${testfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 gdb_test "source $python_file" "Python script imported.*" \
          "import python scripts"
@@ -135,7 +135,7 @@  gdb_test "python print (finishBP.return_value)" "None" "check return value witho
 #
 
 clean_restart ${testfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 gdb_test "source $python_file" "Python script imported.*" \
          "import python scripts"
@@ -161,7 +161,7 @@  gdb_test "python print (finishbp.is_valid())" "False.*"\
 #
 
 clean_restart ${testfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 gdb_test "source $python_file" "Python script imported.*" \
          "import python scripts"
@@ -187,7 +187,7 @@  gdb_test "print i" "8" "check stopped location"
 #
 
 clean_restart ${testfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 gdb_test "source $python_file" "Python script imported.*" \
          "import python scripts"
@@ -214,7 +214,7 @@  gdb_test "print i" "8" "check stopped location"
 #
 
 clean_restart ${testfile}
-gdb_load_shlibs ${lib_sl}
+gdb_load_shlib ${lib_sl}
 
 gdb_test "source $python_file" "Python script imported.*" \
          "import python scripts"
diff --git a/gdb/testsuite/gdb.python/py-shared.exp b/gdb/testsuite/gdb.python/py-shared.exp
index 16375ed..8673e54 100644
--- a/gdb/testsuite/gdb.python/py-shared.exp
+++ b/gdb/testsuite/gdb.python/py-shared.exp
@@ -41,7 +41,7 @@  if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable $exec_opt
 
 # Start with a fresh gdb.
 clean_restart $testfile
-gdb_load_shlibs ${library}
+gdb_load_shlib ${library}
 
 # Skip all tests if Python scripting is not enabled.
 if { [skip_python_tests] } { continue }
diff --git a/gdb/testsuite/gdb.reverse/solib-precsave.exp b/gdb/testsuite/gdb.reverse/solib-precsave.exp
index e862818..6ce26eb 100644
--- a/gdb/testsuite/gdb.reverse/solib-precsave.exp
+++ b/gdb/testsuite/gdb.reverse/solib-precsave.exp
@@ -76,8 +76,8 @@  gdb_start
 
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs $library1
-gdb_load_shlibs $library2
+gdb_load_shlib $library1
+gdb_load_shlib $library2
 
 runto main
 
diff --git a/gdb/testsuite/gdb.reverse/solib-reverse.exp b/gdb/testsuite/gdb.reverse/solib-reverse.exp
index d9a9c7e..a370e94 100644
--- a/gdb/testsuite/gdb.reverse/solib-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/solib-reverse.exp
@@ -68,8 +68,8 @@  gdb_start
 
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
-gdb_load_shlibs $library1
-gdb_load_shlibs $library2
+gdb_load_shlib $library1
+gdb_load_shlib $library2
 
 runto main
 
diff --git a/gdb/testsuite/gdb.server/solib-list.exp b/gdb/testsuite/gdb.server/solib-list.exp
index f60dcb8..5347f18 100644
--- a/gdb/testsuite/gdb.server/solib-list.exp
+++ b/gdb/testsuite/gdb.server/solib-list.exp
@@ -48,7 +48,7 @@  foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
     gdb_exit
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
-    gdb_load_shlibs ${binlibfile}
+    gdb_load_shlib ${binlibfile}
 
     set remote_binfile [gdb_remote_download target $binfile]
 
diff --git a/gdb/testsuite/gdb.threads/dlopen-libpthread.exp b/gdb/testsuite/gdb.threads/dlopen-libpthread.exp
index 206b16a..8ad9acd 100644
--- a/gdb/testsuite/gdb.threads/dlopen-libpthread.exp
+++ b/gdb/testsuite/gdb.threads/dlopen-libpthread.exp
@@ -34,7 +34,7 @@  if {$relink_args == "" || ![prelink_no $relink_args]
     || [prepare_for_testing ${testfile}.exp ${executable} ${srcmainfile} {debug shlib_load}] } {
     return -1
 }
-gdb_load_shlibs $binfile_lib
+gdb_load_shlib $binfile_lib
 
 if { ![runto_main] } {
     return -1
diff --git a/gdb/testsuite/gdb.threads/tls-shared.exp b/gdb/testsuite/gdb.threads/tls-shared.exp
index 6d52ac6..804e28a 100644
--- a/gdb/testsuite/gdb.threads/tls-shared.exp
+++ b/gdb/testsuite/gdb.threads/tls-shared.exp
@@ -36,7 +36,7 @@  if { [gdb_compile_shlib_pthreads ${srcdir}/${subdir}/${srcfile_lib} ${binfile_li
 
 
 clean_restart ${binfile}
-gdb_load_shlibs ${binfile_lib}
+gdb_load_shlib ${binfile_lib}
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.threads/tls-so_extern.exp b/gdb/testsuite/gdb.threads/tls-so_extern.exp
index 189897a..dde7bcd 100644
--- a/gdb/testsuite/gdb.threads/tls-so_extern.exp
+++ b/gdb/testsuite/gdb.threads/tls-so_extern.exp
@@ -35,7 +35,7 @@  if { [gdb_compile_shlib_pthreads ${srcdir}/${subdir}/${srcfile_lib} ${binfile_li
 
 
 clean_restart ${binfile}
-gdb_load_shlibs ${binfile_lib}
+gdb_load_shlib ${binfile_lib}
 
 if ![runto_main] then {
     fail "Can't run to main"
diff --git a/gdb/testsuite/gdb.trace/change-loc.exp b/gdb/testsuite/gdb.trace/change-loc.exp
index c4e0b4b..9fef3f0 100644
--- a/gdb/testsuite/gdb.trace/change-loc.exp
+++ b/gdb/testsuite/gdb.trace/change-loc.exp
@@ -45,8 +45,8 @@  if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
 
 clean_restart $executable
 
-gdb_load_shlibs $lib_sl1
-gdb_load_shlibs $lib_sl2
+gdb_load_shlib $lib_sl1
+gdb_load_shlib $lib_sl2
 
 if ![runto_main] {
     fail "Can't run to main to check for trace support"
@@ -354,7 +354,7 @@  tracepoint_install_in_trace_disabled "trace"
 
 # Re-compile test case with IPA.
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable \
 	  [list debug nowarnings shlib=$libipa shlib=$lib_sl1 shlib_load] ] != "" } {
diff --git a/gdb/testsuite/gdb.trace/ftrace-lock.exp b/gdb/testsuite/gdb.trace/ftrace-lock.exp
index 077a261..dc0174b 100644
--- a/gdb/testsuite/gdb.trace/ftrace-lock.exp
+++ b/gdb/testsuite/gdb.trace/ftrace-lock.exp
@@ -48,7 +48,7 @@  if ![gdb_target_supports_trace] {
 
 # Compile the test case with the in-process agent library.
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 lappend options shlib=$libipa
 
diff --git a/gdb/testsuite/gdb.trace/ftrace.exp b/gdb/testsuite/gdb.trace/ftrace.exp
index 23e7d1e..da1d87c 100644
--- a/gdb/testsuite/gdb.trace/ftrace.exp
+++ b/gdb/testsuite/gdb.trace/ftrace.exp
@@ -38,7 +38,7 @@  if ![gdb_target_supports_trace] {
 }
 
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 # Can't use prepare_for_testing, because that splits compiling into
 # building objects and then linking, and we'd fail with "linker input
diff --git a/gdb/testsuite/gdb.trace/mi-tracepoint-changed.exp b/gdb/testsuite/gdb.trace/mi-tracepoint-changed.exp
index d27b2c4..a0e49af 100644
--- a/gdb/testsuite/gdb.trace/mi-tracepoint-changed.exp
+++ b/gdb/testsuite/gdb.trace/mi-tracepoint-changed.exp
@@ -63,8 +63,8 @@  proc test_reconnect { } {
 	}
 
 	clean_restart $executable
-	gdb_load_shlibs $lib_sl1
-	gdb_load_shlibs $lib_sl2
+	gdb_load_shlib $lib_sl1
+	gdb_load_shlib $lib_sl2
 	if ![runto_main] then {
 	    fail "Can't run to main"
 	    return 0
@@ -243,8 +243,8 @@  proc test_pending_resolved { } {
 
 clean_restart $executable
 
-gdb_load_shlibs $lib_sl1
-gdb_load_shlibs $lib_sl2
+gdb_load_shlib $lib_sl1
+gdb_load_shlib $lib_sl2
 
 if ![runto_main] {
     fail "Can't run to main to check for trace support"
diff --git a/gdb/testsuite/gdb.trace/pending.exp b/gdb/testsuite/gdb.trace/pending.exp
index 43f4c60..f7905fb 100644
--- a/gdb/testsuite/gdb.trace/pending.exp
+++ b/gdb/testsuite/gdb.trace/pending.exp
@@ -43,8 +43,8 @@  if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""
 
 clean_restart $executable
 
-gdb_load_shlibs $lib_sl1
-gdb_load_shlibs $lib_sl2
+gdb_load_shlib $lib_sl1
+gdb_load_shlib $lib_sl2
 
 if ![runto_main] {
     fail "Can't run to main to check for trace support"
@@ -503,7 +503,7 @@  pending_tracepoint_installed_during_trace "trace"
 
 # Re-compile test case with IPA.
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 lappend exec_opts "shlib=$libipa"
 
diff --git a/gdb/testsuite/gdb.trace/range-stepping.exp b/gdb/testsuite/gdb.trace/range-stepping.exp
index e166c03..b135963 100644
--- a/gdb/testsuite/gdb.trace/range-stepping.exp
+++ b/gdb/testsuite/gdb.trace/range-stepping.exp
@@ -67,7 +67,7 @@  proc range_stepping_with_tracepoint { type } {
 range_stepping_with_tracepoint "trace"
 
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
 	  executable [list debug nowarnings shlib=$libipa] ] != "" } {
diff --git a/gdb/testsuite/gdb.trace/strace.exp b/gdb/testsuite/gdb.trace/strace.exp
index 06b79a3..6394926 100644
--- a/gdb/testsuite/gdb.trace/strace.exp
+++ b/gdb/testsuite/gdb.trace/strace.exp
@@ -49,7 +49,7 @@  proc strace_remove_socket { action } {
 
     # Restart with a fresh gdb.
     clean_restart $executable
-    gdb_load_shlibs $libipa
+    gdb_load_shlib $libipa
     if ![runto_main] {
 	fail "Can't run to main"
 	return -1
@@ -134,7 +134,7 @@  proc strace_info_marker { } {
 
 	# Restart with a fresh gdb.
 	clean_restart $executable
-	gdb_load_shlibs $libipa
+	gdb_load_shlib $libipa
 	if ![runto_main] {
 	    fail "Can't run to main"
 	    return -1
@@ -171,7 +171,7 @@  proc strace_probe_marker { } {
 
 	# Restart with a fresh gdb.
 	clean_restart $executable
-	gdb_load_shlibs $libipa
+	gdb_load_shlib $libipa
 	if ![runto_main] {
 	    fail "Can't run to main"
 	    return -1
@@ -211,7 +211,7 @@  proc strace_trace_on_same_addr { type } {
 
 	# Restart with a fresh gdb.
 	clean_restart $executable
-	gdb_load_shlibs $libipa
+	gdb_load_shlib $libipa
 	if ![runto_main] {
 	    fail "Can't run to main"
 	    return -1
@@ -315,7 +315,7 @@  proc strace_trace_on_diff_addr { } {
 
 	# Restart with a fresh gdb.
 	clean_restart $executable
-	gdb_load_shlibs $libipa
+	gdb_load_shlib $libipa
 	if ![runto_main] {
 	    fail "Can't run to main"
 	    return -1
@@ -375,7 +375,7 @@  if { [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"] } {
 }
 
 clean_restart $executable
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 if ![runto_main] {
     fail "Can't run to main to check for trace support"
     return -1
diff --git a/gdb/testsuite/gdb.trace/trace-break.exp b/gdb/testsuite/gdb.trace/trace-break.exp
index a264822..afa8430 100644
--- a/gdb/testsuite/gdb.trace/trace-break.exp
+++ b/gdb/testsuite/gdb.trace/trace-break.exp
@@ -349,7 +349,7 @@  break_trace_same_addr_6 "trace" "enable" "trace" "disable"
 break_trace_same_addr_6 "trace" "disable" "trace" "enable"
 
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 # Can't use prepare_for_testing, because that splits compiling into
 # building objects and then linking, and we'd fail with "linker input
diff --git a/gdb/testsuite/gdb.trace/trace-condition.exp b/gdb/testsuite/gdb.trace/trace-condition.exp
index 2c47028..3d55766 100644
--- a/gdb/testsuite/gdb.trace/trace-condition.exp
+++ b/gdb/testsuite/gdb.trace/trace-condition.exp
@@ -38,7 +38,7 @@  if ![gdb_target_supports_trace] {
 }
 
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 # Can't use prepare_for_testing, because that splits compiling into
 # building objects and then linking, and we'd fail with "linker input
diff --git a/gdb/testsuite/gdb.trace/trace-mt.exp b/gdb/testsuite/gdb.trace/trace-mt.exp
index af4bdfb..634bd85 100644
--- a/gdb/testsuite/gdb.trace/trace-mt.exp
+++ b/gdb/testsuite/gdb.trace/trace-mt.exp
@@ -107,7 +107,7 @@  foreach break_always_inserted { "on" "off" } {
 step_over_tracepoint "trace"
 
 set libipa [get_in_proc_agent]
-gdb_load_shlibs $libipa
+gdb_load_shlib $libipa
 
 # Compile test case again with IPA.
 if { [gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile \
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 1ef6a96..b66bd6e 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -4221,14 +4221,12 @@  proc gdb_remote_download {dest fromfile {tofile {}}} {
     }
 }
 
-# gdb_load_shlibs LIB...
+# gdb_load_shlib LIB...
 #
 # Copy the listed libraries to the target.
 
-proc gdb_load_shlibs { args } {
-    foreach file $args {
-	gdb_remote_download target [shlib_target_file $file]
-    }
+proc gdb_load_shlib { file } {
+    set dest [gdb_remote_download target [shlib_target_file $file]]
 
     if {[is_remote target]} {
 	# If the target is remote, we need to tell gdb where to find the
@@ -4237,8 +4235,10 @@  proc gdb_load_shlibs { args } {
 	# We could set this even when not testing remotely, but a user
 	# generally won't set it unless necessary.  In order to make the tests
 	# more like the real-life scenarios, we don't set it for local testing.
-	gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "" ""
+	gdb_test "set solib-search-path [file dirname [lindex $file 0]]" "" ""
     }
+
+    return $dest
 }
 
 #