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:
		| @@ -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> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user