Merge "util to get get symbol from a library"

This commit is contained in:
qctecmdr Service 2019-03-11 09:50:59 -07:00 committed by Gerrit - the friendly Code Review server
commit de7fa11dd6
4 changed files with 61 additions and 1 deletions

View file

@ -9,6 +9,7 @@ include $(CLEAR_VARS)
## Libs
LOCAL_SHARED_LIBRARIES := \
libdl \
libutils \
libcutils \
liblog \

View file

@ -61,7 +61,7 @@ libgps_utils_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0
libgps_utils_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
endif
libgps_utils_la_LIBADD = $(CUTILS_LIBS)
libgps_utils_la_LIBADD = $(CUTILS_LIBS) -ldl
#Create and Install libraries
lib_LTLIBRARIES = libgps_utils.la

View file

@ -30,6 +30,7 @@
#define LOG_TAG "LocSvc_misc_utils"
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#include <log_util.h>
#include <loc_misc_utils.h>
#include <ctype.h>
@ -112,3 +113,33 @@ void loc_util_trim_space(char *org_string)
err:
return;
}
inline void logDlError(const char* failedCall) {
const char * err = dlerror();
LOC_LOGe("%s error: %s", failedCall, (nullptr == err) ? "unknown" : err);
}
void* dlGetSymFromLib(void*& libHandle, const char* libName, const char* symName)
{
void* sym = nullptr;
if ((nullptr != libHandle || nullptr != libName) && nullptr != symName) {
if (nullptr == libHandle) {
libHandle = dlopen(libName, RTLD_NOW);
if (nullptr == libHandle) {
logDlError("dlopen");
}
}
// NOT else, as libHandle gets assigned 5 line above
if (nullptr != libHandle) {
sym = dlsym(libHandle, symName);
if (nullptr == sym) {
logDlError("dlsym");
}
}
} else {
LOC_LOGe("Either libHandle (%p) or libName (%p) must not be null; "
"symName (%p) can not be null.", libHandle, libName, symName);
}
return sym;
}

View file

@ -92,6 +92,34 @@ SIDE EFFECTS
N/A
===========================================================================*/
void loc_util_trim_space(char *org_string);
/*===========================================================================
FUNCTION dlGetSymFromLib
DESCRIPTION
Handy function to get a pointer to a symbol from a library.
If libHandle is not null, it will be used as the handle to the library. In
that case libName wll not be used;
libHandle is an in / out parameter.
If libHandle is null, libName will be used to dlopen.
Either libHandle or libName must not be nullptr.
symName must not be null.
DEPENDENCIES
N/A
RETURN VALUE
pointer to symName. Could be nullptr if
Parameters are incorrect; or
libName can not be opened; or
symName can not be found.
SIDE EFFECTS
N/A
===========================================================================*/
void* dlGetSymFromLib(void*& libHandle, const char* libName, const char* symName);
#ifdef __cplusplus
}
#endif