Implement internal libdl API 92/195592/2
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 13 Nov 2018 13:21:50 +0000 (16:21 +0300)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 28 Dec 2018 08:57:59 +0000 (11:57 +0300)
Change-Id: I34998b5f85fffeb3aa3aaf0055d6478fa71dce04
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
src/CMakeLists.txt
src/core/internal_libdl.cpp [new file with mode: 0644]
src/core/internal_libdl.h [new file with mode: 0644]

index a7cac44..742d2ef 100644 (file)
@@ -16,6 +16,7 @@ set(SRC
   core/core.cpp
   core/injector.cpp
   core/internal_libc.cpp
+  core/internal_libdl.cpp
 )
 
 add_library(${PROJECT_NAME} SHARED ${SRC})
diff --git a/src/core/internal_libdl.cpp b/src/core/internal_libdl.cpp
new file mode 100644 (file)
index 0000000..74e9d9d
--- /dev/null
@@ -0,0 +1,28 @@
+#include "internal_libdl.h"
+
+// private libc interface
+#define __RTLD_DLOPEN   0x80000000
+extern "C" void *__libc_dlopen_mode(const char * filename, int flag);
+extern "C" void *__libc_dlsym(void *handle, const char *symbol);
+extern "C" int __libc_dlclose(void *handle);
+
+namespace __swap {
+namespace internal {
+
+void *dlopen(const char *filename, int flag) noexcept
+{
+    return __libc_dlopen_mode(filename, __RTLD_DLOPEN | flag);
+}
+
+void *dlsym(void *handle, const char *symbol) noexcept
+{
+    return __libc_dlsym(handle, symbol);
+}
+
+int dlclose(void *handle) noexcept
+{
+    return __libc_dlclose(handle);
+}
+
+} // namespace internal
+} // namespace __swap
diff --git a/src/core/internal_libdl.h b/src/core/internal_libdl.h
new file mode 100644 (file)
index 0000000..deaa4c7
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef INTERNAL_LIBDL_H
+#define INTERNAL_LIBDL_H
+
+#include <dlfcn.h>  // RTLD_* flags
+
+namespace __swap {
+namespace internal {
+
+void *dlopen(const char *filename, int flag) noexcept;
+void *dlsym(void *handle, const char *symbol) noexcept;
+int dlclose(void *handle) noexcept;
+
+} // namespace internal
+} // namespace __swap
+
+#endif // INTERNAL_LIBDL_H