Skip to content

Commit

Permalink
[#145] Added dlerror messages to dlopen and dlsym
Browse files Browse the repository at this point in the history
  • Loading branch information
dmed256 committed Jul 4, 2018
1 parent b0d28d6 commit 3fc6753
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions src/tools/sys.cpp
Expand Up @@ -762,15 +762,19 @@ namespace occa {

if (dlHandle == NULL) {
lock.release();
OCCA_ERROR("Error loading binary [" << io::shortname(filename) << "] with dlopen",
false);
char *error = dlerror();
if (error) {
OCCA_FORCE_ERROR("Error loading binary [" << io::shortname(filename) << "] with dlopen: " << error);
} else {
OCCA_FORCE_ERROR("Error loading binary [" << io::shortname(filename) << "] with dlopen");
}
}
#else
void *dlHandle = LoadLibraryA(filename.c_str());

if (dlHandle == NULL) {
lock.release();
OCCA_ERROR("Error loading dll [" << io::shortname(filename) << "] (WIN32 error: " << GetLastError() << ")",
OCCA_ERROR("Error loading .dll [" << io::shortname(filename) << "]: " << GetLastError(),
dlHandle != NULL);
}
#endif
Expand All @@ -781,35 +785,39 @@ namespace occa {
functionPtr_t dlsym(void *dlHandle,
const std::string &functionName,
const io::lock_t &lock) {
OCCA_ERROR("dl handle is NULL",
dlHandle);

#if (OCCA_OS & (OCCA_LINUX_OS | OCCA_MACOS_OS))
void *sym = ::dlsym(dlHandle, functionName.c_str());

char *dlError;

if ((dlError = dlerror()) != NULL) {
if (!sym) {
lock.release();
OCCA_ERROR("Error loading symbol from binary with dlsym (DL Error: " << dlError << ")",
false);
char *error = dlerror();
if (error) {
OCCA_FORCE_ERROR("Error loading symbol [" << functionName << "] from binary with dlsym: " << error << "");
} else {
OCCA_FORCE_ERROR("Error loading symbol [" << functionName << "] from binary with dlsym");
}
}
#else
void *sym = GetProcAddress((HMODULE) dlHandle, functionName.c_str());

if (sym == NULL) {
lock.release();
OCCA_ERROR("Error loading symbol from binary with GetProcAddress",
false);
OCCA_FORCE_ERROR("Error loading symbol [" << functionName << "] from binary with GetProcAddress");
}
#endif

functionPtr_t sym2;

::memcpy(&sym2, &sym, sizeof(sym));

return sym2;
}

void dlclose(void *dlHandle) {
if (!dlHandle) {
return;
}
#if (OCCA_OS & (OCCA_LINUX_OS | OCCA_MACOS_OS))
::dlclose(dlHandle);
#else
Expand Down

0 comments on commit 3fc6753

Please sign in to comment.