]> sourceware.org Git - newlib-cygwin.git/commitdiff
Implement dladdr() (partially)
authorJon Turney <jon.turney@dronecode.org.uk>
Mon, 6 Mar 2017 18:30:45 +0000 (18:30 +0000)
committerJon Turney <jon.turney@dronecode.org.uk>
Wed, 8 Mar 2017 17:49:08 +0000 (17:49 +0000)
Note that this always returns with dli_sname and dli_saddr set to NULL,
indicating no symbol matching addr could be found.

Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
winsup/cygwin/common.din
winsup/cygwin/dlfcn.cc
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/include/dlfcn.h
winsup/cygwin/release/2.7.1
winsup/doc/posix.xml

index 6cbb012fc7e7e429df03476370ac085fc746d86d..f23681308b8cf79ec02053b8b5df453d152b1bd4 100644 (file)
@@ -364,6 +364,7 @@ difftime NOSIGFE
 dirfd SIGFE
 dirname NOSIGFE
 div NOSIGFE
+dladdr SIGFE
 dlclose SIGFE
 dlerror NOSIGFE
 dlfork NOSIGFE
index 159d4fe889bc38f27206ae6e7b7e631339485c7e..9959ff75273928dabf2eaa6207e048e40d0c84ec 100644 (file)
@@ -386,3 +386,37 @@ dlerror ()
     }
   return res;
 }
+
+extern "C" int
+dladdr (const void *addr, Dl_info *info)
+{
+  HMODULE hModule;
+  BOOL ret = GetModuleHandleEx (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
+                               (LPCSTR) addr,
+                               &hModule);
+  if (!ret)
+    return 0;
+
+  /* Module handle happens to be equal to it's base load address. */
+  info->dli_fbase = hModule;
+
+  /* Get the module filename.  This pathname may be in short-, long- or //?/
+     format, depending on how it was specified when loaded, but we assume this
+     is always an absolute pathname. */
+  WCHAR fname[MAX_PATH];
+  DWORD length = GetModuleFileNameW (hModule, fname, MAX_PATH);
+  if ((length == 0) || (length == MAX_PATH))
+    return 0;
+
+  /* Convert to a cygwin pathname */
+  ssize_t conv = cygwin_conv_path (CCP_WIN_W_TO_POSIX | CCP_ABSOLUTE, fname,
+                                  info->dli_fname, MAX_PATH);
+  if (conv)
+    return 0;
+
+  /* Always indicate no symbol matching addr could be found. */
+  info->dli_sname = NULL;
+  info->dli_saddr = NULL;
+
+  return 1;
+}
index 308bc8b0ffb38fd1bb6c6cfa7a2331890caecf75..6023131990ac61d58b025f13d67bacac7efecfe4 100644 (file)
@@ -472,12 +472,13 @@ details. */
   305: [f]pathconf flag _PC_CASE_INSENSITIVE added.
   306: Export getentropy, getrandom.
   307: Export timingsafe_bcmp, timingsafe_memcmp.
+  308: Export dladdr.
 
   Note that we forgot to bump the api for ualarm, strtoll, strtoull,
   sigaltstack, sethostname. */
 
 #define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 307
+#define CYGWIN_VERSION_API_MINOR 308
 
 /* There is also a compatibity version number associated with the shared memory
    regions.  It is incremented when incompatible changes are made to the shared
index 8522ec5792e3a2e0320f1a6c52d8273dbf1985cf..d9435d044e23483a7d14aea5e02ab17f1ea3842a 100644 (file)
@@ -9,6 +9,9 @@ details. */
 #ifndef _DLFCN_H
 #define _DLFCN_H
 
+#include <sys/cdefs.h>
+#include <limits.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -42,6 +45,21 @@ extern void dlfork (int);
 #define RTLD_DEEPBIND  32      /* Place lookup scope so that this lib is    */
                                /* preferred over global scope.  */
 
+
+#if __GNU_VISIBLE
+typedef struct Dl_info Dl_info;
+
+struct Dl_info
+{
+   char        dli_fname[PATH_MAX];  /* Filename of defining object */
+   void       *dli_fbase;            /* Load address of that object */
+   const char *dli_sname;            /* Name of nearest lower symbol */
+   void       *dli_saddr;            /* Exact value of nearest symbol */
+};
+
+extern int dladdr (const void *addr, Dl_info *info);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
index 227d7a2a83287bb0ca2a5468fd2e7414ab95d19e..43d9bd0a203bc7da0fbbda05e0b3248e475be997 100644 (file)
@@ -3,6 +3,8 @@ What's new:
 
 - New API: timingsafe_bcmp, timingsafe_memcmp
 
+- New API: dladdr
+
 What changed:
 -------------
 
index fac32b7710ed52077994dfdc80be963e0f163311..03d168d3e2962855cbcb61c3ad38c2772ed72507 100644 (file)
@@ -1277,6 +1277,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
     clog10
     clog10f
     clog10l
+    dladdr                     (see chapter "Implementation Notes")
     dremf
     dup3
     envz_add
@@ -1665,6 +1666,9 @@ depending on whether _BSD_SOURCE or _GNU_SOURCE is defined when compiling.</para
 <para><function>basename</function> is available in both POSIX and GNU flavors,
 depending on whether libgen.h is included or not.</para>
 
+<para><function>dladdr</function> always sets the Dl_info members dli_sname and
+dli_saddr to NULL, indicating no symbol matching addr could be found.</para>
+
 </sect1>
 
 </chapter>
This page took 0.036206 seconds and 5 git commands to generate.