提交 c6cb42e4 编写于 作者: A Andy Polyakov

"Relax" prototype and rename DSO_global_lookup_func to DSO_global_lookup.

上级 2d43a894
...@@ -173,9 +173,8 @@ typedef struct dso_meth_st ...@@ -173,9 +173,8 @@ typedef struct dso_meth_st
/* Return pathname of the module containing location */ /* Return pathname of the module containing location */
int (*pathbyaddr)(void *addr,char *path,int sz); int (*pathbyaddr)(void *addr,char *path,int sz);
/* Perform global symbol lookup, i.e. among *all* modules, /* Perform global symbol lookup, i.e. among *all* modules */
* see commentray in dso_lib.c for further details. */ void *(*globallookup)(const char *symname);
DSO_FUNC_TYPE (*globallookup)(const char *symname);
} DSO_METHOD; } DSO_METHOD;
/**********************************************************************/ /**********************************************************************/
...@@ -313,6 +312,16 @@ DSO_METHOD *DSO_METHOD_vms(void); ...@@ -313,6 +312,16 @@ DSO_METHOD *DSO_METHOD_vms(void);
*/ */
int DSO_pathbyaddr(void *addr,char *path,int sz); int DSO_pathbyaddr(void *addr,char *path,int sz);
/* This function should be used with caution! It looks up symbols in
* *all* loaded modules and if module gets unloaded by somebody else
* attempt to dereference the pointer is doomed to have fatal
* consequences. Primary usage for this function is to probe *core*
* system functionality, e.g. check if getnameinfo(3) is available
* at run-time without bothering about OS-specific details such as
* libc.so.versioning or where does it actually reside: in libc
* itself or libsocket. */
void *DSO_global_lookup(const char *name);
/* BEGIN ERROR CODES */ /* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes /* The following lines are auto generated by the script mkerr.pl. Any changes
* made after this point may be overwritten when the script is next run. * made after this point may be overwritten when the script is next run.
......
...@@ -86,7 +86,7 @@ static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg); ...@@ -86,7 +86,7 @@ static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg);
static char *dl_name_converter(DSO *dso, const char *filename); static char *dl_name_converter(DSO *dso, const char *filename);
static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2); static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2);
static int dl_pathbyaddr(void *addr,char *path,int sz); static int dl_pathbyaddr(void *addr,char *path,int sz);
static DSO_FUNC_TYPE dl_globallookup(const char *name); static void *dl_globallookup(const char *name);
static DSO_METHOD dso_meth_dl = { static DSO_METHOD dso_meth_dl = {
"OpenSSL 'dl' shared library method", "OpenSSL 'dl' shared library method",
...@@ -383,9 +383,9 @@ static int dl_pathbyaddr(void *addr,char *path,int sz) ...@@ -383,9 +383,9 @@ static int dl_pathbyaddr(void *addr,char *path,int sz)
return -1; return -1;
} }
static DSO_FUNC_TYPE dl_globallookup(const char *name) static void *dl_globallookup(const char *name)
{ {
DSO_FUNC_TYPE ret; void *ret;
shl_t h = NULL; shl_t h = NULL;
return shl_findsym(&h,name,TYPE_UNDEFINED,&ret) ? NULL : ret; return shl_findsym(&h,name,TYPE_UNDEFINED,&ret) ? NULL : ret;
......
...@@ -99,7 +99,7 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename); ...@@ -99,7 +99,7 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename);
static char *dlfcn_merger(DSO *dso, const char *filespec1, static char *dlfcn_merger(DSO *dso, const char *filespec1,
const char *filespec2); const char *filespec2);
static int dlfcn_pathbyaddr(void *addr,char *path,int sz); static int dlfcn_pathbyaddr(void *addr,char *path,int sz);
static DSO_FUNC_TYPE dlfcn_globallookup(const char *name); static void *dlfcn_globallookup(const char *name);
static DSO_METHOD dso_meth_dlfcn = { static DSO_METHOD dso_meth_dlfcn = {
"OpenSSL 'dlfcn' shared library method", "OpenSSL 'dlfcn' shared library method",
...@@ -446,17 +446,16 @@ static int dlfcn_pathbyaddr(void *addr,char *path,int sz) ...@@ -446,17 +446,16 @@ static int dlfcn_pathbyaddr(void *addr,char *path,int sz)
return -1; return -1;
} }
static DSO_FUNC_TYPE dlfcn_globallookup(const char *name) static void *dlfcn_globallookup(const char *name)
{ {
union { void *p; DSO_FUNC_TYPE f; } ret = { NULL }; void *ret = NULL,*handle = dlopen(NULL,RTLD_LAZY);
void *handle = dlopen(NULL,RTLD_LAZY);
if (handle) if (handle)
{ {
ret.p = dlsym(handle,name); ret = dlsym(handle,name);
dlclose(handle); dlclose(handle);
} }
return ret.f; return ret;
} }
#endif /* DSO_DLFCN */ #endif /* DSO_DLFCN */
...@@ -477,15 +477,7 @@ int DSO_pathbyaddr(void *addr,char *path,int sz) ...@@ -477,15 +477,7 @@ int DSO_pathbyaddr(void *addr,char *path,int sz)
return (*meth->pathbyaddr)(addr,path,sz); return (*meth->pathbyaddr)(addr,path,sz);
} }
/* This function should be used with caution! It looks up symbols in void *DSO_global_lookup(const char *name)
* *all* loaded modules and if module gets unloaded by somebody else
* attempt to dereference the pointer is doomed to have fatal
* consequences. Primary usage for this function is to probe *core*
* system functionality, e.g. check if getnameinfo(3) is available
* at run-time without bothering about OS-specific details such as
* libc.so.versioning or where does it actually reside: in libc
* itself or libsocket. */
DSO_FUNC_TYPE DSO_global_lookup_func(const char *name)
{ {
DSO_METHOD *meth = default_DSO_meth; DSO_METHOD *meth = default_DSO_meth;
if (meth == NULL) meth = DSO_METHOD_openssl(); if (meth == NULL) meth = DSO_METHOD_openssl();
......
...@@ -129,7 +129,7 @@ static char *win32_name_converter(DSO *dso, const char *filename); ...@@ -129,7 +129,7 @@ static char *win32_name_converter(DSO *dso, const char *filename);
static char *win32_merger(DSO *dso, const char *filespec1, static char *win32_merger(DSO *dso, const char *filespec1,
const char *filespec2); const char *filespec2);
static int win32_pathbyaddr(void *addr,char *path,int sz); static int win32_pathbyaddr(void *addr,char *path,int sz);
static DSO_FUNC_TYPE win32_globallookup(const char *name); static void *win32_globallookup(const char *name);
static const char *openssl_strnchr(const char *string, int c, size_t len); static const char *openssl_strnchr(const char *string, int c, size_t len);
...@@ -773,7 +773,7 @@ static int win32_pathbyaddr(void *addr,char *path,int sz) ...@@ -773,7 +773,7 @@ static int win32_pathbyaddr(void *addr,char *path,int sz)
return 0; return 0;
} }
static DSO_FUNC_TYPE win32_globallookup(const char *name) static void *win32_globallookup(const char *name)
{ {
HMODULE dll; HMODULE dll;
HANDLE hModuleSnap = INVALID_HANDLE_VALUE; HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册