summaryrefslogtreecommitdiffhomepage
path: root/crt/nt32/crtldso.c
diff options
context:
space:
mode:
Diffstat (limited to 'crt/nt32/crtldso.c')
-rw-r--r--crt/nt32/crtldso.c54
1 files changed, 54 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);
+}