pnd scripts and icon
[ginge.git] / loader / dl.c
CommitLineData
7fd42181 1// vim:shiftwidth=2:expandtab
2#define _GNU_SOURCE
3#include <stdio.h>
4#include <stdlib.h>
5#include <sys/mman.h>
6#include <dlfcn.h>
7#include "header.h"
8
9#define DL
10#include "override.c"
11
12__attribute__((constructor))
13static void ginge_init(void)
14{
15 unsigned int lowest_segment = (unsigned int)-1;
16 unsigned int start, end;
17 int i, ret;
18 FILE *f;
19
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());
24 exit(1);
25 }
26 // dbg("%p %s\n", *real_funcs_np[i].func_ptr, real_funcs_np[i].name);
27 }
28
29 f = fopen("/proc/self/maps", "r");
30 if (f == NULL) {
31 perror("open /proc/self/maps");
32 exit(1);
33 }
34
35 ret = fscanf(f, "%x-%x %*s %*s %*s %*s %*s\n", &start, &end);
36 if (ret != 2) {
37 perror("parse maps");
38 exit(1);
39 }
40 lowest_segment = start;
41
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);
45 if (ret != 0)
46 perror("warning: mprotect");
47
48 while (1) {
49 ret = fscanf(f, "%x-%*s %*s %*s %*s %*s %*s\n", &start);
50 if (ret <= 0)
51 break;
52
53 if (start < lowest_segment)
54 lowest_segment = start;
55 }
56
57#if 0
58 rewind(f);
59 char buff[256];
60 while (fgets(buff, sizeof(buff), f))
61 fputs(buff, stdout);
62#endif
63 fclose(f);
64
65 emu_init((void *)lowest_segment);
66}
67