#include #include #include #include #include #include #include #include "libload.h" char *fnames[] = { "open", "open64", "read", "write", "close", "lseek", "dup", "dup2", "readv", "writev", "fcntl", "fork", "pread", "pwrite", "fdopen", "fopen", "fopen64", "fclose", "fread", "fwrite", "fseek", /* "fseek64", */ "rewind", "fsetpos", "creat", "creat64", "fgetc", "fgets", "getc", "gets", "fputc", "fputs", "putc", "puts", "ungetc", "vfscanf", "fscanf", "vfprintf", "fprintf", "socket", "accept", "send", "sendto", "sendmsg", "recv", "recvfrom", "recvmsg", "execve", "execl", "execlp", "execle", "execv", "execvp" }; void *farray[sizeof fnames / sizeof (char *)]; extern int errno; /* Needed because all normal I/O calls are trapped, but not yet loaded */ void emergency_perror(char *c) { char buf[256], *p; p = strerror(errno); snprintf(buf, sizeof buf, "%s:%s\n", p, c); if (syscall(SYS_write, 2, buf, strlen(buf)) < 0) exit(1); } int libload() { int i; void *dlp; if ( ((dlp = dlopen("libc.so.6", RTLD_NOW | RTLD_GLOBAL)) == NULL) && (dlp = dlopen("libc.so.6.1", RTLD_NOW | RTLD_GLOBAL)) == NULL) { emergency_perror("Failed to open libc in libload"); exit(ENOTSUP); } for (i = 0; i < sizeof fnames / sizeof (char *); i++) { if ( (farray[i] = dlsym(dlp, fnames[i])) == NULL) { emergency_perror("dlsym failure in libload"); fprintf(stderr, "Failed to get symbol %s, index %d\n", fnames[i], i); exit(1); } } return 0; }