summaryrefslogtreecommitdiff
path: root/gdbserver/dll.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-12-15 07:37:06 -0700
committerTom Tromey <tromey@adacore.com>2020-02-07 08:42:25 -0700
commit919adfe8409211c726c1d05b47ca59890ee648f1 (patch)
treed2ef4abf9e5590b43a59f3f8747b0d5bab94ab6f /gdbserver/dll.c
parente8319fde715960466aca2461c74cec8907abd391 (diff)
downloadbinutils-gdb-919adfe8409211c726c1d05b47ca59890ee648f1.tar.gz
Move gdbserver to top level
This patch moves gdbserver to the top level. This patch is as close to a pure move as possible -- gdbserver still builds its own variant of gnulib and gdbsupport. Changing this will be done in a separate patch. [v2] Note that, per Simon's review comment, this patch changes the tree so that gdbserver is not built for or1k or score. This makes sense, because there is apparently not actually a gdbserver port here. [v3] This version of the patch also splits out some configury into a new file, gdbserver/configure.host, so that the top-level configure script can simply rely on it in order to decide whether gdbserver should be built. [v4] This version adds documentation and removes some unnecessary top-level dependencies. [v5] Update docs to mention "make all-gdbserver" and change how top-level configure decides whether to build gdbserver, switching to a single, shared script. Tested by the buildbot. ChangeLog 2020-02-07 Tom Tromey <tom@tromey.com> Pedro Alves <palves@redhat.com> * src-release.sh (GDB_SUPPORT_DIRS): Add gdbserver. * gdbserver: New directory, moved from gdb/gdbserver. * configure.ac (host_tools): Add gdbserver. Only build gdbserver on certain systems. * Makefile.in, configure: Rebuild. * Makefile.def (host_modules, dependencies): Add gdbserver. * MAINTAINERS: Add gdbserver. gdb/ChangeLog 2020-02-07 Tom Tromey <tom@tromey.com> * README: Update gdbserver documentation. * gdbserver: Move to top level. * configure.tgt (build_gdbserver): Remove. * configure.ac: Remove --enable-gdbserver. * configure: Rebuild. * Makefile.in (distclean): Don't mention gdbserver. Change-Id: I826b7565b54604711dc7a11edea0499cd51ff39e
Diffstat (limited to 'gdbserver/dll.c')
-rw-r--r--gdbserver/dll.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/gdbserver/dll.c b/gdbserver/dll.c
new file mode 100644
index 00000000000..fdc7becfbee
--- /dev/null
+++ b/gdbserver/dll.c
@@ -0,0 +1,80 @@
+/* Copyright (C) 2002-2020 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 "server.h"
+#include "dll.h"
+
+#include <algorithm>
+
+/* An "unspecified" CORE_ADDR, for match_dll. */
+#define UNSPECIFIED_CORE_ADDR (~(CORE_ADDR) 0)
+
+std::list<dll_info> all_dlls;
+int dlls_changed;
+
+/* Record a newly loaded DLL at BASE_ADDR. */
+
+void
+loaded_dll (const char *name, CORE_ADDR base_addr)
+{
+ all_dlls.emplace_back (name != NULL ? name : "", base_addr);
+ dlls_changed = 1;
+}
+
+/* Record that the DLL with NAME and BASE_ADDR has been unloaded. */
+
+void
+unloaded_dll (const char *name, CORE_ADDR base_addr)
+{
+ auto pred = [&] (const dll_info &dll)
+ {
+ if (base_addr != UNSPECIFIED_CORE_ADDR
+ && base_addr == dll.base_addr)
+ return true;
+
+ if (name != NULL && dll.name == name)
+ return true;
+
+ return false;
+ };
+
+ auto iter = std::find_if (all_dlls.begin (), all_dlls.end (), pred);
+
+ if (iter == all_dlls.end ())
+ /* For some inferiors we might get unloaded_dll events without having
+ a corresponding loaded_dll. In that case, the dll cannot be found
+ in ALL_DLL, and there is nothing further for us to do.
+
+ This has been observed when running 32bit executables on Windows64
+ (i.e. through WOW64, the interface between the 32bits and 64bits
+ worlds). In that case, the inferior always does some strange
+ unloading of unnamed dll. */
+ return;
+ else
+ {
+ /* DLL has been found so remove the entry and free associated
+ resources. */
+ all_dlls.erase (iter);
+ dlls_changed = 1;
+ }
+}
+
+void
+clear_dlls (void)
+{
+ all_dlls.clear ();
+}