diff options
author | midipix <writeonce@midipix.org> | 2017-10-19 03:28:13 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2017-10-19 18:27:30 -0400 |
commit | 234f06285076f6a57bfa7f9c1edb40be25dbe681 (patch) | |
tree | 2fd099c72e6ed09e8d55b38a6f4f0d1a1b9df1d0 /crt | |
parent | 8b88c69b142375c9c7f75c8b2339441ff5401821 (diff) | |
download | mmglue-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.c | 54 | ||||
-rw-r--r-- | crt/nt32/crtvrfs.c | 52 | ||||
-rw-r--r-- | crt/nt64/crtldso.c | 54 | ||||
-rw-r--r-- | crt/nt64/crtvrfs.c | 52 |
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); +} |