about summary refs log tree commit diff stats
path: root/src/wrapped
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-09-02 11:56:20 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-09-02 11:56:20 +0200
commit2d37575f3d56931a9d20217fd508147f6601796b (patch)
tree78da0acc44e8d95917402e0ea0abc97304481e73 /src/wrapped
parenteb1e607b935a1c90c0c9cf0b352d95423e42740d (diff)
downloadbox64-2d37575f3d56931a9d20217fd508147f6601796b.tar.gz
box64-2d37575f3d56931a9d20217fd508147f6601796b.zip
[ANDROID] Try to create an Android build, porting box86 Android build
Diffstat (limited to 'src/wrapped')
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h2
-rwxr-xr-xsrc/wrapped/wrappedandroidshmem.c18
-rwxr-xr-xsrc/wrapped/wrappedandroidshmem_private.h8
-rw-r--r--src/wrapped/wrappedfreetype.c8
-rw-r--r--src/wrapped/wrappedgnutls.c8
-rw-r--r--src/wrapped/wrappedlibc.c115
-rw-r--r--src/wrapped/wrappedlibc_private.h13
-rw-r--r--src/wrapped/wrappedlibcups.c9
-rw-r--r--src/wrapped/wrappedlibm.c9
-rw-r--r--src/wrapped/wrappedmpg123.c8
11 files changed, 182 insertions, 18 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 8f8dc38b..2716c3a6 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -3897,6 +3897,8 @@ wrappedlibc:
   - __vsyslog_chk
 - vFpLLp:
   - qsort
+- vFpppp:
+  - __libc_init
 - iFiiip:
   - epoll_ctl
 - iFiiiN:
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index 508a16f6..e7a08c3e 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -58,6 +58,7 @@ typedef void* (*pFppV_t)(void*, void*, ...);
 typedef void (*vFiipV_t)(int32_t, int32_t, void*, ...);
 typedef void (*vFiipA_t)(int32_t, int32_t, void*, va_list);
 typedef void (*vFpLLp_t)(void*, uintptr_t, uintptr_t, void*);
+typedef void (*vFpppp_t)(void*, void*, void*, void*);
 typedef int32_t (*iFiiip_t)(int32_t, int32_t, int32_t, void*);
 typedef int32_t (*iFiiiN_t)(int32_t, int32_t, int32_t, ...);
 typedef int32_t (*iFiipV_t)(int32_t, int32_t, void*, ...);
@@ -228,6 +229,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(__syslog_chk, vFiipV_t) \
 	GO(__vsyslog_chk, vFiipA_t) \
 	GO(qsort, vFpLLp_t) \
+	GO(__libc_init, vFpppp_t) \
 	GO(epoll_ctl, iFiiip_t) \
 	GO(semctl, iFiiiN_t) \
 	GO(__dprintf_chk, iFiipV_t) \
diff --git a/src/wrapped/wrappedandroidshmem.c b/src/wrapped/wrappedandroidshmem.c
new file mode 100755
index 00000000..106524d9
--- /dev/null
+++ b/src/wrapped/wrappedandroidshmem.c
@@ -0,0 +1,18 @@
+#define _GNU_SOURCE         /* See feature_test_macros(7) */

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <dlfcn.h>

+

+#include "wrappedlibs.h"

+

+#include "wrapper.h"

+#include "bridge.h"

+#include "librarian/library_private.h"

+#include "x86emu.h"

+

+const char* androidshmemName = "libandroid-shmem.so";

+#define LIBNAME androidshmem

+

+#include "wrappedlib_init.h"

+

diff --git a/src/wrapped/wrappedandroidshmem_private.h b/src/wrapped/wrappedandroidshmem_private.h
new file mode 100755
index 00000000..84f29a81
--- /dev/null
+++ b/src/wrapped/wrappedandroidshmem_private.h
@@ -0,0 +1,8 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))

+#error Meh....

+#endif

+

+GO(shmctl, iFiip)

+GO(shmget, iFiLi)

+GO(shmat, pFipi)

+GO(shmdt, iFp)

