aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/gnu/gcj/runtime/natSharedLibLoader.cc')
-rw-r--r--libjava/gnu/gcj/runtime/natSharedLibLoader.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
index 90ed1d72d68..4970240019e 100644
--- a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
+++ b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
@@ -21,6 +21,7 @@ details. */
#ifdef HAVE_DLOPEN
#include <dlfcn.h>
+#include <link.h>
/* Only used during dlopen, while having a lock on Class.class. */
static java::lang::ClassLoader *curLoader;
@@ -29,6 +30,33 @@ static gnu::gcj::runtime::SharedLibHelper *curHelper;
typedef void (*ClassHookFunc) (jclass);
typedef void (*CoreHookFunc) (_Jv_core_chain *);
+static int
+_Jv_GC_has_static_roots (struct dl_phdr_info * info, size_t size, void *ptr)
+{
+ static const char suffix[] = "libgcj.so.7";
+ const char *name = info->dlpi_name;
+
+ fprintf (stderr, "%p: lib %s ", ptr, name);
+
+ if (strlen (name) <= strlen (suffix))
+ goto defaul;
+
+ // If a DSO name ends with SUFFIX, it has GC roots.
+ if (strcmp (name + strlen (name) - strlen (suffix),
+ suffix) == 0)
+ {
+ fprintf (stderr, "registered\n");
+ return 1;
+ }
+
+ defaul:
+ fprintf (stderr, "not registered\n");
+ return 0;
+}
+
+int (*GC_has_static_roots)(struct dl_phdr_info * info, size_t size, void *ptr)
+ = _Jv_GC_has_static_roots;
+
void
_Jv_sharedlib_register_hook (jclass cls)
{