From: Paul Pluzhnikov <ppluzhnikov@google.com>
To: Paul Pluzhnikov <ppluzhnikov@google.com>,
Pedro Alves <pedro@codesourcery.com>,
gdb-patches@sourceware.org,
Daniel Jacobowitz <drow@false.org>
Subject: Re: [patch] Allow gdbserver to dynamically lookup libthread_db.so.1
Date: Fri, 16 Oct 2009 00:41:00 -0000 [thread overview]
Message-ID: <8ac60eac0910151741p5f9f8448na0124aa5832e0d34@mail.gmail.com> (raw)
In-Reply-To: <20091008194214.GA27413@caradoc.them.org>
[-- Attachment #1: Type: text/plain, Size: 992 bytes --]
On Thu, Oct 8, 2009 at 12:42 PM, Daniel Jacobowitz <drow@false.org> wrote:
> On Thu, Oct 08, 2009 at 12:20:53PM -0700, Paul Pluzhnikov wrote:
>> I would prefer to do it as a follow-up patch though.
>> Would that be ok?
>
> Oh, absolutely. This isn't a common use case, just one I've found
> handy. As usual, I appreciate how helpful you are!
Here is the promised follow-up patch.
If gdbserver is configured with
--with-libthread-db=/path/to/libthread.db.{a,so}
then we link with the given library instead of libdl, and directly import
all the symbols from it.
Tested by configuring --with-libthread-db=/lib64/libthread_db.so.1 and
running 'make check RUNTESTFLAGS="--target_board native-gdbserver"'.
No regressions.
Thanks,
--
Paul Pluzhnikov
2009-10-15 Paul Pluzhnikov <ppluzhnikov@google.com>
* configure.ac: New --with-libthread-db option.
* thread-db.c: Allow direct dependence on libthread_db.
(thread_db_free): Adjust.
* config.in: Regenerate.
* configure: Likewise.
[-- Attachment #2: gdb-gdbserver-threaddb-search-20091015.txt --]
[-- Type: text/plain, Size: 5680 bytes --]
Index: configure.ac
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/configure.ac,v
retrieving revision 1.27
diff -u -p -u -r1.27 configure.ac
--- configure.ac 9 Oct 2009 00:31:01 -0000 1.27
+++ configure.ac 16 Oct 2009 00:13:49 -0000
@@ -158,6 +158,13 @@ if test "$srv_linux_thread_db" = "yes";
fi
fi
+AC_ARG_WITH(libthread-db,
+AS_HELP_STRING([--with-libthread-db=PATH], [use given libthread_db directly]),
+[srv_libthread_db_path="${withval}"
+ AC_DEFINE(USE_LIBTHREAD_DB_DIRECTLY, 1, [Define if we should use libthread_db directly.])
+ srv_libs="$srv_libthread_db_path"
+])
+
if test "$srv_xmlfiles" != ""; then
srv_xmlbuiltin="xml-builtin.o"
AC_DEFINE(USE_XML, 1, [Define if an XML target description is available.])
Index: thread-db.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/thread-db.c,v
retrieving revision 1.24
diff -u -p -u -r1.24 thread-db.c
--- thread-db.c 9 Oct 2009 00:31:01 -0000 1.24
+++ thread-db.c 16 Oct 2009 00:38:43 -0000
@@ -30,7 +30,10 @@ static int thread_db_use_events;
#include "gdb_proc_service.h"
#include "../gdb_thread_db.h"
+#ifndef USE_LIBTHREAD_DB_DIRECTLY
#include <dlfcn.h>
+#endif
+
#include <stdint.h>
#include <limits.h>
#include <ctype.h>
@@ -44,8 +47,10 @@ struct thread_db
/* Connection to the libthread_db library. */
td_thragent_t *thread_agent;
+#ifndef USE_LIBTHREAD_DB_DIRECTLY
/* Handle of the libthread_db from dlopen. */
void *handle;
+#endif
/* Addresses of libthread_db functions. */
td_err_e (*td_ta_new_p) (struct ps_prochandle * ps, td_thragent_t **ta);
@@ -435,6 +440,51 @@ thread_db_get_tls_address (struct thread
return err;
}
+#ifdef USE_LIBTHREAD_DB_DIRECTLY
+
+static int
+thread_db_load_search (void)
+{
+ td_err_e err;
+ struct thread_db tdb;
+ struct process_info *proc = current_process ();
+
+ if (proc->private->thread_db != NULL)
+ fatal ("unexpected: proc->private->thread_db != NULL");
+
+ tdb.td_ta_new_p = &td_ta_new;
+
+ /* Attempt to open a connection to the thread library. */
+ err = tdb.td_ta_new_p (&tdb.proc_handle, &tdb.thread_agent);
+ if (err != TD_OK)
+ {
+ if (debug_threads)
+ fprintf (stderr, "td_ta_new(): %s\n", thread_db_err_str (err));
+ return 0;
+ }
+
+ tdb.td_ta_map_lwp2thr_p = &td_ta_map_lwp2thr;
+ tdb.td_thr_get_info_p = &td_thr_get_info;
+ tdb.td_ta_thr_iter_p = &td_ta_thr_iter;
+ tdb.td_symbol_list_p = &td_symbol_list;
+
+ /* This is required only when thread_db_use_events is on. */
+ tdb.td_thr_event_enable_p = &td_thr_event_enable;
+
+ /* These are not essential. */
+ tdb.td_ta_event_addr_p = &td_ta_event_addr;
+ tdb.td_ta_set_event_p = &td_ta_set_event;
+ tdb.td_ta_event_getmsg_p = &td_ta_event_getmsg;
+ tdb.td_thr_tls_get_addr_p = &td_thr_tls_get_addr;
+
+ proc->private->thread_db = xmalloc (sizeof (tdb));
+ memcpy (proc->private->thread_db, &tdb, sizeof (tdb));
+
+ return 1;
+}
+
+#else
+
static int
try_thread_db_load_1 (void *handle)
{
@@ -613,6 +663,8 @@ thread_db_load_search (void)
return rc;
}
+#endif /* USE_LIBTHREAD_DB_DIRECTLY */
+
int
thread_db_init (int use_events)
{
@@ -656,6 +708,7 @@ thread_db_free (struct process_info *pro
struct thread_db *thread_db = proc->private->thread_db;
if (thread_db)
{
+#ifndef USE_LIBTHREAD_DB_DIRECTLY
td_err_e (*td_ta_delete_p) (td_thragent_t *);
td_ta_delete_p = dlsym (thread_db->handle, "td_ta_delete");
@@ -663,6 +716,10 @@ thread_db_free (struct process_info *pro
(*td_ta_delete_p) (thread_db->thread_agent);
dlclose (thread_db->handle);
+#else
+ td_ta_delete (thread_db->thread_agent);
+#endif /* USE_LIBTHREAD_DB_DIRECTLY */
+
free (thread_db);
proc->private->thread_db = NULL;
}
Index: config.in
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/config.in,v
retrieving revision 1.24
diff -u -p -u -r1.24 config.in
--- config.in 9 Oct 2009 00:31:01 -0000 1.24
+++ config.in 16 Oct 2009 00:13:49 -0000
@@ -175,6 +175,9 @@
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
+/* Define if we should use libthread_db directly. */
+#undef USE_LIBTHREAD_DB_DIRECTLY
+
/* Enable extensions on AIX 3, Interix. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
Index: configure
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/configure,v
retrieving revision 1.41
diff -u -p -u -r1.41 configure
--- configure 9 Oct 2009 00:31:01 -0000 1.41
+++ configure 16 Oct 2009 00:13:49 -0000
@@ -668,6 +668,7 @@ ac_user_opts='
enable_option_checking
with_pkgversion
with_bugurl
+with_libthread_db
'
ac_precious_vars='build_alias
host_alias
@@ -1297,6 +1298,8 @@ Optional Packages:
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-pkgversion=PKG Use PKG in the version string in place of "GDB"
--with-bugurl=URL Direct users to URL to report a bug
+ --with-libthread-db=PATH
+ use given libthread_db directly
Some influential environment variables:
CC C compiler command
@@ -4268,6 +4271,18 @@ $as_echo "#define HAVE_TD_VERSION 1" >>c
fi
fi
+
+# Check whether --with-libthread-db was given.
+if test "${with_libthread_db+set}" = set; then :
+ withval=$with_libthread_db; srv_libthread_db_path="${withval}"
+
+$as_echo "#define USE_LIBTHREAD_DB_DIRECTLY 1" >>confdefs.h
+
+ srv_libs="$srv_libthread_db_path"
+
+fi
+
+
if test "$srv_xmlfiles" != ""; then
srv_xmlbuiltin="xml-builtin.o"
next prev parent reply other threads:[~2009-10-16 0:41 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-02 16:34 Paul Pluzhnikov
2009-09-02 16:43 ` Paul Pluzhnikov
2009-09-02 16:47 ` Pedro Alves
2009-09-02 17:16 ` Paul Pluzhnikov
2009-09-02 17:19 ` Doug Evans
2009-10-02 23:51 ` Paul Pluzhnikov
2009-10-04 20:32 ` Pedro Alves
2009-10-05 1:49 ` Paul Pluzhnikov
2009-10-05 3:03 ` Pedro Alves
2009-10-13 13:53 ` Pedro Alves
2009-10-06 23:08 ` Paul Pluzhnikov
2009-10-06 23:44 ` Pedro Alves
2009-10-07 0:27 ` Paul Pluzhnikov
2009-10-08 18:08 ` Pedro Alves
2009-10-08 19:05 ` Daniel Jacobowitz
2009-10-08 19:21 ` Paul Pluzhnikov
2009-10-08 19:42 ` Daniel Jacobowitz
2009-10-16 0:41 ` Paul Pluzhnikov [this message]
2009-10-22 21:03 ` Paul Pluzhnikov
2009-10-29 16:52 ` Paul Pluzhnikov
2009-10-29 17:27 ` Daniel Jacobowitz
2009-10-29 17:45 ` Paul Pluzhnikov
2009-10-08 19:36 ` Paul Pluzhnikov
2009-10-08 22:58 ` Pedro Alves
2009-10-04 20:34 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8ac60eac0910151741p5f9f8448na0124aa5832e0d34@mail.gmail.com \
--to=ppluzhnikov@google.com \
--cc=drow@false.org \
--cc=gdb-patches@sourceware.org \
--cc=pedro@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox