dirfd SIGFE
dirname NOSIGFE
div NOSIGFE
+dladdr SIGFE
dlclose SIGFE
dlerror NOSIGFE
dlfork NOSIGFE
}
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;
+}
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
#ifndef _DLFCN_H
#define _DLFCN_H
+#include <sys/cdefs.h>
+#include <limits.h>
+
#ifdef __cplusplus
extern "C" {
#endif
#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
- New API: timingsafe_bcmp, timingsafe_memcmp
+- New API: dladdr
+
What changed:
-------------
clog10
clog10f
clog10l
+ dladdr (see chapter "Implementation Notes")
dremf
dup3
envz_add
<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>