#define _GNU_SOURCE #include #include #include #include #include static void *load_sym(const char *name) { void *addr; const char *msg; (void) dlerror(); addr = dlsym(RTLD_NEXT, name); if ((msg = dlerror())) { fprintf(stderr, "dlsym(%s): %s\n", name, msg); abort(); } fprintf(stderr, "dlsym(%s) = %p\n", name, addr); return addr; } int (*next)(const char *pathname, int flags, mode_t mode) = NULL; int main(int ac, const char **av) { int fd; if (ac != 2) return 1; next = load_sym(av[1]); fd = next("/etc/inittab", O_RDONLY, 0); close(fd); return 0; }