/* gdb calls dlsym on td_thr_get_info. We need to wrap td_thr_get_info for tid virtualization. It should be safe to comment this out if you don't need to checkpoint gdb. */ extern "C" void *dlsym ( void *handle, const char *symbol) { if ( strcmp ( symbol, "td_thr_get_info" ) == 0 ) { _td_thr_get_info_funcptr = (td_thr_get_info_funcptr_t) _real_dlsym(handle, symbol); if (_td_thr_get_info_funcptr != NULL) { return (void *) &_dmtcp_td_thr_get_info; } else { return NULL; } } else return _real_dlsym ( handle, symbol ); }
// Note that mtcp.so is closed and re-opened (maybe in a different // location) at the time of fork. Do not statically save the // return value of get_mtcp_symbol across a fork. LIB_PRIVATE void* get_mtcp_symbol ( const char* name ) { static void* theMtcpHandle = find_and_open_mtcp_so(); if ( name == REOPEN_MTCP ) { JTRACE ( "reopening libmtcp.so" ) ( theMtcpHandle ); //must get ref count down to 0 so it is really unloaded for( int i=0; i<MAX_DLCLOSE_MTCP_CALLS; ++i) { if(dlclose(theMtcpHandle) != 0) { //failed call means it is unloaded JTRACE("dlclose(libmtcp.so) worked"); break; } else { JTRACE("dlclose(libmtcp.so) decremented refcount"); } } theMtcpHandle = find_and_open_mtcp_so(); JTRACE ( "reopening libmtcp.so DONE" ) ( theMtcpHandle ); return 0; } void* tmp = _real_dlsym ( theMtcpHandle, name ); JASSERT ( tmp != NULL ) ( name ) .Text ( "failed to find libmtcp.so symbol for 'name'\n" "Maybe try re-compiling MTCP: (cd mtcp; make clean); make" ); //JTRACE("looking up libmtcp.so symbol")(name); return tmp; }
LIB_PRIVATE void fred_get_libc_func_addr() { _real_func_addr[empty_event] = _real_dlsym(RTLD_NEXT, "empty"); _real_func_addr[accept_event] = _real_dlsym(RTLD_NEXT, "accept"); _real_func_addr[accept4_event] = _real_dlsym(RTLD_NEXT, "accept4"); _real_func_addr[access_event] = _real_dlsym(RTLD_NEXT, "access"); _real_func_addr[bind_event] = _real_dlsym(RTLD_NEXT, "bind"); _real_func_addr[calloc_event] = _real_dlsym(RTLD_NEXT, "calloc"); _real_func_addr[chmod_event] = _real_dlsym(RTLD_NEXT, "chmod"); _real_func_addr[chown_event] = _real_dlsym(RTLD_NEXT, "chown"); _real_func_addr[close_event] = _real_dlsym(RTLD_NEXT, "close"); _real_func_addr[connect_event] = _real_dlsym(RTLD_NEXT, "connect"); _real_func_addr[dup_event] = _real_dlsym(RTLD_NEXT, "dup"); _real_func_addr[dup2_event] = _real_dlsym(RTLD_NEXT, "dup2"); _real_func_addr[dup3_event] = _real_dlsym(RTLD_NEXT, "dup3"); _real_func_addr[fcntl_event] = _real_dlsym(RTLD_NEXT, "fcntl"); _real_func_addr[fchdir_event] = _real_dlsym(RTLD_NEXT, "fchdir"); _real_func_addr[fdatasync_event] = _real_dlsym(RTLD_NEXT, "fdatasync"); _real_func_addr[getcwd_event] = _real_dlsym(RTLD_NEXT, "getcwd"); _real_func_addr[gettimeofday_event] = _real_dlsym(RTLD_NEXT, "gettimeofday"); _real_func_addr[getpeername_event] = _real_dlsym(RTLD_NEXT, "getpeername"); _real_func_addr[getsockname_event] = _real_dlsym(RTLD_NEXT, "getsockname"); _real_func_addr[link_event] = _real_dlsym(RTLD_NEXT, "link"); _real_func_addr[symlink_event] = _real_dlsym(RTLD_NEXT, "symlink"); _real_func_addr[listen_event] = _real_dlsym(RTLD_NEXT, "listen"); _real_func_addr[localtime_r_event] = _real_dlsym(RTLD_NEXT, "localtime_r"); _real_func_addr[utime_event] = _real_dlsym(RTLD_NEXT, "utime"); _real_func_addr[utimes_event] = _real_dlsym(RTLD_NEXT, "utimes"); _real_func_addr[lutimes_event] = _real_dlsym(RTLD_NEXT, "lutimes"); _real_func_addr[futimes_event] = _real_dlsym(RTLD_NEXT, "futimes"); _real_func_addr[clock_getres_event] = _real_dlsym(RTLD_NEXT, "clock_getres"); _real_func_addr[clock_gettime_event] = _real_dlsym(RTLD_NEXT, "clock_gettime"); _real_func_addr[clock_settime_event] = _real_dlsym(RTLD_NEXT, "clock_settime"); _real_func_addr[lseek_event] = _real_dlsym(RTLD_NEXT, "lseek"); _real_func_addr[lseek64_event] = _real_dlsym(RTLD_NEXT, "lseek64"); _real_func_addr[llseek_event] = _real_dlsym(RTLD_NEXT, "llseek"); _real_func_addr[malloc_event] = _real_dlsym(RTLD_NEXT, "malloc"); _real_func_addr[free_event] = _real_dlsym(RTLD_NEXT, "free"); _real_func_addr[mkdir_event] = _real_dlsym(RTLD_NEXT, "mkdir"); _real_func_addr[mkstemp_event] = _real_dlsym(RTLD_NEXT, "mkstemp"); _real_func_addr[mmap_event] = _real_dlsym(RTLD_NEXT, "mmap"); _real_func_addr[mmap64_event] = _real_dlsym(RTLD_NEXT, "mmap64"); _real_func_addr[munmap_event] = _real_dlsym(RTLD_NEXT, "munmap"); _real_func_addr[mremap_event] = _real_dlsym(RTLD_NEXT, "mremap"); _real_func_addr[open_event] = _real_dlsym(RTLD_NEXT, "open"); _real_func_addr[open64_event] = _real_dlsym(RTLD_NEXT, "open64"); _real_func_addr[openat_event] = _real_dlsym(RTLD_NEXT, "openat"); _real_func_addr[pread_event] = _real_dlsym(RTLD_NEXT, "pread"); _real_func_addr[preadv_event] = _real_dlsym(RTLD_NEXT, "preadv"); _real_func_addr[pwrite_event] = _real_dlsym(RTLD_NEXT, "pwrite"); _real_func_addr[pwritev_event] = _real_dlsym(RTLD_NEXT, "pwritev"); _real_func_addr[pthread_rwlock_unlock_event] = _real_dlsym(RTLD_NEXT, "pthread_rwlock_unlock"); _real_func_addr[pthread_rwlock_rdlock_event] = _real_dlsym(RTLD_NEXT, "pthread_rwlock_rdlock"); _real_func_addr[pthread_rwlock_wrlock_event] = _real_dlsym(RTLD_NEXT, "pthread_rwlock_wrlock"); _real_func_addr[pthread_create_event] = _real_dlsym(RTLD_NEXT, "pthread_create"); _real_func_addr[pthread_detach_event] = _real_dlsym(RTLD_NEXT, "pthread_detach"); _real_func_addr[pthread_exit_event] = _real_dlsym(RTLD_NEXT, "pthread_exit"); _real_func_addr[pthread_join_event] = _real_dlsym(RTLD_NEXT, "pthread_join"); _real_func_addr[pthread_kill_event] = _real_dlsym(RTLD_NEXT, "pthread_kill"); _real_func_addr[pthread_mutex_lock_event] = _real_dlsym(RTLD_NEXT, "pthread_mutex_lock"); _real_func_addr[pthread_mutex_trylock_event] = _real_dlsym(RTLD_NEXT, "pthread_mutex_trylock"); _real_func_addr[pthread_mutex_unlock_event] = _real_dlsym(RTLD_NEXT, "pthread_mutex_unlock"); _real_func_addr[rand_event] = _real_dlsym(RTLD_NEXT, "rand"); _real_func_addr[fork_event] = _real_dlsym(RTLD_NEXT, "fork"); _real_func_addr[read_event] = _real_dlsym(RTLD_NEXT, "read"); _real_func_addr[readv_event] = _real_dlsym(RTLD_NEXT, "readv"); _real_func_addr[readlink_event] = _real_dlsym(RTLD_NEXT, "readlink"); _real_func_addr[realpath_event] = _real_dlsym(RTLD_NEXT, "realpath"); _real_func_addr[realloc_event] = _real_dlsym(RTLD_NEXT, "realloc"); _real_func_addr[rename_event] = _real_dlsym(RTLD_NEXT, "rename"); _real_func_addr[rmdir_event] = _real_dlsym(RTLD_NEXT, "rmdir"); _real_func_addr[select_event] = _real_dlsym(RTLD_NEXT, "select"); _real_func_addr[ppoll_event] = _real_dlsym(RTLD_NEXT, "ppoll"); _real_func_addr[setsockopt_event] = _real_dlsym(RTLD_NEXT, "setsockopt"); _real_func_addr[getsockopt_event] = _real_dlsym(RTLD_NEXT, "getsockopt"); _real_func_addr[ioctl_event] = _real_dlsym(RTLD_NEXT, "ioctl"); _real_func_addr[shutdown_event] = _real_dlsym(RTLD_NEXT, "shutdown"); _real_func_addr[sigwait_event] = _real_dlsym(RTLD_NEXT, "sigwait"); _real_func_addr[srand_event] = _real_dlsym(RTLD_NEXT, "srand"); _real_func_addr[socket_event] = _real_dlsym(RTLD_NEXT, "socket"); _real_func_addr[socketpair_event] = _real_dlsym(RTLD_NEXT, "socketpair"); _real_func_addr[time_event] = _real_dlsym(RTLD_NEXT, "time"); _real_func_addr[truncate_event] = _real_dlsym(RTLD_NEXT, "truncate"); _real_func_addr[ftruncate_event] = _real_dlsym(RTLD_NEXT, "ftruncate"); _real_func_addr[truncate64_event] = _real_dlsym(RTLD_NEXT, "truncate64"); _real_func_addr[ftruncate64_event] = _real_dlsym(RTLD_NEXT, "ftruncate64"); _real_func_addr[unlink_event] = _real_dlsym(RTLD_NEXT, "unlink"); _real_func_addr[write_event] = _real_dlsym(RTLD_NEXT, "write"); _real_func_addr[writev_event] = _real_dlsym(RTLD_NEXT, "writev"); _real_func_addr[epoll_create_event] = _real_dlsym(RTLD_NEXT, "epoll_create"); _real_func_addr[epoll_create1_event] = _real_dlsym(RTLD_NEXT, "epoll_create1"); _real_func_addr[epoll_ctl_event] = _real_dlsym(RTLD_NEXT, "epoll_ctl"); _real_func_addr[epoll_wait_event] = _real_dlsym(RTLD_NEXT, "epoll_wait"); _real_func_addr[getpwnam_r_event] = _real_dlsym(RTLD_NEXT, "getpwnam_r"); _real_func_addr[getpwuid_r_event] = _real_dlsym(RTLD_NEXT, "getpwuid_r"); _real_func_addr[getgrnam_r_event] = _real_dlsym(RTLD_NEXT, "getgrnam_r"); _real_func_addr[getgrgid_r_event] = _real_dlsym(RTLD_NEXT, "getgrgid_r"); _real_func_addr[getaddrinfo_event] = _real_dlsym(RTLD_NEXT, "getaddrinfo"); _real_func_addr[freeaddrinfo_event] = _real_dlsym(RTLD_NEXT, "freeaddrinfo"); _real_func_addr[getnameinfo_event] = _real_dlsym(RTLD_NEXT, "getnameinfo"); _real_func_addr[sendto_event] = _real_dlsym(RTLD_NEXT, "sendto"); _real_func_addr[sendmsg_event] = _real_dlsym(RTLD_NEXT, "sendmsg"); _real_func_addr[recvfrom_event] = _real_dlsym(RTLD_NEXT, "recvfrom"); _real_func_addr[recvmsg_event] = _real_dlsym(RTLD_NEXT, "recvmsg"); _real_func_addr[waitid_event] = _real_dlsym(RTLD_NEXT, "waitid"); _real_func_addr[wait4_event] = _real_dlsym(RTLD_NEXT, "wait4"); _real_func_addr[sigaction_event] = _real_dlsym(RTLD_NEXT, "sigaction"); _real_func_addr[signal_event] = _real_dlsym(RTLD_NEXT, "signal"); _real_func_addr[sigset_event] = _real_dlsym(RTLD_NEXT, "sigset"); _real_func_addr[fopen_event] = _real_dlsym(RTLD_NEXT, "fopen"); _real_func_addr[fopen64_event] = _real_dlsym(RTLD_NEXT, "fopen64"); _real_func_addr[freopen_event] = _real_dlsym(RTLD_NEXT, "freopen"); _real_func_addr[fclose_event] = _real_dlsym(RTLD_NEXT, "fclose"); _real_func_addr[fdopen_event] = _real_dlsym(RTLD_NEXT, "fdopen"); _real_func_addr[fgets_event] = _real_dlsym(RTLD_NEXT, "fgets"); _real_func_addr[ferror_event] = _real_dlsym(RTLD_NEXT, "ferror"); _real_func_addr[feof_event] = _real_dlsym(RTLD_NEXT, "feof"); _real_func_addr[fileno_event] = _real_dlsym(RTLD_NEXT, "fileno"); _real_func_addr[fflush_event] = _real_dlsym(RTLD_NEXT, "fflush"); _real_func_addr[setvbuf_event] = _real_dlsym(RTLD_NEXT, "setvbuf"); _real_func_addr[fseek_event] = _real_dlsym(RTLD_NEXT, "fseek"); _real_func_addr[fputs_event] = _real_dlsym(RTLD_NEXT, "fputs"); _real_func_addr[puts_event] = _real_dlsym(RTLD_NEXT, "puts"); _real_func_addr[fputc_event] = _real_dlsym(RTLD_NEXT, "fputc"); _real_func_addr[fsync_event] = _real_dlsym(RTLD_NEXT, "fsync"); _real_func_addr[ftell_event] = _real_dlsym(RTLD_NEXT, "ftell"); _real_func_addr[fgetpos_event] = _real_dlsym(RTLD_NEXT, "fgetpos"); _real_func_addr[fgetpos64_event] = _real_dlsym(RTLD_NEXT, "fgetpos64"); _real_func_addr[fsetpos_event] = _real_dlsym(RTLD_NEXT, "fsetpos"); _real_func_addr[fsetpos64_event] = _real_dlsym(RTLD_NEXT, "fsetpos64"); _real_func_addr[fwrite_event] = _real_dlsym(RTLD_NEXT, "fwrite"); _real_func_addr[fread_event] = _real_dlsym(RTLD_NEXT, "fread"); _real_func_addr[getc_event] = _real_dlsym(RTLD_NEXT, "getc"); _real_func_addr[fgetc_event] = _real_dlsym(RTLD_NEXT, "fgetc"); _real_func_addr[ungetc_event] = _real_dlsym(RTLD_NEXT, "ungetc"); _real_func_addr[getline_event] = _real_dlsym(RTLD_NEXT, "getline"); _real_func_addr[getdelim_event] = _real_dlsym(RTLD_NEXT, "getdelim"); _real_func_addr[putc_event] = _real_dlsym(RTLD_NEXT, "putc"); _real_func_addr[rewind_event] = _real_dlsym(RTLD_NEXT, "rewind"); _real_func_addr[tmpfile_event] = _real_dlsym(RTLD_NEXT, "tmpfile"); _real_func_addr[flockfile_event] = _real_dlsym(RTLD_NEXT, "flockfile"); _real_func_addr[ftrylockfile_event] = _real_dlsym(RTLD_NEXT, "ftrylockfile"); _real_func_addr[funlockfile_event] = _real_dlsym(RTLD_NEXT, "funlockfile"); _real_func_addr[closedir_event] = _real_dlsym(RTLD_NEXT, "closedir"); _real_func_addr[opendir_event] = _real_dlsym(RTLD_NEXT, "opendir"); _real_func_addr[fdopendir_event] = _real_dlsym(RTLD_NEXT, "fdopendir"); _real_func_addr[readdir_event] = _real_dlsym(RTLD_NEXT, "readdir"); _real_func_addr[readdir_r_event] = _real_dlsym(RTLD_NEXT, "readdir_r"); _real_func_addr[pthread_cond_broadcast_event] = dlvsym(RTLD_NEXT, "pthread_cond_broadcast", "GLIBC_2.3.2"); _real_func_addr[pthread_cond_signal_event] = dlvsym(RTLD_NEXT, "pthread_cond_signal", "GLIBC_2.3.2"); _real_func_addr[pthread_cond_wait_event] = dlvsym(RTLD_NEXT, "pthread_cond_wait", "GLIBC_2.3.2"); _real_func_addr[pthread_cond_timedwait_event] = dlvsym(RTLD_NEXT, "pthread_cond_timedwait", "GLIBC_2.3.2"); _real_func_addr[pthread_cond_destroy_event] = dlvsym(RTLD_NEXT, "pthread_cond_destroy", "GLIBC_2.3.2"); _real_func_addr[fxstat_event] = _real_dlsym(RTLD_NEXT, "__fxstat"); _real_func_addr[fxstat64_event] = _real_dlsym(RTLD_NEXT, "__fxstat64"); _real_func_addr[lxstat_event] = _real_dlsym(RTLD_NEXT, "__lxstat"); _real_func_addr[lxstat64_event] = _real_dlsym(RTLD_NEXT, "__lxstat64"); _real_func_addr[xstat_event] = _real_dlsym(RTLD_NEXT, "__xstat"); _real_func_addr[xstat64_event] = _real_dlsym(RTLD_NEXT, "__xstat64"); _real_func_addr[libc_memalign_event] = _real_dlsym(RTLD_NEXT, "__libc_memalign"); _real_func_addr[vfprintf_event] = _real_dlsym(RTLD_NEXT, "vfprintf"); _real_func_addr[vfscanf_event] = _real_dlsym(RTLD_NEXT, "vfscanf"); _real_func_addr[exec_barrier_event] = _real_dlsym(RTLD_NEXT, "exec_barrier"); _real_func_addr[signal_handler_event] = _real_dlsym(RTLD_NEXT, "signal_handler"); _real_func_addr[user_event] = _real_dlsym(RTLD_NEXT, "user"); _real_func_addr[syscall_event] = _real_dlsym(RTLD_NEXT, "syscall"); }