diff --git a/src/wrapped/wrappedfreetype.c b/src/wrapped/wrappedfreetype.c
index 4ced9be3..86706b45 100644
--- a/src/wrapped/wrappedfreetype.c
+++ b/src/wrapped/wrappedfreetype.c
@@ -18,7 +18,13 @@
 #include "emu/x64emu_private.h"
 #include "myalign.h"
 
-const char* freetypeName = "libfreetype.so.6";
+const char* freetypeName = 
+#ifdef ANDROID
+	"libfreetype.so"
+#else
+    "libfreetype.so.6"
+#endif
+    ;
 #define LIBNAME freetype
 
 typedef void  (*vFp_t)(void*);
diff --git a/src/wrapped/wrappedgnutls.c b/src/wrapped/wrappedgnutls.c
index dd4cde20..1edf28de 100644
--- a/src/wrapped/wrappedgnutls.c
+++ b/src/wrapped/wrappedgnutls.c
@@ -18,7 +18,13 @@
 #include "emu/x64emu_private.h"
 #include "callback.h"
 
-const char* gnutlsName = "libgnutls.so.30";
+const char* gnutlsName = 
+#if ANDROID
+    "libgnutls.so"
+#else
+    "libgnutls.so.30"
+#endif
+    ;
 #define LIBNAME gnutls
 
 #include "generated/wrappedgnutlstypes.h"
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index b0241375..156eab8f 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -65,7 +65,13 @@
 #include "rcfile.h"
 
 #define LIBNAME libc
-const char* libcName = "libc.so.6";
+const char* libcName = 
+#ifdef ANDROID
+    "libc.so"
+#else
+    "libc.so.6"
+#endif
+    ;
 
 typedef int (*iFi_t)(int);
 typedef int (*iFp_t)(void*);
@@ -1271,6 +1277,50 @@ EXPORT int my_statfs64(const char* path, void* buf)
 }
 #endif
 
+#ifdef ANDROID
+typedef int (*__compar_d_fn_t)(const void*, const void*, void*);
+
+static size_t qsort_r_partition(void* base, size_t size, __compar_d_fn_t compar, void* arg, size_t lo, size_t hi)
+{
+    void* tmp = alloca(size);
+    void* pivot = ((char*)base) + lo * size;
+    size_t i = lo;
+    for (size_t j = lo; j <= hi; j++)
+    {
+        void* base_i = ((char*)base) + i * size;
+        void* base_j = ((char*)base) + j * size;
+        if (compar(base_j, pivot, arg) < 0)
+        {
+            memcpy(tmp, base_i, size);
+            memcpy(base_i, base_j, size);
+            memcpy(base_j, tmp, size);
+            i++;
+        }
+    }
+    void* base_i = ((char *)base) + i * size;
+    void* base_hi = ((char *)base) + hi * size;
+    memcpy(tmp, base_i, size);
+    memcpy(base_i, base_hi, size);
+    memcpy(base_hi, tmp, size);
+    return i;
+}
+
+static void qsort_r_helper(void* base, size_t size, __compar_d_fn_t compar, void* arg, ssize_t lo, ssize_t hi)
+{
+    if (lo < hi)
+    {
+        size_t p = qsort_r_partition(base, size, compar, arg, lo, hi);
+        qsort_r_helper(base, size, compar, arg, lo, p - 1);
+        qsort_r_helper(base, size, compar, arg, p + 1, hi);
+    }
+}
+
+static void qsort_r(void* base, size_t nmemb, size_t size, __compar_d_fn_t compar, void* arg)
+{
+    return qsort_r_helper(base, size, compar, arg, 0, nmemb - 1);
+}
+#endif
+
 typedef struct compare_r_s {
     x64emu_t* emu;
     uintptr_t f;
@@ -1601,6 +1651,15 @@ void CreateCPUInfoFile(int fd)
     #undef P
 }
 
+#ifdef ANDROID
+static int shm_open(const char *name, int oflag, mode_t mode) {
+    return -1;
+}
+static int shm_unlink(const char *name) {
+    return -1;
+}
+#endif
+
 #define TMP_CPUINFO "box64_tmpcpuinfo"
 #define TMP_CPUTOPO "box64_tmpcputopo%d"
 #endif
