summaryrefslogtreecommitdiffhomepage
path: root/crt
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2017-10-19 03:28:13 +0000
committermidipix <writeonce@midipix.org>2017-10-19 18:27:30 -0400
commit234f06285076f6a57bfa7f9c1edb40be25dbe681 (patch)
tree2fd099c72e6ed09e8d55b38a6f4f0d1a1b9df1d0 /crt
parent8b88c69b142375c9c7f75c8b2339441ff5401821 (diff)
downloadmmglue-234f06285076f6a57bfa7f9c1edb40be25dbe681.tar.bz2
mmglue-234f06285076f6a57bfa7f9c1edb40be25dbe681.tar.xz
_start(): implemented __libc_loader_init() for the ldso and vrfs flavors.
Diffstat (limited to 'crt')
-rw-r--r--crt/nt32/crtldso.c54
-rw-r--r--crt/nt32/crtvrfs.c52
-rw-r--r--crt/nt64/crtldso.c54
-rw-r--r--crt/nt64/crtvrfs.c52
4 files changed, 212 insertions, 0 deletions
diff --git a/crt/nt32/crtldso.c b/crt/nt32/crtldso.c
index c3130b8..bdc376e 100644
--- a/crt/nt32/crtldso.c
+++ b/crt/nt32/crtldso.c
@@ -1,3 +1,57 @@
#include "psxglue.h"
+#include "peldso.h"
const int __crtopt_ldso = __PSXOPT_LDSO;
+
+/* framework (rtdata) abi */
+static const struct __guid __ldsoabi = NT_PROCESS_GUID_RTDATA;
+
+/* loader root-relative name */
+static const unsigned short __rrldso[] = {'l','i','b','\\',
+ 'l','i','b','p','s','x','s','c','l',
+ '.','s','o',0};
+
+/* loader root-relative name */
+static const unsigned short __rrlibc[] = {'l','i','b','\\',
+ 'l','i','b','c',
+ '.','s','o',0};
+
+
+static unsigned long __attribute__((section(".dsodata")))
+ __dsodata[65536/sizeof(unsigned long)];
+
+void __libc_loader_init(void * __main, int flags)
+{
+ int status;
+ void * hroot;
+ void * hdsodir;
+ void * ldsobase;
+ void * libcbase;
+ int (*__psx_init)(int *,char ***,char ***,void *);
+ void (*__libc_entry_routine)(void *,void *,int);
+
+ if ((status = __ldso_load_framework_loader_ex(
+ &ldsobase,&hroot,&hdsodir,
+ &__ldsoabi,
+ 0,__rrldso,__main,
+ __dsodata,sizeof(__dsodata),
+ PE_LDSO_DEFAULT_EXECUTABLE,
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if ((status = __ldso_load_framework_library(
+ &libcbase,hroot,__rrlibc,
+ __dsodata,sizeof(__dsodata),
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if (!(__psx_init = __ldso_get_procedure_address(
+ ldsobase,"__psx_init")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ if (!(__libc_entry_routine = __ldso_get_procedure_address(
+ libcbase,"__libc_entry_routine")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ __libc_entry_routine(__main,__psx_init,flags);
+}
diff --git a/crt/nt32/crtvrfs.c b/crt/nt32/crtvrfs.c
index d22d444..3608ab8 100644
--- a/crt/nt32/crtvrfs.c
+++ b/crt/nt32/crtvrfs.c
@@ -1,3 +1,55 @@
#include "psxglue.h"
+#include "peldso.h"
const int __crtopt_vrfs = __PSXOPT_VRFS;
+
+/* framework (rtdata) abi */
+static const struct __guid __ldsoabi = NT_PROCESS_GUID_RTDATA;
+
+/* loader root-relative name */
+static const unsigned short __sdldso[] = {'l','i','b','p','s','x','s','c','l',
+ '.','s','o',0};
+
+/* loader root-relative name */
+static const unsigned short __sdlibc[] = {'l','i','b','c',
+ '.','s','o',0};
+
+
+static unsigned long __attribute__((section(".dsodata")))
+ __dsodata[65536/sizeof(unsigned long)];
+
+void __libc_loader_init(void * __main, int flags)
+{
+ int status;
+ void * hroot;
+ void * hdsodir;
+ void * ldsobase;
+ void * libcbase;
+ int (*__psx_init)(int *,char ***,char ***,void *);
+ void (*__libc_entry_routine)(void *,void *,int);
+
+ if ((status = __ldso_load_framework_loader_ex(
+ &ldsobase,&hroot,&hdsodir,
+ &__ldsoabi,
+ __sdldso,0,__main,
+ __dsodata,sizeof(__dsodata),
+ PE_LDSO_STANDALONE_EXECUTABLE,
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if ((status = __ldso_load_framework_library(
+ &libcbase,hdsodir,__sdlibc,
+ __dsodata,sizeof(__dsodata),
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if (!(__psx_init = __ldso_get_procedure_address(
+ ldsobase,"__psx_init")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ if (!(__libc_entry_routine = __ldso_get_procedure_address(
+ libcbase,"__libc_entry_routine")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ __libc_entry_routine(__main,__psx_init,flags);
+}
diff --git a/crt/nt64/crtldso.c b/crt/nt64/crtldso.c
index c3130b8..bdc376e 100644
--- a/crt/nt64/crtldso.c
+++ b/crt/nt64/crtldso.c
@@ -1,3 +1,57 @@
#include "psxglue.h"
+#include "peldso.h"
const int __crtopt_ldso = __PSXOPT_LDSO;
+
+/* framework (rtdata) abi */
+static const struct __guid __ldsoabi = NT_PROCESS_GUID_RTDATA;
+
+/* loader root-relative name */
+static const unsigned short __rrldso[] = {'l','i','b','\\',
+ 'l','i','b','p','s','x','s','c','l',
+ '.','s','o',0};
+
+/* loader root-relative name */
+static const unsigned short __rrlibc[] = {'l','i','b','\\',
+ 'l','i','b','c',
+ '.','s','o',0};
+
+
+static unsigned long __attribute__((section(".dsodata")))
+ __dsodata[65536/sizeof(unsigned long)];
+
+void __libc_loader_init(void * __main, int flags)
+{
+ int status;
+ void * hroot;
+ void * hdsodir;
+ void * ldsobase;
+ void * libcbase;
+ int (*__psx_init)(int *,char ***,char ***,void *);
+ void (*__libc_entry_routine)(void *,void *,int);
+
+ if ((status = __ldso_load_framework_loader_ex(
+ &ldsobase,&hroot,&hdsodir,
+ &__ldsoabi,
+ 0,__rrldso,__main,
+ __dsodata,sizeof(__dsodata),
+ PE_LDSO_DEFAULT_EXECUTABLE,
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if ((status = __ldso_load_framework_library(
+ &libcbase,hroot,__rrlibc,
+ __dsodata,sizeof(__dsodata),
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if (!(__psx_init = __ldso_get_procedure_address(
+ ldsobase,"__psx_init")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ if (!(__libc_entry_routine = __ldso_get_procedure_address(
+ libcbase,"__libc_entry_routine")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ __libc_entry_routine(__main,__psx_init,flags);
+}
diff --git a/crt/nt64/crtvrfs.c b/crt/nt64/crtvrfs.c
index d22d444..3608ab8 100644
--- a/crt/nt64/crtvrfs.c
+++ b/crt/nt64/crtvrfs.c
@@ -1,3 +1,55 @@
#include "psxglue.h"
+#include "peldso.h"
const int __crtopt_vrfs = __PSXOPT_VRFS;
+
+/* framework (rtdata) abi */
+static const struct __guid __ldsoabi = NT_PROCESS_GUID_RTDATA;
+
+/* loader root-relative name */
+static const unsigned short __sdldso[] = {'l','i','b','p','s','x','s','c','l',
+ '.','s','o',0};
+
+/* loader root-relative name */
+static const unsigned short __sdlibc[] = {'l','i','b','c',
+ '.','s','o',0};
+
+
+static unsigned long __attribute__((section(".dsodata")))
+ __dsodata[65536/sizeof(unsigned long)];
+
+void __libc_loader_init(void * __main, int flags)
+{
+ int status;
+ void * hroot;
+ void * hdsodir;
+ void * ldsobase;
+ void * libcbase;
+ int (*__psx_init)(int *,char ***,char ***,void *);
+ void (*__libc_entry_routine)(void *,void *,int);
+
+ if ((status = __ldso_load_framework_loader_ex(
+ &ldsobase,&hroot,&hdsodir,
+ &__ldsoabi,
+ __sdldso,0,__main,
+ __dsodata,sizeof(__dsodata),
+ PE_LDSO_STANDALONE_EXECUTABLE,
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if ((status = __ldso_load_framework_library(
+ &libcbase,hdsodir,__sdlibc,
+ __dsodata,sizeof(__dsodata),
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if (!(__psx_init = __ldso_get_procedure_address(
+ ldsobase,"__psx_init")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ if (!(__libc_entry_routine = __ldso_get_procedure_address(
+ libcbase,"__libc_entry_routine")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ __libc_entry_routine(__main,__psx_init,flags);
+}