2 * GINGE - GINGE Is Not Gp2x Emulator
5 * This work is licensed under the MAME license, see COPYING file for details.
17 static void next_line(FILE *f)
22 } while (c != EOF && c != '\n');
25 __attribute__((constructor))
26 static void ginge_init(void)
28 unsigned int lowest_segment = (unsigned int)-1;
29 unsigned int start, end;
33 for (i = 0; i < ARRAY_SIZE(real_funcs_np); i++) {
34 *real_funcs_np[i].func_ptr = dlsym(RTLD_NEXT, real_funcs_np[i].name);
35 if (*real_funcs_np[i].func_ptr == NULL) {
36 fprintf(stderr, "dlsym %s: %s\n", real_funcs_np[i].name, dlerror());
39 // dbg("%p %s\n", *real_funcs_np[i].func_ptr, real_funcs_np[i].name);
42 f = fopen("/proc/self/maps", "r");
44 perror("open /proc/self/maps");
48 ret = fscanf(f, "%x-%x ", &start, &end);
53 lowest_segment = start;
55 // assume first entry lists program's text section.
56 // unprotect it in case we need some patching.
57 ret = mprotect((void *)start, end - start, PROT_READ|PROT_WRITE|PROT_EXEC);
59 perror("warning: mprotect");
64 ret = fscanf(f, "%x-%*s %*s %*s %*s %*s %*s\n", &start);
68 if (start < lowest_segment)
69 lowest_segment = start;
75 while (fgets(buff, sizeof(buff), f))
80 // remove self from preload, further commands (from system() and such)
81 // will be handled by ginge_prep.
82 unsetenv("LD_PRELOAD");
83 unsetenv("LD_LIBRARY_PATH");
85 emu_init((void *)lowest_segment);
88 // vim:shiftwidth=2:expandtab