about summary refs log tree commit diff stats
path: root/src/wrapped32/wrappedlibdl.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-08-26 17:45:13 +0200
committerGitHub <noreply@github.com>2024-08-26 17:45:13 +0200
commitb5105a1e57bba3305d5dce93ab4d2f7faab6b34a (patch)
treeab26b700d3c48f2c8e32a1084ae7c2e7a8448b06 /src/wrapped32/wrappedlibdl.c
parent9beb745765e9c99bad6410094a97bf0bf9ebc1eb (diff)
downloadbox64-b5105a1e57bba3305d5dce93ab4d2f7faab6b34a.tar.gz
box64-b5105a1e57bba3305d5dce93ab4d2f7faab6b34a.zip
Added preliminary Box32 support (#1760)
* Improve the ReserveHigMemory helper function

* [BOX32] Added some wrapping infrastructure

* [BOX32] More wrapped 32bits lib infrastructure

* [BOX32] Added callback and tls 32bits handling

* [BOX32] Added more 32bits, around wrappers and elfs

* [BOX32] Added the 32bits version of myalign

* [BOX32] More wrapped libs and 32bits fixes and imrpovments

* [BOX32] Added some 32bits tests

* [BOX32] Try to enable some Box32 build and test on the CI

* [BOX32] Disable Box32 testing on CI platform that use qemu

* [BOX32] Another attempt to disable Box32 testing on CI platform that use qemu

* [BOX32] Small fix for another attempt to disable Box32 testing on CI platform that use qemu

* [BOX32] Yet another fix for another attempt to disable Box32 testing on CI platform that use qemu

* [BOX32] Fixed a typo in CI script

* [BOX32] Better scratch alighnment and enabled more tests

* [BOX32] Added (partial) wrapped 32bits librt

* [BOX32] Added mention of Box32 in README

* [BOX32] Added phtread handling, and numerous fixes to 32bits handling. [ARM64_DYNAREC] Fixed access to segment with negative offset

* [BOX32] Added system libs and cpp testing, plus some more fixes

* [BOX32] Fix previous commit

* [BOX32] Better stack adjustment for 32bits processes

* [BOX32] Added getenv wrapped 32bits function and friends

* [BOX32] Don't look for box86 for a Box32 build

* [BOX32] Don't do 32bits cppThreads test for now on CI

* [BOX32] Enabled a few more 32bits tests

* [BOX32] For ld_lib_path for both CppThreads tests

* [BOX32] [ANDROID] Some Fixes for Android Build

* [BOX32] Still need to disable cppThread_32bits test on CI for some reason

* [BOX32] [ANDROID] Don't show PreInit Array Warning (#1751)

* [BOX32] [ANDROID] One More Fix for Android Build That I forgotten to … (#1752)

* [BOX32] [ANDROID] One More Fix for Android Build That I forgotten to push before

* [BOX32] [ANDROID] Try to Create __libc_init

* [BOX32] [ANDROID] Try to disable NEEDED_LIBS for now (libdl is not wrapped)

* [BOX32] Updated generated files

* [BOX32] Added 32bits context functions

* [BOX32] Added 32bits signal handling

* [BOX32] Added some missing 32bits elfloader functions

* [BOX32] Fix build on x86_64 machine

* [BOX32] Better fix for x86_64 build

* [BOX32] Actually added missing libs, and re-enabled cppThreads_32bits test

* [BOX32] Added wrapped 32bits libdl

* [BOX32] Try to re-enabled Box32 test on CI for ARM64 builds

* [BOX32] fine-tuning Box32 test on CI for ARM64 builds

* [BOX32] More fine-tuning to Box32 test on CI for ARM64 builds

* [BOX32] Enabled Box32 test on CI for LA64 and RV64 builds too

* [BOX32] re-Disabled Box32 test on CI for LA64 and RV64 builds, not working for now

* [BOX32] Temporarily disabled cppThreads_32bits test on CI

---------

Co-authored-by: KreitinnSoftware <pablopro5051@gmail.com>
Co-authored-by: KreitinnSoftware <80591934+KreitinnSoftware@users.noreply.github.com>
Diffstat (limited to 'src/wrapped32/wrappedlibdl.c')
-rwxr-xr-xsrc/wrapped32/wrappedlibdl.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/wrapped32/wrappedlibdl.c b/src/wrapped32/wrappedlibdl.c
new file mode 100755
index 00000000..c3a79feb
--- /dev/null
+++ b/src/wrapped32/wrappedlibdl.c
@@ -0,0 +1,165 @@
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <elf.h>
+#include <link.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper32.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "emu/x64emu_private.h"
+#include "library.h"
+#include "librarian.h"
+#include "box32context.h"
+#include "elfloader.h"
+#include "elfs/elfloader_private.h"
+#include "x64emu.h"
+
+
+#define LIBNAME libdl
+#ifdef ANDROID
+    static const char* libdlName = "libdl.so";
+#else
+    static const char* libdlName = "libdl.so.2";
+#endif
+
+void* my_dlopen(x64emu_t* emu, void *filename, int flag) EXPORT;
+void* my_dlmopen(x64emu_t* emu, void* mlid, void *filename, int flag) EXPORT;
+char* my_dlerror(x64emu_t* emu) EXPORT;
+void* my_dlsym(x64emu_t* emu, void *handle, void *symbol) EXPORT;
+int my_dlclose(x64emu_t* emu, void *handle) EXPORT;
+int my32_dladdr(x64emu_t* emu, void *addr, void *info) EXPORT;
+int my32_dladdr1(x64emu_t* emu, void *addr, void *info, void** extra_info, int flags) EXPORT;
+void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) EXPORT;
+int my32_dlinfo(x64emu_t* emu, void* handle, int request, void* info) EXPORT;
+
+#ifndef RTLD_DL_SYMENT
+#define RTLD_DL_SYMENT 1
+#endif
+#ifndef RTLD_DL_LINKMAP
+#define RTLD_DL_LINKMAP 2
+#endif
+
+void dl_clear_error();
+#define CLEARERR    dl_clear_error()
+void dl_set_error(const char*);
+char* dl_last_error();
+library_t* dl_get_library(void* handle);
+
+typedef struct my_dl_info_32_s
+{
+  ptr_t dli_fname;	// const char*
+  ptr_t dli_fbase;	// void*
+  ptr_t dli_sname;	// const char*
+  ptr_t dli_saddr;	// void*
+} my_dl_info_32_t;
+
+int my32_dladdr1(x64emu_t* emu, void *addr, void *i, void** extra_info, int flags)
+{
+    //int dladdr(void *addr, my_dl_info_32_t *info);
+    CLEARERR;
+    my_dl_info_32_t *info = (my_dl_info_32_t*)i;
+    printf_log(LOG_DEBUG, "Warning: partially unimplement call to dladdr/dladdr1(%p, %p, %p, %d)\n", addr, info, extra_info, flags);
+    
+    //emu->quit = 1;
+    library_t* lib = NULL;
+    info->dli_saddr = 0;
+    info->dli_fname = 0;
+    void* start = NULL;
+    const char* fname = NULL;
+    void* base = NULL;
+    const char* sname = FindSymbolName(my_context->maplib, addr, &start, NULL, &fname, &base, &lib);
+    info->dli_saddr = to_ptrv(start);
+    info->dli_fname = to_ptrv((void*)fname);
+    info->dli_fbase = to_ptrv(base);
+    info->dli_sname = to_ptrv((void*)sname);
+    printf_log(LOG_DEBUG, "     dladdr return saddr=%p, fname=\"%s\", sname=\"%s\"\n", start, sname?sname:"", fname?fname:"");
+    if(flags==RTLD_DL_SYMENT) {
+        printf_log(LOG_INFO, "Warning, unimplement call to dladdr1 with RTLD_DL_SYMENT flags\n");
+    } else if (flags==RTLD_DL_LINKMAP) {
+        printf_log(LOG_INFO, "Warning, unimplemented call to dladdr1 with RTLD_DL_LINKMAP flags\n");
+        *(ptr_t*)extra_info = to_ptrv(getLinkMapLib32(lib));
+    }
+    return (info->dli_sname)?1:0;   // success is non-null here...
+}
+int my32_dladdr(x64emu_t* emu, void *addr, void *i)
+{
+    return my32_dladdr1(emu, addr, i, NULL, 0);
+}
+
+int my32_dlinfo(x64emu_t* emu, void* handle, int request, void* info)
+{
+    (void)emu;
+    printf_dlsym(LOG_DEBUG, "Call to dlinfo(%p, %d, %p)\n", handle, request, info);
+    CLEARERR;
+    library_t *lib = dl_get_library(handle);
+    if(lib==(library_t*)-1LL) {
+        printf_dlsym(LOG_DEBUG, "dlinfo: %s\n", dl_last_error());
+        return -1;
+    }
+    //elfheader_t *h = (GetElfIndex(lib)>-1)?my_context->elfs[GetElfIndex(lib)]:NULL;
+    switch(request) {
+        case 2: // RTLD_DI_LINKMAP
+            {
+                *(linkmap32_t**)info = getLinkMapLib32(lib);
+            }
+            return 0;
+        default:
+            printf_log(LOG_NONE, "Warning, unsupported call to dlinfo(%p, %d, %p)\n", handle, request, info);
+            {
+                char tmp[129] = {0};
+                snprintf(tmp, 129, "unsupported call to dlinfo request:%d\n", request);
+                dl_set_error(tmp);
+            }
+    }
+    return -1;
+}
+
+typedef struct my_dl_find_object_s {
+    uint64_t    dlfo_flags;
+    ptr_t       dlfo_map_start;
+    ptr_t       dlfo_map_end;
+    ptr_t       dlf_link_map;   //struct link_map *
+    ptr_t       dlfo_eh_frame;
+    // other stuff...
+} my_dl_find_object_t;
+
+EXPORT int my32__dl_find_object(x64emu_t* emu, void* addr, my_dl_find_object_t* result)
+{
+    //printf_log(LOG_INFO, "Unimplemented _dl_find_object called\n");
+    uintptr_t start=0, sz=0;
+    elfheader_t* h = FindElfAddress(my_context, (uintptr_t)addr);
+    if(h) {
+        // find an actual elf
+        const char* name = FindNearestSymbolName(h, addr, &start, &sz);
+        result->dlfo_map_start = start;
+        result->dlfo_map_end = start+sz-1;
+        result->dlfo_eh_frame = h->ehframehdr+h->delta;
+        result->dlfo_flags = 0;   // unused it seems
+        result->dlf_link_map = to_ptrv(getLinkMapElf32(h));
+        return 0;
+    }
+    return -1;
+}
+
+//#define CUSTOM_INIT\
+//        if(!box32_isglibc234) setNeededLibs(lib, 1, "libc.so.6");
+
+
+void closeAllDLOpenned();
+
+#define PRE_INIT\
+    if(1)                                                           \
+        lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);    \
+    else
+
+#define CUSTOM_FINI \
+    closeAllDLOpenned();
+
+// define all standard library functions
+#include "wrappedlib_init32.h"