1 // vim:shiftwidth=2:expandtab
12 __attribute__((constructor))
13 static void ginge_init(void)
15 unsigned int lowest_segment = (unsigned int)-1;
16 unsigned int start, end;
20 for (i = 0; i < ARRAY_SIZE(real_funcs_np); i++) {
21 *real_funcs_np[i].func_ptr = dlsym(RTLD_NEXT, real_funcs_np[i].name);
22 if (*real_funcs_np[i].func_ptr == NULL) {
23 fprintf(stderr, "dlsym %s: %s\n", real_funcs_np[i].name, dlerror());
26 // dbg("%p %s\n", *real_funcs_np[i].func_ptr, real_funcs_np[i].name);
29 f = fopen("/proc/self/maps", "r");
31 perror("open /proc/self/maps");
35 ret = fscanf(f, "%x-%x %*s %*s %*s %*s %*s\n", &start, &end);
40 lowest_segment = start;
42 // assume first entry lists program's text section.
43 // unprotect it in case we need some patching.
44 ret = mprotect((void *)start, end - start, PROT_READ|PROT_WRITE|PROT_EXEC);
46 perror("warning: mprotect");
49 ret = fscanf(f, "%x-%*s %*s %*s %*s %*s %*s\n", &start);
53 if (start < lowest_segment)
54 lowest_segment = start;
60 while (fgets(buff, sizeof(buff), f))
65 emu_init((void *)lowest_segment);