#include #include #include #include "dynlink.h" const char *const mapping[][2] = { { "adjtime", "__adjtime64" }, { "adjtimex", "__adjtimex_time64" }, { "aio_suspend", "__aio_suspend_time64" }, { "clock_adjtime", "__clock_adjtime64" }, { "clock_getres", "__clock_getres_time64" }, { "clock_gettime", "__clock_gettime64" }, { "clock_nanosleep", "__clock_nanosleep_time64" }, { "clock_settime", "__clock_settime64" }, { "cnd_timedwait", "__cnd_timedwait_time64" }, { "ctime", "__ctime64" }, { "ctime_r", "__ctime64_r" }, { "difftime", "__difftime64" }, { "dlsym", "__dlsym_time64" }, { "fstat", "__fstat_time64" }, { "fstatat", "__fstatat_time64" }, { "ftime", "__ftime64" }, { "futimens", "__futimens_time64" }, { "futimes", "__futimes_time64" }, { "futimesat", "__futimesat_time64" }, { "getitimer", "__getitimer_time64" }, { "getrusage", "__getrusage_time64" }, { "gettimeofday", "__gettimeofday_time64" }, { "gmtime", "__gmtime64" }, { "gmtime_r", "__gmtime64_r" }, { "localtime", "__localtime64" }, { "localtime_r", "__localtime64_r" }, { "lstat", "__lstat_time64" }, { "lutimes", "__lutimes_time64" }, { "mktime", "__mktime64" }, { "mq_timedreceive", "__mq_timedreceive_time64" }, { "mq_timedsend", "__mq_timedsend_time64" }, { "mtx_timedlock", "__mtx_timedlock_time64" }, { "nanosleep", "__nanosleep_time64" }, { "ppoll", "__ppoll_time64" }, { "pselect", "__pselect_time64" }, { "pthread_cond_timedwait", "__pthread_cond_timedwait_time64" }, { "pthread_mutex_timedlock", "__pthread_mutex_timedlock_time64" }, { "pthread_rwlock_timedrdlock", "__pthread_rwlock_timedrdlock_time64" }, { "pthread_rwlock_timedwrlock", "__pthread_rwlock_timedwrlock_time64" }, { "pthread_timedjoin_np", "__pthread_timedjoin_np_time64" }, { "recvmmsg", "__recvmmsg_time64" }, { "sched_rr_get_interval", "__sched_rr_get_interval_time64" }, { "select", "__select_time64" }, { "sem_timedwait", "__sem_timedwait_time64" }, { "semtimedop", "__semtimedop_time64" }, { "setitimer", "__setitimer_time64" }, { "settimeofday", "__settimeofday_time64" }, { "sigtimedwait", "__sigtimedwait_time64" }, { "stat", "__stat_time64" }, { "stime", "__stime64" }, { "thrd_sleep", "__thrd_sleep_time64" }, { "time", "__time64" }, { "timegm", "__timegm_time64" }, { "timer_gettime", "__timer_gettime64" }, { "timer_settime", "__timer_settime64" }, { "timerfd_gettime", "__timerfd_gettime64" }, { "timerfd_settime", "__timerfd_settime64" }, { "timespec_get", "__timespec_get_time64" }, { "utime", "__utime64" }, { "utimensat", "__utimensat_time64" }, { "utimes", "__utimes_time64" }, { "wait3", "__wait3_time64" }, { "wait4", "__wait4_time64" }, }; static int cmp(const void *a, const void *b) { return strcmp(*(const char *const *)a, *(const char *const *)b); } hidden void *__dlsym_redir_time64(void *restrict p, const char *restrict s, void *restrict ra) { const char *const *map = bsearch(&(const char *const[]){s, 0}, mapping, sizeof mapping/sizeof mapping[0], sizeof mapping[0], cmp); return __dlsym(p, map ? map[1] : s, ra); }