aboutsummaryrefslogtreecommitdiff
path: root/gdbserver/dll.cc
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2020-02-13 16:27:51 -0500
committerSimon Marchi <simon.marchi@efficios.com>2020-02-13 16:27:51 -0500
commitfeacfcacaac9f7e62f467a33c4ae54c56501ed18 (patch)
tree0e083366350e9fd279bec8c7b12413c90b9f255d /gdbserver/dll.cc
parent06b3c5bdb018262d7c09cda9d4637015c7ebe779 (diff)
downloadgdb-feacfcacaac9f7e62f467a33c4ae54c56501ed18.zip
gdb-feacfcacaac9f7e62f467a33c4ae54c56501ed18.tar.gz
gdb-feacfcacaac9f7e62f467a33c4ae54c56501ed18.tar.bz2
gdbserver: rename source files to .cc
For the same reasons outlined in the previous patch, this patch renames gdbserver source files to .cc. I have moved the "-x c++" switch to only those rules that require it. gdbserver/ChangeLog: * Makefile.in: Rename source files from .c to .cc. * %.c: Rename to %.cc. * configure.ac: Rename server.c to server.cc. * configure: Re-generate.
Diffstat (limited to 'gdbserver/dll.cc')
-rw-r--r--gdbserver/dll.cc80
1 files changed, 80 insertions, 0 deletions
diff --git a/gdbserver/dll.cc b/gdbserver/dll.cc
new file mode 100644
index 0000000..fdc7bec
--- /dev/null
+++ b/gdbserver/dll.cc
@@ -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 ();
+}