1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
#define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <stdarg.h>
void error(const char *file, int line,const char *str, ...) { va_list fmt; va_start(fmt, str); fprintf(stderr, "error:%s %s:%d\n", strerror(errno), file, line); vfprintf(stderr, str, fmt); fprintf(stderr, "\n"); va_end(fmt); }
#define ERROR(...) do { error(__FILE__, __LINE__, __VA_ARGS__); exit(1); } while(0) #define FAIL(...) do { error(__FILE__, __LINE__, __VA_ARGS__); return -1; } while(0)
int main(int argc, char **argv) { if(argc < 1) { ERROR("Usage: %s shared-object", argv[0]); } void *libhandler = dlopen(argv[1], RTLD_NOW); if(libhandler == NULL) { ERROR(dlerror()); } void *libhandler1 = dlopen(argv[1], RTLD_NOW); if(libhandler1 == NULL) { ERROR(dlerror()); } int (*f)(int, int) = dlsym(libhandler, "foo"); if(f == NULL) { ERROR(dlerror()); } int (*f1)(int, int) = dlsym(libhandler1, "bar"); if(f1 == NULL) { ERROR(dlerror()); } Dl_info info; memset(&info, 0, sizeof(Dl_info)); if(dladdr(f, &info) == 0) { ERROR(dlerror()); } printf("addr=%p\n\tfname=%s\n\tfbase=%p\n\tsname=%s\n\tsaddr=%p\n", f, info.dli_fname, info.dli_fbase, info.dli_sname, info.dli_saddr); memset(&info, 0, sizeof(Dl_info)); if(dladdr(f1, &info) == 0) { ERROR(dlerror()); } printf("addr=%p\n\tfname=%s\n\tfbase=%p\n\tsname=%s\n\tsaddr=%p\n", f1, info.dli_fname, info.dli_fbase, info.dli_sname, info.dli_saddr); printf("%d, %d\n", f(1,2), f1(2,3)); printf("dlclose libhandler\n"); dlclose(libhandler); printf("dlclose libhandler1\n"); dlclose(libhandler1); }
|