@@ -1843,12 +1902,14 @@ EXPORT int32_t my_epoll_pwait(x64emu_t* emu, int32_t epfd, void* events, int32_t
 }
 #endif
 
+#ifndef ANDROID
 EXPORT int32_t my_glob64(x64emu_t *emu, void* pat, int32_t flags, void* errfnc, void* pglob)
 {
     (void)emu;
     return glob64(pat, flags, findgloberrFct(errfnc), pglob);
 }
 EXPORT int32_t my_glob(x64emu_t *emu, void* pat, int32_t flags, void* errfnc, void* pglob) __attribute__((alias("my_glob64")));
+#endif
 
 EXPORT int my_scandir64(x64emu_t *emu, void* dir, void* namelist, void* sel, void* comp)
 {
@@ -2439,6 +2500,11 @@ void InitCpuModel()
 }
 #endif
 
+#ifdef ANDROID
+void ctSetup()
+{
+}
+#else
 EXPORT const unsigned short int *my___ctype_b;
 EXPORT const int32_t *my___ctype_tolower;
 EXPORT const int32_t *my___ctype_toupper;
@@ -2449,6 +2515,7 @@ void ctSetup()
     my___ctype_toupper = *(__ctype_toupper_loc());
     my___ctype_tolower = *(__ctype_tolower_loc());
 }
