This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
shared libraries and a remote target
- To: Andrew Cagney <ac131313 at cygnus dot com>, GDB patches <gdb-patches at sourceware dot cygnus dot com>, Kevin Buettner <kevinb at cygnus dot com>
- Subject: shared libraries and a remote target
- From: Stephen Smith <ischis2 at home dot com>
- Date: Wed, 18 Jul 2001 10:54:32 -0700
I am re-submitting the patch contained in this email. The the last of the discussion is at
http://sources.redhat.com/ml/gdb/2001-03/msg00234.html
and the original patch submittal is at
http://sources.redhat.com/ml/gdb-patches/2001-04/msg00185.html
The patches still apply cleanly to the development tree - I tried this morning.
Thanks
sps
* configure.tgt add i*86-*-pe* target to be mapped to embed
* main.c add remote-shared-libs and no-remote-shared-libs switches to gdb
* remote.c add functions - remote_get_list_of_shared_libraries and findFile
to support an optional extention to the remote protocol
which is enabled with the remote-shared-libs switch. The default
is disabled.
* symfile.c make add_symbol_file_command visible visible to functions outside
of symfile.c so that remote_get_list_of_shared_libraries can call it.
* symfile.h ditto
* top.c add the remote_shared_libs variable to hold the state of the
remote-shared-libs and no-remote-shared-libs switches. This variable is
used in remote.c
* top.h ditto
Index: configure.tgt
===================================================================
RCS file: /cvs/src/src/gdb/configure.tgt,v
retrieving revision 1.33
diff -u -p -r1.33 configure.tgt
--- configure.tgt 2001/07/16 08:52:41 1.33
+++ configure.tgt 2001/07/18 16:52:16
@@ -125,6 +125,7 @@ i[3456]86-*-netware*) gdb_target=i386nw
configdirs="${configdirs} nlm" ;;
i[3456]86-*-osf1mk*) gdb_target=i386mk ;;
i[3456]86-*-cygwin*) gdb_target=cygwin ;;
+i[3456]86-*-pe*) gdb_target=embed ;;
i[3456]86-*-vxworks*) gdb_target=vxworks ;;
i960-*-bout*) gdb_target=vxworks960 ;;
Index: main.c
===================================================================
RCS file: /cvs/src/src/gdb/main.c,v
retrieving revision 1.12
diff -u -p -r1.12 main.c
--- main.c 2001/07/14 18:59:07 1.12
+++ main.c 2001/07/18 16:52:20
@@ -264,6 +264,8 @@ captured_main (void *data)
{"windows", no_argument, &use_windows, 1},
{"statistics", no_argument, 0, 13},
{"write", no_argument, &write_files, 1},
+ {"remote-shared-libs", no_argument, &remote_shared_libs, 1},
+ {"no-remote-shared-libs", no_argument, &remote_shared_libs, 0},
/* Allow machine descriptions to add more options... */
#ifdef ADDITIONAL_OPTIONS
ADDITIONAL_OPTIONS
Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.61
diff -u -p -r1.61 remote.c
--- remote.c 2001/07/17 01:23:44 1.61
+++ remote.c 2001/07/18 16:52:25
@@ -48,6 +48,7 @@
#include "inf-loop.h"
#include <signal.h>
+#include <string.h>
#include "serial.h"
#include "gdbcore.h" /* for exec_bfd */
@@ -202,6 +203,10 @@ static void show_packet_config_cmd (stru
static void update_packet_config (struct packet_config *config);
+static void remote_get_list_of_shared_libraries(void);
+
+static char* findFile(char* basename);
+
/* Define the target subroutine names */
void open_remote_target (char *, int, struct target_ops *, int);
@@ -3061,7 +3066,9 @@ Packet Dropped");
continue;
}
}
+
got_status:
+ remote_get_list_of_shared_libraries();
if (thread_num != -1)
{
return pid_to_ptid (thread_num);
@@ -3284,6 +3291,7 @@ Packet Dropped");
}
}
got_status:
+ remote_get_list_of_shared_libraries();
if (thread_num != -1)
{
return pid_to_ptid (thread_num);
@@ -6015,4 +6023,136 @@ Set use of remote protocol `Z' packets",
add_cmd ("Z-packet", class_obscure, show_remote_protocol_Z_packet_cmd,
"Show use of remote protocol `Z' packets ",
&remote_show_cmdlist);
+}
+
+static void
+remote_get_list_of_shared_libraries (void)
+{
+ extern int remote_shared_libs;
+
+ // This is a counter that gets used so that we don't run while the GDB is initializing
+ static unsigned initializationBlock = 0;
+
+ /* We can't just check for a starting E for errors because the file name may start with one*/
+ char *error_string = "ENN: ";
+
+ char *buf = alloca (PBUFSIZ);
+ static char remote_does_not_suport = 0; /* If the remote doesn't support this, then we will
+ turn off this function */
+
+ // Has the user asked for this feature: Command line option: remote-shared-libs
+ if( remote_shared_libs == 0 )
+ return;
+
+
+ /* The first times through, I don't believe we want to do this because gdb isn't completely initialized.
+ With out this flag add_symbol_file_command() hangs. */
+ if( initializationBlock < 2 )
+ {
+ ++initializationBlock;
+ return;
+ }
+
+ if ( remote_does_not_suport ) /* We've checked this and the stub doesn't support this functionality */
+ {
+ return;
+ }
+
+ putpkt ("qNewLibraries");
+ getpkt (buf, PBUFSIZ, 0);
+
+ if (buf[0] == '\000')
+ {
+ remote_does_not_suport = 1; /* short circuit this function */
+ return; /* Return silently. Stub doesn't support
+ this command. */
+ }
+
+ if (strncmp( buf, error_string, strlen(error_string)) == 0 )
+ {
+ warning ("Remote failure reply: %s", buf);
+ return;
+ }
+
+ if (buf[0] == '1') /* There are new shared libraries */
+ {
+ char *file = alloca (PBUFSIZ), *fqn;
+ int address, values, firstSpace;
+
+ putpkt ("qLibraries");
+ getpkt (buf, PBUFSIZ, 0);
+
+ if (buf[0] == '\000')
+ {
+ remote_does_not_suport = 1; /* short circuit this function */
+ return; /* Return silently. Stub doesn't support
+ this command. */
+ }
+
+ if (strncmp( buf, error_string, strlen(error_string)) == 0 )
+ {
+ warning ("Remote failure reply: %s", buf);
+ return;
+ }
+
+ do
+ { /* buff should have the following layout:
+ <filename> <textaddress> [-mapped] [-readnow] [-s <secname> <addr>]*
+ */
+ values = sscanf( buf, "%s %x", file, &address );
+ if( values < 2) break; /* check to make sure we have a minimum number of fields */
+ firstSpace = strlen(file);
+ if( (fqn = findFile (file) ) != 0 )
+ {
+ strcpy( file, fqn );
+ strcat( file, &buf[firstSpace] );
+ add_symbol_file_command( file, 0 );
+ }
+
+ /* Get the next file from remote */
+ putpkt ("qLibraries");
+ getpkt (buf, PBUFSIZ, 0);
+
+ /* Check for errors*/
+ if ( strncmp( buf, error_string, strlen(error_string)) == 0 )
+ {
+ warning ("Remote failure reply: %s", buf);
+ break;
+ }
+ } while (buf[0] != '\000');
+
+ }
+ else if (buf[0] == '0')
+ {
+ /* There are no new shared libraries */
+ }
+ else
+ {
+ warning ("Remote reply is unrecognized: %s", buf);
+ return;
+ }
+
+ return;
+}
+
+static char*
+findFile (char* basename)
+{
+ int found_file;
+ static char* filename;
+ /* Search the $PATH environment variable. */
+ found_file = openp (getenv ("PATH"), 1, basename, O_RDONLY, 0, &filename);
+
+ /* If not found, next search $LD_LIBRARY_PATH environment variable. */
+ if (found_file < 0 )
+ found_file = openp (getenv ("LD_LIBRARY_PATH"), 1, basename, O_RDONLY, 0, &filename);
+
+ /* We really don't want the file open here, we just wanted the side effects of
+ this function call. If the file was opened, close it. */
+ if (found_file >= 0 )
+ close( found_file );
+ else
+ return 0; /* Report that a file wasn't found */
+
+ return filename;
}
Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.36
diff -u -p -r1.36 symfile.c
--- symfile.c 2001/07/15 18:57:06 1.36
+++ symfile.c 2001/07/18 16:52:26
@@ -112,8 +112,6 @@ static void load_command (char *, int);
static void symbol_file_add_main_1 (char *args, int from_tty, int flags);
-static void add_symbol_file_command (char *, int);
-
static void add_shared_symbol_files_command (char *, int);
static void cashier_psymtab (struct partial_symtab *);
@@ -1410,7 +1408,7 @@ print_transfer_performance (struct ui_fi
value to use. We are now discontinuing this type of ad hoc syntax. */
/* ARGSUSED */
-static void
+void
add_symbol_file_command (char *args, int from_tty)
{
char *filename = NULL;
Index: symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.9
diff -u -p -r1.9 symfile.h
--- symfile.h 2001/03/06 08:21:17 1.9
+++ symfile.h 2001/07/18 16:52:27
@@ -280,6 +280,9 @@ extern void symbol_file_add_main (char *
/* Clear GDB symbol tables. */
extern void symbol_file_clear (int from_tty);
+/* Add a file to the symbol table */
+extern void add_symbol_file_command (char *args, int from_tty);
+
/* From dwarfread.c */
extern void
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.41
diff -u -p -r1.41 top.c
--- top.c 2001/07/17 17:25:14 1.41
+++ top.c 2001/07/18 16:52:32
@@ -165,6 +165,12 @@ int remote_debug = 0;
target is off and running, which gdb is doing something else. */
int target_executing = 0;
+/* This variable is added to control the loading of shared libraries
+ by a remote stub or by gdbserver. The default is set to 0 so that
+ the behaviour will remain unchanged by default - i.e. we won't ask about
+ shared libraries. */
+int remote_shared_libs = 0;
+
/* Level of control structure. */
static int control_level;
Index: top.h
===================================================================
RCS file: /cvs/src/src/gdb/top.h,v
retrieving revision 1.5
diff -u -p -r1.5 top.h
--- top.h 2001/03/06 08:21:17 1.5
+++ top.h 2001/07/18 16:52:32
@@ -55,6 +55,7 @@ extern void set_prompt (char *);
/* From random places. */
extern int mapped_symbol_files;
extern int readnow_symbol_files;
+extern int remote_shared_libs;
/* Perform _initialize initialization */
extern void gdb_init (char *);