diff options
author | midipix <writeonce@midipix.org> | 2019-06-19 21:04:44 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2019-06-19 21:04:44 +0000 |
commit | 724fbc5ff7174cf2d710d6d839b46794d5150329 (patch) | |
tree | e1fb718d7c963e5a68fcdcb3da757b79c60ae066 /src | |
parent | e9e8eb8f240ace9f334d4dac96dc3ebe68a07989 (diff) | |
download | mmglue-724fbc5ff7174cf2d710d6d839b46794d5150329.tar.bz2 mmglue-724fbc5ff7174cf2d710d6d839b46794d5150329.tar.xz |
midipix targets: ldso: added <sys/ldso.h>, __dldopen(), __dlsopen().
Diffstat (limited to 'src')
-rw-r--r-- | src/ldso/nt32/dynlink.c | 52 | ||||
-rw-r--r-- | src/ldso/nt64/dynlink.c | 52 |
2 files changed, 104 insertions, 0 deletions
diff --git a/src/ldso/nt32/dynlink.c b/src/ldso/nt32/dynlink.c index a585fbb..c0a1f04 100644 --- a/src/ldso/nt32/dynlink.c +++ b/src/ldso/nt32/dynlink.c @@ -106,6 +106,58 @@ void * dlopen(const char * file, int mode) return base; } +void * __dldopen(int fd, int mode) +{ + int status; + void * base; + int cs; + + /* prolog */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + pthread_rwlock_wrlock(&__ldso_lock); + __inhibit_ptc(); + + /* dldopen */ + base = __ldso_vtbl->dldopen(fd,mode,&status); + + /* epilog */ + __release_ptc(); + pthread_rwlock_unlock(&__ldso_lock); + + if (base) + __psx_vtbl->do_global_ctors_fn(); + + pthread_setcancelstate(cs, 0); + + return base; +} + +void * __dlsopen(const char * file, int mode) +{ + int status; + void * base; + int cs; + + /* prolog */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + pthread_rwlock_wrlock(&__ldso_lock); + __inhibit_ptc(); + + /* dlsopen */ + base = __ldso_vtbl->dlsopen(file,mode,&status); + + /* epilog */ + __release_ptc(); + pthread_rwlock_unlock(&__ldso_lock); + + if (base) + __psx_vtbl->do_global_ctors_fn(); + + pthread_setcancelstate(cs, 0); + + return base; +} + int __dladdr(const void * addr, Dl_info * info) { return __ldso_vtbl->dladdr(addr,info); diff --git a/src/ldso/nt64/dynlink.c b/src/ldso/nt64/dynlink.c index a585fbb..c0a1f04 100644 --- a/src/ldso/nt64/dynlink.c +++ b/src/ldso/nt64/dynlink.c @@ -106,6 +106,58 @@ void * dlopen(const char * file, int mode) return base; } +void * __dldopen(int fd, int mode) +{ + int status; + void * base; + int cs; + + /* prolog */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + pthread_rwlock_wrlock(&__ldso_lock); + __inhibit_ptc(); + + /* dldopen */ + base = __ldso_vtbl->dldopen(fd,mode,&status); + + /* epilog */ + __release_ptc(); + pthread_rwlock_unlock(&__ldso_lock); + + if (base) + __psx_vtbl->do_global_ctors_fn(); + + pthread_setcancelstate(cs, 0); + + return base; +} + +void * __dlsopen(const char * file, int mode) +{ + int status; + void * base; + int cs; + + /* prolog */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + pthread_rwlock_wrlock(&__ldso_lock); + __inhibit_ptc(); + + /* dlsopen */ + base = __ldso_vtbl->dlsopen(file,mode,&status); + + /* epilog */ + __release_ptc(); + pthread_rwlock_unlock(&__ldso_lock); + + if (base) + __psx_vtbl->do_global_ctors_fn(); + + pthread_setcancelstate(cs, 0); + + return base; +} + int __dladdr(const void * addr, Dl_info * info) { return __ldso_vtbl->dladdr(addr,info); |