From 4915acadd4d308ebfc500c64394a7fb87104ffde Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Tue, 11 Jun 1996 19:21:42 +0000 Subject: [PATCH] * Makefile.in (INTERNAL_LDFLAGS): Add in flags from configure. * configure configure.in: Only make sol-thread.o for native. Also, switch to dlopened libthread_db.so.1. * sol-thread.c: Switch to using dlopen to get the thread_db library. --- gdb/configure | 162 ++++++++++++++++++++--------------------------- gdb/configure.in | 29 +++++---- gdb/sol-thread.c | 134 +++++++++++++++++++++++++++++++++------ 3 files changed, 199 insertions(+), 126 deletions(-) diff --git a/gdb/configure b/gdb/configure index a2ddc5851f1..a9093b5bd06 100755 --- a/gdb/configure +++ b/gdb/configure @@ -1,8 +1,8 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.10 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# Generated automatically using autoconf version 2.8 +# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. @@ -348,7 +348,7 @@ EOF verbose=yes ;; -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.10" + echo "configure generated by autoconf version 2.8" exit 0 ;; -with-* | --with-*) @@ -1441,8 +1441,6 @@ else which can conflict with char $ac_func(); below. */ #include /* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { return 0; } @@ -1459,7 +1457,7 @@ $ac_func(); ; return 0; } EOF -if { (eval echo configure:1463: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:1461: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1487,7 +1485,7 @@ if eval "test \"`echo '$''{'gdb_cv_have_gregset_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { return 0; } @@ -1495,7 +1493,7 @@ int t() { gregset_t *gregsetp = 0 ; return 0; } EOF -if { (eval echo configure:1499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:1497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* gdb_cv_have_gregset_t=yes else @@ -1519,7 +1517,7 @@ if eval "test \"`echo '$''{'gdb_cv_have_fpregset_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { return 0; } @@ -1527,7 +1525,7 @@ int t() { fpregset_t *fpregsetp = 0 ; return 0; } EOF -if { (eval echo configure:1531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:1529: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* gdb_cv_have_fpregset_t=yes else @@ -1552,7 +1550,7 @@ if eval "test \"`echo '$''{'ac_cv_c_long_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1562: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_long_double=yes else @@ -1588,7 +1586,7 @@ else gdb_cv_printf_has_long_double=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } +{ (eval echo configure:1600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then gdb_cv_printf_has_long_double=yes else @@ -1623,14 +1621,12 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { return 0; } @@ -1647,7 +1643,7 @@ $ac_func(); ; return 0; } EOF -if { (eval echo configure:1651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:1647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1677,7 +1673,7 @@ else ac_cv_func_mmap=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } +{ (eval echo configure:1746: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_func_mmap=yes else @@ -1766,20 +1762,23 @@ fi -echo $ac_n "checking for Solaris thread debugging library""... $ac_c" 1>&6 -if test -f /usr/lib/libthread_db.so.1 ; then - echo "$ac_t""yes" 1>&6 - LIBS="$LIBS /usr/lib/libthread_db.so.1" - THREAD_DB_OBS=sol-thread.o - cat >> confdefs.h <<\EOF +if test ${host} = ${target} ; then + echo $ac_n "checking for Solaris thread debugging library""... $ac_c" 1>&6 + if test -f /usr/lib/libthread_db.so.1 ; then + echo "$ac_t""yes" 1>&6 + THREAD_DB_OBS=sol-thread.o + cat >> confdefs.h <<\EOF #define HAVE_THREAD_DB_LIB 1 EOF -else - echo "$ac_t""no" 1>&6 + CONFIG_LDFLAGS="${CONFIG_LDFLAGS} -Xlinker -export-dynamic" + else + echo "$ac_t""no" 1>&6 + fi + + fi - ENABLE_CFLAGS= ENABLE_CLIBS= ENABLE_OBS= @@ -1929,12 +1928,12 @@ if test "$ac_x_includes" = NO; then # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1938: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1937: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -2001,7 +2000,7 @@ if test "$ac_x_libraries" = NO; then ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:2012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. @@ -2123,26 +2122,22 @@ else # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for -lICE""... $ac_c" 1>&6 -ac_lib_var=`echo ICE'_'IceConnectionNumber | tr './+\055' '__p_'` +ac_lib_var=`echo ICE_IceConnectionNumber | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lICE $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:2141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2171,26 +2166,22 @@ fi # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for -ldnet""... $ac_c" 1>&6 -ac_lib_var=`echo dnet'_'dnet_ntoa | tr './+\055' '__p_'` +ac_lib_var=`echo dnet_dnet_ntoa | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:2185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2210,26 +2201,22 @@ fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6 -ac_lib_var=`echo dnet_stub'_'dnet_ntoa | tr './+\055' '__p_'` +ac_lib_var=`echo dnet_stub_dnet_ntoa | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:2220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2254,26 +2241,22 @@ fi # Not sure which flavor of 386 UNIX this is, but it seems harmless to # check for it. echo $ac_n "checking for -lnsl""... $ac_c" 1>&6 -ac_lib_var=`echo nsl'_'t_accept | tr './+\055' '__p_'` +ac_lib_var=`echo nsl_t_accept | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:2260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2297,26 +2280,22 @@ fi # But -lsocket is broken on IRIX, according to simon@lia.di.epfl.ch. if test "`(uname) 2>/dev/null`" != IRIX; then echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 -ac_lib_var=`echo socket'_'socket | tr './+\055' '__p_'` +ac_lib_var=`echo socket_socket | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:2299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2413,12 +2392,12 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2422: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2401: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -2471,7 +2450,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -2486,7 +2465,7 @@ main() { return 0; } EOF -{ (eval echo configure:2490: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } +{ (eval echo configure:2469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then tclmajor=`cat tclmajor` tclminor=`cat tclminor` @@ -2631,13 +2610,13 @@ else ac_cv_c_tclib="-l$installedtcllibroot" else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } +{ (eval echo configure:2620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_c_tcllib="-l$installedtcllibroot" else @@ -2747,12 +2726,12 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2756: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2735: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -2812,7 +2791,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -2827,7 +2806,7 @@ cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } +{ (eval echo configure:2810: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then tkmajor=`cat tkmajor` tkminor=`cat tkminor` @@ -2993,13 +2972,13 @@ else ac_cv_c_tklib="-l$installedtklibroot" else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } +{ (eval echo configure:2982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_c_tklib="-l$installedtklibroot" else @@ -3033,14 +3012,14 @@ fi # beyond us. if test $tclmajor -ge 7 -a $tclminor -ge 5 ; then echo $ac_n "checking for -ldl""... $ac_c" 1>&6 -ac_lib_var=`echo dl'_'main | tr './+\055' '__p_'` +ac_lib_var=`echo dl_main | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:3031: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3071,14 +3050,14 @@ EOF else echo "$ac_t""no" 1>&6 echo $ac_n "checking for -ldld""... $ac_c" 1>&6 -ac_lib_var=`echo dld'_'main | tr './+\055' '__p_'` +ac_lib_var=`echo dld_main | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then +if { (eval echo configure:3069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3727,7 +3706,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.10" + echo "$CONFIG_STATUS generated by autoconf version 2.8" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; @@ -3792,6 +3771,7 @@ s%@target_cpu@%$target_cpu%g s%@target_vendor@%$target_vendor%g s%@target_os@%$target_os%g s%@THREAD_DB_OBS@%$THREAD_DB_OBS%g +s%@CONFIG_LDFLAGS@%$CONFIG_LDFLAGS%g s%@X_CFLAGS@%$X_CFLAGS%g s%@X_PRE_LIBS@%$X_PRE_LIBS%g s%@X_LIBS@%$X_LIBS%g @@ -3916,7 +3896,7 @@ rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF @@ -3964,12 +3944,6 @@ cat >> $CONFIG_STATUS <<\EOF echo "$ac_file is unchanged" rm -f conftest.h else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi rm -f $ac_file mv conftest.h $ac_file fi diff --git a/gdb/configure.in b/gdb/configure.in index 001beb30aef..7b549ce559a 100644 --- a/gdb/configure.in +++ b/gdb/configure.in @@ -96,20 +96,23 @@ AC_MSG_RESULT($gdb_cv_printf_has_long_double) AC_FUNC_MMAP -dnl See if thread_db is around for Solaris thread debugging. Note that we must -dnl explicitly test for version 1 of the library because version 0 (present on -dnl Solaris 2.4 or earlier) doesn't have the same API. - -AC_MSG_CHECKING(for Solaris thread debugging library) -if test -f /usr/lib/libthread_db.so.1 ; then - AC_MSG_RESULT(yes) - LIBS="$LIBS /usr/lib/libthread_db.so.1" - THREAD_DB_OBS=sol-thread.o - AC_DEFINE(HAVE_THREAD_DB_LIB) -else - AC_MSG_RESULT(no) +dnl See if thread_db library is around for Solaris thread debugging. Note that +dnl we must explicitly test for version 1 of the library because version 0 +dnl (present on Solaris 2.4 or earlier) doesn't have the same API. + +if test ${host} = ${target} ; then + AC_MSG_CHECKING(for Solaris thread debugging library) + if test -f /usr/lib/libthread_db.so.1 ; then + AC_MSG_RESULT(yes) + THREAD_DB_OBS=sol-thread.o + AC_DEFINE(HAVE_THREAD_DB_LIB) + CONFIG_LDFLAGS="${CONFIG_LDFLAGS} -Xlinker -export-dynamic" + else + AC_MSG_RESULT(no) + fi + AC_SUBST(THREAD_DB_OBS) + AC_SUBST(CONFIG_LDFLAGS) fi -AC_SUBST(THREAD_DB_OBS) dnl Handle optional features that can be enabled. ENABLE_CFLAGS= diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c index d107e2260cf..00bdc60074f 100644 --- a/gdb/sol-thread.c +++ b/gdb/sol-thread.c @@ -66,6 +66,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include +#include extern struct target_ops sol_thread_ops; /* Forward declaration */ @@ -121,6 +122,56 @@ static int lwp_to_thread PARAMS ((int lwp)); #define GET_THREAD(THREAD_ID) (((THREAD_ID) >> 16) & 0x7fff) #define BUILD_LWP(LWP_ID, PID) ((LWP_ID) << 16 | (PID)) #define BUILD_THREAD(THREAD_ID, PID) (THREAD_FLAG | BUILD_LWP (THREAD_ID, PID)) + +/* Pointers to routines from lithread_db resolved by dlopen() */ + +static void + (*p_td_log) (const int on_off); +static td_err_e + (*p_td_ta_new) (const struct ps_prochandle *ph_p, td_thragent_t **ta_pp); +static td_err_e + (*p_td_ta_delete) (td_thragent_t *ta_p); +static td_err_e + (*p_td_init) (void); +static td_err_e + (*p_td_ta_get_ph) (const td_thragent_t *ta_p, struct ps_prochandle **ph_pp); +static td_err_e + (*p_td_ta_get_nthreads) (const td_thragent_t *ta_p, int *nthread_p); +static td_err_e + (*p_td_ta_tsd_iter) (const td_thragent_t *ta_p, td_key_iter_f *cb, void *cbdata_p); +static td_err_e + (*p_td_ta_thr_iter) (const td_thragent_t *ta_p, td_thr_iter_f *cb, void *cbdata_p, td_thr_state_e state, + int ti_pri, sigset_t *ti_sigmask_p, unsigned ti_user_flags); +static td_err_e + (*p_td_thr_validate) (const td_thrhandle_t *th_p); +static td_err_e + (*p_td_thr_tsd) (const td_thrhandle_t *th_p, const thread_key_t key, void **data_pp); +static td_err_e + (*p_td_thr_get_info) (const td_thrhandle_t *th_p, td_thrinfo_t *ti_p); +static td_err_e + (*p_td_thr_getfpregs) (const td_thrhandle_t *th_p, prfpregset_t *fpregset); +static td_err_e + (*p_td_thr_getxregsize) (const td_thrhandle_t *th_p, int *xregsize); +static td_err_e + (*p_td_thr_getxregs) (const td_thrhandle_t *th_p, const caddr_t xregset); +static td_err_e + (*p_td_thr_sigsetmask) (const td_thrhandle_t *th_p, const sigset_t ti_sigmask); +static td_err_e + (*p_td_thr_setprio) (const td_thrhandle_t *th_p, const int ti_pri); +static td_err_e + (*p_td_thr_setsigpending) (const td_thrhandle_t *th_p, const uchar_t ti_pending_flag, const sigset_t ti_pending); +static td_err_e + (*p_td_thr_setfpregs) (const td_thrhandle_t *th_p, const prfpregset_t *fpregset); +static td_err_e + (*p_td_thr_setxregs) (const td_thrhandle_t *th_p, const caddr_t xregset); +static td_err_e + (*p_td_ta_map_id2thr) (const td_thragent_t *ta_p, thread_t tid, td_thrhandle_t *th_p); +static td_err_e + (*p_td_ta_map_lwp2thr) (const td_thragent_t *ta_p, lwpid_t lwpid, td_thrhandle_t *th_p); +static td_err_e + (*p_td_thr_getgregs) (const td_thrhandle_t *th_p, prgregset_t regset); +static td_err_e + (*p_td_thr_setgregs) (const td_thrhandle_t *th_p, const prgregset_t regset); /* @@ -266,11 +317,11 @@ thread_to_lwp (thread_id, default_lwp) pid = PIDGET (thread_id); thread_id = GET_THREAD(thread_id); - val = td_ta_map_id2thr (main_ta, thread_id, &th); + val = p_td_ta_map_id2thr (main_ta, thread_id, &th); if (val != TD_OK) error ("thread_to_lwp: td_ta_map_id2thr %s", td_err_string (val)); - val = td_thr_get_info (&th, &ti); + val = p_td_thr_get_info (&th, &ti); if (val != TD_OK) error ("thread_to_lwp: td_thr_get_info: %s", td_err_string (val)); @@ -327,11 +378,11 @@ lwp_to_thread (lwp) pid = PIDGET (lwp); lwp = GET_LWP (lwp); - val = td_ta_map_lwp2thr (main_ta, lwp, &th); + val = p_td_ta_map_lwp2thr (main_ta, lwp, &th); if (val != TD_OK) error ("lwp_to_thread: td_thr_get_info: %s.", td_err_string (val)); - val = td_thr_get_info (&th, &ti); + val = p_td_thr_get_info (&th, &ti); if (val != TD_OK) error ("lwp_to_thread: td_thr_get_info: %s.", td_err_string (val)); @@ -518,14 +569,14 @@ sol_thread_fetch_registers (regno) if (thread == 0) error ("sol_thread_fetch_registers: thread == 0"); - val = td_ta_map_id2thr (main_ta, thread, &thandle); + val = p_td_ta_map_id2thr (main_ta, thread, &thandle); if (val != TD_OK) error ("sol_thread_fetch_registers: td_ta_map_id2thr: %s", td_err_string (val)); /* Get the integer regs */ - val = td_thr_getgregs (&thandle, gregset); + val = p_td_thr_getgregs (&thandle, gregset); if (val != TD_OK && val != TD_PARTIALREG) error ("sol_thread_fetch_registers: td_thr_getgregs %s", @@ -536,7 +587,7 @@ sol_thread_fetch_registers (regno) /* And, now the fp regs */ - val = td_thr_getfpregs (&thandle, &fpregset); + val = p_td_thr_getfpregs (&thandle, &fpregset); if (val != TD_OK && val != TD_NOFPREGS) error ("sol_thread_fetch_registers: td_thr_getfpregs %s", @@ -585,18 +636,18 @@ sol_thread_store_registers (regno) thread = GET_THREAD (inferior_pid); - val = td_ta_map_id2thr (main_ta, thread, &thandle); + val = p_td_ta_map_id2thr (main_ta, thread, &thandle); if (val != TD_OK) error ("sol_thread_store_registers: td_ta_map_id2thr %s", td_err_string (val)); if (regno != -1) { /* Not writing all the regs */ - val = td_thr_getgregs (&thandle, regset); + val = p_td_thr_getgregs (&thandle, regset); if (val != TD_OK) error ("sol_thread_store_registers: td_thr_getgregs %s", td_err_string (val)); - val = td_thr_getfpregs (&thandle, &fpregset); + val = p_td_thr_getfpregs (&thandle, &fpregset); if (val != TD_OK) error ("sol_thread_store_registers: td_thr_getfpregs %s", td_err_string (val)); @@ -622,11 +673,11 @@ sol_thread_store_registers (regno) fill_gregset (regset, regno); fill_fpregset (fpregset, regno); - val = td_thr_setgregs (&thandle, regset); + val = p_td_thr_setgregs (&thandle, regset); if (val != TD_OK) error ("sol_thread_store_registers: td_thr_setgregs %s", td_err_string (val)); - val = td_thr_setfpregs (&thandle, &fpregset); + val = p_td_thr_setfpregs (&thandle, &fpregset); if (val != TD_OK) error ("sol_thread_store_registers: td_thr_setfpregs %s", td_err_string (val)); @@ -747,11 +798,11 @@ sol_thread_new_objfile (objfile) the shared libraries are located because it needs information from the user's thread library. */ - val = td_init (); + val = p_td_init (); if (val != TD_OK) error ("target_new_objfile: td_init: %s", td_err_string (val)); - val = td_ta_new (&main_ph, &main_ta); + val = p_td_ta_new (&main_ph, &main_ta); if (val == TD_NOLIBTHREAD) return; else if (val != TD_OK) @@ -1095,15 +1146,15 @@ struct target_ops sol_thread_ops = { "Solaris threads and pthread support.", /* to_doc */ sol_thread_open, /* to_open */ 0, /* to_close */ - sol_thread_attach, /* to_attach */ + sol_thread_attach, /* to_attach */ sol_thread_detach, /* to_detach */ - sol_thread_resume, /* to_resume */ - sol_thread_wait, /* to_wait */ + sol_thread_resume, /* to_resume */ + sol_thread_wait, /* to_wait */ sol_thread_fetch_registers, /* to_fetch_registers */ sol_thread_store_registers, /* to_store_registers */ sol_thread_prepare_to_store, /* to_prepare_to_store */ - sol_thread_xfer_memory, /* to_xfer_memory */ - sol_thread_files_info, /* to_files_info */ + sol_thread_xfer_memory, /* to_xfer_memory */ + sol_thread_files_info, /* to_files_info */ memory_insert_breakpoint, /* to_insert_breakpoint */ memory_remove_breakpoint, /* to_remove_breakpoint */ terminal_init_inferior, /* to_terminal_init */ @@ -1135,7 +1186,52 @@ struct target_ops sol_thread_ops = { void _initialize_sol_thread () { + void *dlhandle; + + dlhandle = dlopen ("libthread_db.so.1", RTLD_NOW); + if (!dlhandle) + goto die; + +#define resolve(X) \ + if (!(p_##X = dlsym (dlhandle, #X))) \ + goto die; + + resolve (td_log); + resolve (td_ta_new); + resolve (td_ta_delete); + resolve (td_init); + resolve (td_ta_get_ph); + resolve (td_ta_get_nthreads); + resolve (td_ta_tsd_iter); + resolve (td_ta_thr_iter); + resolve (td_thr_validate); + resolve (td_thr_tsd); + resolve (td_thr_get_info); + resolve (td_thr_getfpregs); + resolve (td_thr_getxregsize); + resolve (td_thr_getxregs); + resolve (td_thr_sigsetmask); + resolve (td_thr_setprio); + resolve (td_thr_setsigpending); + resolve (td_thr_setfpregs); + resolve (td_thr_setxregs); + resolve (td_ta_map_id2thr); + resolve (td_ta_map_lwp2thr); + resolve (td_thr_getgregs); + resolve (td_thr_setgregs); + add_target (&sol_thread_ops); procfs_suppress_run = 1; + + return; + + die: + + fprintf_unfiltered (gdb_stderr, "[GDB will not be able to debug user-mode threads: %s]\n", dlerror ()); + + if (dlhandle) + dlclose (dlhandle); + + return; } -- 2.30.2