aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbsupport
diff options
context:
space:
mode:
authorSergio Durigan Junior <sergiodj@redhat.com>2019-08-21 16:22:45 -0400
committerSergio Durigan Junior <sergiodj@redhat.com>2019-08-23 13:13:18 -0400
commit2d41fa1165c0e28d938ee3bae5c32db371dccf29 (patch)
treef712ad14b44c800d0de74b8da60c0c888fb23db5 /gdb/gdbsupport
parentde8af80891ff0eee61cd219b316e176e9ae88e91 (diff)
downloadgdb-2d41fa1165c0e28d938ee3bae5c32db371dccf29.zip
gdb-2d41fa1165c0e28d938ee3bae5c32db371dccf29.tar.gz
gdb-2d41fa1165c0e28d938ee3bae5c32db371dccf29.tar.bz2
Move gdb-dlfcn.[ch] to gdbsupport/
I need to use 'gdb_dlopen' inside 'gdbsupport/', but it's not yet supported there. This commit moves 'gdb-dlfcn.[ch]' to 'gdbsupport/', which makes it available also on gdbserver. gdb/ChangeLog: 2019-08-23 Sergio Durigan Junior <sergiodj@redhat.com> * configure.ac: Don't check for 'dlfcn.h' (moved to gdbsupport/common.m4). * Makefile.in (COMMON_SFILES): Move 'gdb-dlfcn.c' to 'gdbsupport/'. (HFILES_NO_SRCDIR): Likewise, for 'gdb-dlfcn.h'. * compile/compile-c-support.c: Include 'gdbsupport/gdb-dlfcn.h'. * gdbsupport/common.m4: Check for 'dlfcn.h'. * gdb-dlfcn.c: Move to... * gdbsupport/gdb-dlfcn.c: ... here. * gdb-dlfcn.h: Move to... * gdbsupport/gdb-dlfcn.h: ... here. gdb/gdbserver/ChangeLog: 2019-08-23 Sergio Durigan Junior <sergiodj@redhat.com> * Makefile.in (SFILES): Add 'gdbsupport/gdb-dlfcn.c'. (OBS): Add 'gdbsupport/gdb-dlfcn.o'. * config.in: Regenerate. * configure: Regenerate.
Diffstat (limited to 'gdb/gdbsupport')
-rw-r--r--gdb/gdbsupport/common.m43
-rw-r--r--gdb/gdbsupport/gdb-dlfcn.c118
-rw-r--r--gdb/gdbsupport/gdb-dlfcn.h51
3 files changed, 171 insertions, 1 deletions
diff --git a/gdb/gdbsupport/common.m4 b/gdb/gdbsupport/common.m4
index 5701dd9..9038894 100644
--- a/gdb/gdbsupport/common.m4
+++ b/gdb/gdbsupport/common.m4
@@ -29,7 +29,8 @@ AC_DEFUN([GDB_AC_COMMON], [
sys/resource.h sys/socket.h dnl
sys/un.h sys/wait.h dnl
thread_db.h wait.h dnl
- termios.h)
+ termios.h dnl
+ dlfcn.h)
AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 socketpair sigaction])
diff --git a/gdb/gdbsupport/gdb-dlfcn.c b/gdb/gdbsupport/gdb-dlfcn.c
new file mode 100644
index 0000000..921f10f
--- /dev/null
+++ b/gdb/gdbsupport/gdb-dlfcn.c
@@ -0,0 +1,118 @@
+/* Platform independent shared object routines for GDB.
+
+ Copyright (C) 2011-2019 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "common-defs.h"
+#include "gdb-dlfcn.h"
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#elif __MINGW32__
+#include <windows.h>
+#else
+/* Unsupported configuration. */
+#define NO_SHARED_LIB
+#endif
+
+#ifdef NO_SHARED_LIB
+
+gdb_dlhandle_up
+gdb_dlopen (const char *filename)
+{
+ gdb_assert_not_reached ("gdb_dlopen should not be called on this platform.");
+}
+
+void *
+gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol)
+{
+ gdb_assert_not_reached ("gdb_dlsym should not be called on this platform.");
+}
+
+void
+dlclose_deleter::operator() (void *handle) const
+{
+ gdb_assert_not_reached ("gdb_dlclose should not be called on this platform.");
+}
+
+int
+is_dl_available (void)
+{
+ return 0;
+}
+
+#else /* NO_SHARED_LIB */
+
+gdb_dlhandle_up
+gdb_dlopen (const char *filename)
+{
+ void *result;
+#ifdef HAVE_DLFCN_H
+ result = dlopen (filename, RTLD_NOW);
+#elif __MINGW32__
+ result = (void *) LoadLibrary (filename);
+#endif
+ if (result != NULL)
+ return gdb_dlhandle_up (result);
+
+#ifdef HAVE_DLFCN_H
+ error (_("Could not load %s: %s"), filename, dlerror());
+#else
+ {
+ LPVOID buffer;
+ DWORD dw;
+
+ dw = GetLastError();
+
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &buffer,
+ 0, NULL);
+
+ error (_("Could not load %s: %s"), filename, (char *) buffer);
+ }
+#endif
+}
+
+void *
+gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol)
+{
+#ifdef HAVE_DLFCN_H
+ return dlsym (handle.get (), symbol);
+#elif __MINGW32__
+ return (void *) GetProcAddress ((HMODULE) handle.get (), symbol);
+#endif
+}
+
+void
+dlclose_deleter::operator() (void *handle) const
+{
+#ifdef HAVE_DLFCN_H
+ dlclose (handle);
+#elif __MINGW32__
+ FreeLibrary ((HMODULE) handle);
+#endif
+}
+
+int
+is_dl_available (void)
+{
+ return 1;
+}
+
+#endif /* NO_SHARED_LIB */
diff --git a/gdb/gdbsupport/gdb-dlfcn.h b/gdb/gdbsupport/gdb-dlfcn.h
new file mode 100644
index 0000000..6a39d38
--- /dev/null
+++ b/gdb/gdbsupport/gdb-dlfcn.h
@@ -0,0 +1,51 @@
+/* Platform independent shared object routines for GDB.
+
+ Copyright (C) 2011-2019 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef GDB_DLFCN_H
+#define GDB_DLFCN_H
+
+/* A deleter that closes an open dynamic library. */
+
+struct dlclose_deleter
+{
+ void operator() (void *handle) const;
+};
+
+/* A unique pointer that points to a dynamic library. */
+
+typedef std::unique_ptr<void, dlclose_deleter> gdb_dlhandle_up;
+
+/* Load the dynamic library file named FILENAME, and return a handle
+ for that dynamic library. Return NULL if the loading fails for any
+ reason. */
+
+gdb_dlhandle_up gdb_dlopen (const char *filename);
+
+/* Return the address of the symbol named SYMBOL inside the shared
+ library whose handle is HANDLE. Return NULL when the symbol could
+ not be found. */
+
+void *gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol);
+
+/* Return non-zero if the dynamic library functions are available on
+ this platform. */
+
+int is_dl_available(void);
+
+#endif /* GDB_DLFCN_H */