1 // vim:shiftwidth=2:expandtab
12 static void next_line(FILE *f)
17 } while (c != EOF && c != '\n');
20 __attribute__((constructor))
21 static void ginge_init(void)
23 unsigned int lowest_segment = (unsigned int)-1;
24 unsigned int start, end;
28 for (i = 0; i < ARRAY_SIZE(real_funcs_np); i++) {
29 *real_funcs_np[i].func_ptr = dlsym(RTLD_NEXT, real_funcs_np[i].name);
30 if (*real_funcs_np[i].func_ptr == NULL) {
31 fprintf(stderr, "dlsym %s: %s\n", real_funcs_np[i].name, dlerror());
34 // dbg("%p %s\n", *real_funcs_np[i].func_ptr, real_funcs_np[i].name);
37 f = fopen("/proc/self/maps", "r");
39 perror("open /proc/self/maps");
43 ret = fscanf(f, "%x-%x ", &start, &end);
48 lowest_segment = start;
50 // assume first entry lists program's text section.
51 // unprotect it in case we need some patching.
52 ret = mprotect((void *)start, end - start, PROT_READ|PROT_WRITE|PROT_EXEC);
54 perror("warning: mprotect");
59 ret = fscanf(f, "%x-%*s %*s %*s %*s %*s %*s\n", &start);
63 if (start < lowest_segment)
64 lowest_segment = start;
70 while (fgets(buff, sizeof(buff), f))
75 // remove self from preload, further commands (from system() and such)
76 // will be handled by ginge_prep.
77 unsetenv("LD_PRELOAD");
78 unsetenv("LD_LIBRARY_PATH");
80 emu_init((void *)lowest_segment);