From 234f06285076f6a57bfa7f9c1edb40be25dbe681 Mon Sep 17 00:00:00 2001 From: midipix Date: Thu, 19 Oct 2017 03:28:13 +0000 Subject: _start(): implemented __libc_loader_init() for the ldso and vrfs flavors. --- crt/nt32/crtldso.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ crt/nt32/crtvrfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ crt/nt64/crtldso.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ crt/nt64/crtvrfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 212 insertions(+) (limited to 'crt') 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); +} -- cgit v1.2.3