This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Make gdb.server/solib-list.exp work for remote targets
- From: Simon Marchi <simon dot marchi at ericsson dot com>
- To: Pedro Alves <palves at redhat dot com>, <gdb-patches at sourceware dot org>
- Date: Fri, 8 Apr 2016 18:43:19 -0400
- Subject: Re: [PATCH] Make gdb.server/solib-list.exp work for remote targets
- Authentication-results: sourceware.org; auth=none
- References: <1460153899-5185-1-git-send-email-simon dot marchi at ericsson dot com> <570831A6 dot 7070901 at redhat dot com>
On 16-04-08 06:33 PM, Pedro Alves wrote:
> Looks good, though see comments below. Thanks for doing this.
>
> On 04/08/2016 11:18 PM, Simon Marchi wrote:
>
>> gdb/testsuite/ChangeLog:
>>
>> * gdb.server/solib-list.exp: Allow running with remote targets.
>
> Pedantically, this is really a "why", not a "what". Should be something
> around:
>
> * gdb.server/solib-list.exp: Remove is_remote check.
> Pass shlib= to gdb_compile. Don't link shared library with
> -soname. Call gdb_remote_download instead of gdb_load_shlibs.
> Run binary filename through "readlink -f" on the target.
I first started listing everything, and thought "my god this is getting really long".
But you're right. I'll steal it, thanks for writing it :).
>> @@ -75,8 +74,7 @@ foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
>> # Note we pass ${interp_system}, the program gdbserver spawns, as
>> # argument here, instead of using gdb_load, because we don't want
>> # to download the interpreter to the target (it's already there)
>> - # or to the test output directory.
>
> Did you remove this line on purpose? If so, missing period. :-)
Oops no.
> BTW, I actually meant to extended it to:
>
> "or to the test output directory, when local testing."
>
> before pushing the previous patch, but forgot.
I'll let you do it in a separate patch, if you want.
>> - set res [gdbserver_spawn "${interp_system} ${binfile}"]
>> + set res [gdbserver_spawn "${interp_system} ${remote_binfile}"]
>> set gdbserver_protocol [lindex $res 0]
>> set gdbserver_gdbport [lindex $res 1]
>
> Thanks,
> Pedro Alves
Updated:
>From c4d7227e5ac9aa5f7e0b083bd40c9c06d97026f6 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@ericsson.com>
Date: Fri, 8 Apr 2016 17:38:46 -0400
Subject: [PATCH] Make gdb.server/solib-list.exp work for remote targets
There are a few small changes needed to make it work with a real remote
target.
- Remove the [is_remote target] check.
- Remove soname setting when building the lib, it's done by default now
anyway.
- In the compilation of the executable, pass the shared lib using the
shlib option, so that RPATH is set.
- Download the program to the target using gdb_remote_download, and
record the remote path. Remove loading of the program using
gdb_load_shlibs, which was not really appropriate anyway.
- Run the remote path through readlink (see comment in the code).
- Start gdbserver with the remote path.
Also, don't set executable and objfile variables, as they are unused.
Tested with native, native-gdbserver, native-extended-gdbserver, and a
remote gdbserver.
gdb/testsuite/ChangeLog:
* gdb.server/solib-list.exp: Remove is_remote check.
Pass shlib= to gdb_compile. Don't link shared library with
-soname. Call gdb_remote_download instead of gdb_load_shlibs.
Run binary filename through "readlink -f" on the target.
---
gdb/testsuite/gdb.server/solib-list.exp | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/gdb/testsuite/gdb.server/solib-list.exp b/gdb/testsuite/gdb.server/solib-list.exp
index 9d5cdcc..f60dcb8 100644
--- a/gdb/testsuite/gdb.server/solib-list.exp
+++ b/gdb/testsuite/gdb.server/solib-list.exp
@@ -27,22 +27,13 @@ if {[skip_gdbserver_tests] || [skip_shlib_tests]} {
return
}
-# This test case (currently) does not support remote targets, since it
-# assumes the ELF interpreter can be found on the host system
-if [is_remote target] then {
- return
-}
-
standard_testfile solib-list-main.c
set srclibfile ${testfile}-lib.c
set binlibfile [standard_output_file ${testfile}.so]
-set executable ${testfile}
-set objfile ${binfile}.o
if { [get_compiler_info]
- || [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" "${binlibfile}" [list debug ldflags=-Wl,-soname,${binlibfile}]] != ""
- || [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != ""
- || [gdb_compile "${objfile} ${binlibfile}" "${binfile}" executable {}] != "" } {
+ || [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" "${binlibfile}" {debug}] != ""
+ || [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "shlib=${binlibfile}"] != "" } {
untested "could not compile sources"
return -1
}
@@ -57,9 +48,17 @@ foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
- gdb_load_shlibs ${binfile}
gdb_load_shlibs ${binlibfile}
+ set remote_binfile [gdb_remote_download target $binfile]
+
+ # When testing remote, the file path we receive may be only the file name,
+ # "solib-list". ld-linux doesn't seem to be able to find the file when
+ # passing just the file name, it wants either the absolute path or a
+ # relative path with at least one directory component. Calling readlink on
+ # the target to get the full path will make it happy.
+ set remote_binfile [lindex [remote_exec target "readlink -f $remote_binfile"] 1]
+
# Make sure we're disconnected, in case we're testing with an
# extended-remote board, therefore already connected.
gdb_test "disconnect" ".*"
@@ -76,7 +75,7 @@ foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
# argument here, instead of using gdb_load, because we don't want
# to download the interpreter to the target (it's already there)
# or to the test output directory.
- set res [gdbserver_spawn "${interp_system} ${binfile}"]
+ set res [gdbserver_spawn "${interp_system} ${remote_binfile}"]
set gdbserver_protocol [lindex $res 0]
set gdbserver_gdbport [lindex $res 1]
--
2.8.1