diff options
Diffstat (limited to 'libjava/posix.cc')
-rw-r--r-- | libjava/posix.cc | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libjava/posix.cc b/libjava/posix.cc index 608fd5dad90..41702dfffb9 100644 --- a/libjava/posix.cc +++ b/libjava/posix.cc @@ -17,7 +17,12 @@ details. */ #include <signal.h> #include <stdio.h> +#ifdef HAVE_DLFCN_H +#include <dlfcn.h> +#endif + #include <jvm.h> +#include <java-stack.h> #include <java/lang/Thread.h> #include <java/io/InterruptedIOException.h> #include <java/util/Properties.h> @@ -203,3 +208,31 @@ _Jv_select (int n, fd_set *readfds, fd_set *writefds, return 0; #endif } + +// Given an address, find the object that defines it and the nearest +// defined symbol to that address. Returns 0 if no object defines this +// address. +int +_Jv_platform_dladdr (const void *addr, _Jv_AddrInfo *info) +{ + int ret_val = 0; + +#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR) + Dl_info addr_info; + ret_val = dladdr (addr, &addr_info); + if (ret_val != 0) + { + info->file_name = addr_info.dli_fname; + info->base = addr_info.dli_fbase; + info->sym_name = addr_info.dli_sname; + info->sym_addr = addr_info.dli_saddr; + } +#else + info->file_name = NULL; + info->base = NULL; + info->sym_name = NULL; + info->sym_addr = NULL; +#endif + + return ret_val; +} |