diff options
Diffstat (limited to 'libjava/gnu/gcj/runtime/natSharedLibLoader.cc')
-rw-r--r-- | libjava/gnu/gcj/runtime/natSharedLibLoader.cc | 28 |
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) { |