+#endif
 
 EXPORT void my___register_frame_info(void* a, void* b)
 {
@@ -2759,6 +2826,7 @@ EXPORT int my_getopt_long_only(int argc, char* const argv[], const char* optstri
     return ret;
 }
 
+#ifndef ANDROID
 typedef struct {
    void  *read;
    void *write;
@@ -2806,6 +2874,7 @@ EXPORT void* my_fopencookie(x64emu_t* emu, void* cookie, void* mode, my_cookie_i
     cb->cookie = cookie;
     return fopencookie(cb, mode, io_funcs);
 }
+#endif
 
 #if 0
 
@@ -2869,8 +2938,13 @@ EXPORT int my_nanosleep(const struct timespec *req, struct timespec *rem)
 }
 #endif
 
+#ifdef ANDROID
+void obstackSetup() {
+}
+#else
 // all obstack function defined in obstack.c file
 void obstackSetup();
+#endif
 
 EXPORT void* my_malloc(unsigned long size)
 {
@@ -2959,6 +3033,7 @@ EXPORT void my_mcount(void* frompc, void* selfpc)
 }
 #endif
 
+#ifndef ANDROID
 union semun {
   int              val;    /* Value for SETVAL */
   struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
@@ -2966,6 +3041,7 @@ union semun {
   struct seminfo  *__buf;  /* Buffer for IPC_INFO
                               (Linux-specific) */
 };
+#endif
 #ifndef SEM_STAT_ANY
 #define SEM_STAT_ANY 20
 #endif
@@ -3002,6 +3078,7 @@ EXPORT int my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, void* da
 
 // Backtrace stuff
 
+#ifndef ANDROID
 #include "elfs/elfdwarf_private.h"
 EXPORT int my_backtrace(x64emu_t* emu, void** buffer, int size)
 {
@@ -3127,6 +3204,7 @@ EXPORT void my_backtrace_symbols_fd(x64emu_t* emu, uintptr_t* buffer, int size,
         (void)dummy;
     }
 }
+#endif
 
 EXPORT int my_iopl(x64emu_t* emu, int level)
 {
@@ -3320,6 +3398,27 @@ EXPORT char my___libc_single_threaded = 0;
         lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);    \
     else
 
+#ifdef ANDROID
+#define NEEDED_LIBS   0
+#define NEEDED_LIBS_234 3,  \
+    "libpthread.so.0",      \
+    "libdl.so.2" ,          \
+    "libm.so"
+#else
+#define NEEDED_LIBS   4,\
+    "ld-linux-x86-64.so.2", \
+    "libpthread.so.0",      \
+    "libutil.so.1",         \
+    "librt.so.1"
+#define NEEDED_LIBS_234 6,  \
+    "ld-linux-x86-64.so.2", \
+    "libpthread.so.0",      \
+    "libdl.so.2",           \
+    "libutil.so.1",         \
+    "libresolv.so.2",       \
+    "librt.so.1"
+#endif
+
 #define CUSTOM_INIT         \
     box64->libclib = lib;   \
     /*InitCpuModel();*/         \
@@ -3331,19 +3430,9 @@ EXPORT char my___libc_single_threaded = 0;
         strrchr(box64->argv[0], '/') + 1;                                       \
     getMy(lib);                                                                 \
     if(box64_isglibc234)                                                        \
-        setNeededLibs(lib, 6,                                                   \
-            "ld-linux-x86-64.so.2",                                             \
-            "libpthread.so.0",                                                  \
-            "libdl.so.2",                                                       \
-            "libutil.so.1",                                                     \
-            "libresolv.so.2",                                                   \
-            "librt.so.1");                                                      \
+        setNeededLibs(lib, NEEDED_LIBS_234);                                    \
     else                                                                        \
-        setNeededLibs(lib, 4,                                                   \
-            "ld-linux-x86-64.so.2",                                             \
-            "libpthread.so.0",                                                  \
-            "libutil.so.1",                                                     \
-            "librt.so.1");
+        setNeededLibs(lib, NEEDED_LIBS);
 
 #define CUSTOM_FINI \
     freeMy();
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index 933178e5..efd5705b 100644
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -2326,3 +2326,16 @@ DATAM(__libc_single_threaded, 1)
 
 GO(iconvctl, iFlip)
 GO(dummy__ZnwmSt11align_val_tRKSt9nothrow_t, pFLLp) // for mallochook.c
+
+#ifdef ANDROID
+GOM(__libc_init, vFEpppp)
+GO(__errno, pFv)
+GO(setprogname, vFp)
+GO(getprogname, pFv)
+#else
+// Those symbols don't exist in non-Android builds
+//GOM(__libc_init,
+//GO(__errno,
+//GO(setprogname,
+//GO(getprogname,
+#endif
diff --git a/src/wrapped/wrappedlibcups.c b/src/wrapped/wrappedlibcups.c
index 16ea4725..dc846868 100644
--- a/src/wrapped/wrappedlibcups.c
+++ b/src/wrapped/wrappedlibcups.c
@@ -18,7 +18,14 @@
 #include "emu/x64emu_private.h"
 #include "myalign.h"
 
-const char* libcupsName = "libcups.so.2";
+const char* libcupsName = 
+#ifdef ANDROID
+    "libcups.so"
+#else
+    "libcups.so.2"
+#endif
+    ;
+
 #define LIBNAME libcups
 
 #define ADDED_FUNCTIONS()                   \
diff --git a/src/wrapped/wrappedlibm.c b/src/wrapped/wrappedlibm.c
index 43bdf5cc..0e4f4cf9 100644
--- a/src/wrapped/wrappedlibm.c
+++ b/src/wrapped/wrappedlibm.c
@@ -14,7 +14,14 @@
 #include "x64emu.h"
 #include "debug.h"
 
-const char* libmName = "libm.so.6";
+const char* libmName = 
+#ifdef ANDROID
+    "libm.so"
+#else
+    "libm.so.6"
+#endif
+    ;
+
 #define LIBNAME libm
 
 static library_t* my_lib = NULL;
diff --git a/src/wrapped/wrappedmpg123.c b/src/wrapped/wrappedmpg123.c
index 5b95749e..dc538abf 100644
--- a/src/wrapped/wrappedmpg123.c
+++ b/src/wrapped/wrappedmpg123.c
@@ -17,7 +17,13 @@
 #include "box64context.h"
 #include "emu/x64emu_private.h"
 
-const char* mpg123Name = "libmpg123.so.0";
+const char* mpg123Name = 
+#ifdef ANDROID
+    "libmpg123.so"
+#else
+    "libmpg123.so.0"
+#endif
+    ;
 #define LIBNAME mpg123
 
 #define ADDED_FUNCTIONS()           \