void _thr_rtld_init(void) { struct RtldLockInfo li; li.lock_create = _thr_rtld_lock_create; li.lock_destroy = _thr_rtld_lock_destroy; li.rlock_acquire = _thr_rtld_rlock_acquire; li.wlock_acquire = _thr_rtld_wlock_acquire; li.lock_release = _thr_rtld_lock_release; li.thread_set_flag = _thr_rtld_set_flag; li.thread_clr_flag = _thr_rtld_clr_flag; li.at_fork = NULL; _rtld_thread_init(&li); }
void lockdflt_init() { int i; deflockinfo.rtli_version = RTLI_VERSION; deflockinfo.lock_create = def_lock_create; deflockinfo.lock_destroy = def_lock_destroy; deflockinfo.rlock_acquire = def_rlock_acquire; deflockinfo.wlock_acquire = def_wlock_acquire; deflockinfo.lock_release = def_lock_release; deflockinfo.thread_set_flag = def_thread_set_flag; deflockinfo.thread_clr_flag = def_thread_clr_flag; deflockinfo.at_fork = NULL; for (i = 0; i < RTLD_LOCK_CNT; i++) { rtld_locks[i].mask = (1 << i); rtld_locks[i].handle = NULL; } memcpy(&lockinfo, &deflockinfo, sizeof(lockinfo)); _rtld_thread_init(NULL); /* * Construct a mask to block all signals except traps which might * conceivably be generated within the dynamic linker itself. */ sigfillset(&fullsigmask); sigdelset(&fullsigmask, SIGILL); sigdelset(&fullsigmask, SIGTRAP); sigdelset(&fullsigmask, SIGABRT); sigdelset(&fullsigmask, SIGEMT); sigdelset(&fullsigmask, SIGFPE); sigdelset(&fullsigmask, SIGBUS); sigdelset(&fullsigmask, SIGSEGV); sigdelset(&fullsigmask, SIGSYS); }
void _thr_rtld_fini(void) { _rtld_thread_init(NULL); }