Implement dladdr() (partially)
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>
This commit is contained in:
parent
51a993c266
commit
c8432a01c8
|
@ -364,6 +364,7 @@ difftime NOSIGFE
|
||||||
dirfd SIGFE
|
dirfd SIGFE
|
||||||
dirname NOSIGFE
|
dirname NOSIGFE
|
||||||
div NOSIGFE
|
div NOSIGFE
|
||||||
|
dladdr SIGFE
|
||||||
dlclose SIGFE
|
dlclose SIGFE
|
||||||
dlerror NOSIGFE
|
dlerror NOSIGFE
|
||||||
dlfork NOSIGFE
|
dlfork NOSIGFE
|
||||||
|
|
|
@ -386,3 +386,37 @@ dlerror ()
|
||||||
}
|
}
|
||||||
return res;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -472,12 +472,13 @@ details. */
|
||||||
305: [f]pathconf flag _PC_CASE_INSENSITIVE added.
|
305: [f]pathconf flag _PC_CASE_INSENSITIVE added.
|
||||||
306: Export getentropy, getrandom.
|
306: Export getentropy, getrandom.
|
||||||
307: Export timingsafe_bcmp, timingsafe_memcmp.
|
307: Export timingsafe_bcmp, timingsafe_memcmp.
|
||||||
|
308: Export dladdr.
|
||||||
|
|
||||||
Note that we forgot to bump the api for ualarm, strtoll, strtoull,
|
Note that we forgot to bump the api for ualarm, strtoll, strtoull,
|
||||||
sigaltstack, sethostname. */
|
sigaltstack, sethostname. */
|
||||||
|
|
||||||
#define CYGWIN_VERSION_API_MAJOR 0
|
#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
|
/* There is also a compatibity version number associated with the shared memory
|
||||||
regions. It is incremented when incompatible changes are made to the shared
|
regions. It is incremented when incompatible changes are made to the shared
|
||||||
|
|
|
@ -9,6 +9,9 @@ details. */
|
||||||
#ifndef _DLFCN_H
|
#ifndef _DLFCN_H
|
||||||
#define _DLFCN_H
|
#define _DLFCN_H
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -42,6 +45,21 @@ extern void dlfork (int);
|
||||||
#define RTLD_DEEPBIND 32 /* Place lookup scope so that this lib is */
|
#define RTLD_DEEPBIND 32 /* Place lookup scope so that this lib is */
|
||||||
/* preferred over global scope. */
|
/* 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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,6 +3,8 @@ What's new:
|
||||||
|
|
||||||
- New API: timingsafe_bcmp, timingsafe_memcmp
|
- New API: timingsafe_bcmp, timingsafe_memcmp
|
||||||
|
|
||||||
|
- New API: dladdr
|
||||||
|
|
||||||
What changed:
|
What changed:
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
|
@ -1277,6 +1277,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
|
||||||
clog10
|
clog10
|
||||||
clog10f
|
clog10f
|
||||||
clog10l
|
clog10l
|
||||||
|
dladdr (see chapter "Implementation Notes")
|
||||||
dremf
|
dremf
|
||||||
dup3
|
dup3
|
||||||
envz_add
|
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,
|
<para><function>basename</function> is available in both POSIX and GNU flavors,
|
||||||
depending on whether libgen.h is included or not.</para>
|
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>
|
</sect1>
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
Loading…
Reference in New Issue