X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Floader.c;h=84758c1ac8f31393ace15883ceb4150f9df3655f;hp=27ea85627fec81ed8a364dec705cc7d17fe10499;hb=df608af11ff903836b8a2be235719511df03b025;hpb=7868435641e4209e956a591ff0844afc14f83f16 diff --git a/loader/loader.c b/loader/loader.c index 27ea856..84758c1 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -15,6 +15,7 @@ #include "header.h" #include "realfuncs.h" +#include "syscalls.h" char *bin_path; char **g_argv; @@ -66,7 +67,7 @@ extern char **environ; int main(int argc, char *argv[]) { - void *lowest_segment = (void *)-1; + void *lowest_segments[2] = { NULL, NULL }; Elf32_Ehdr hdr; Elf32_Phdr *phdr; FILE *fi; @@ -76,6 +77,7 @@ int main(int argc, char *argv[]) long *stack_frame; struct stat st; char buf[64]; + long lret; if (argc < 2) { fprintf(stderr, "usage: %s [args]\n", argv[0]); @@ -84,6 +86,12 @@ int main(int argc, char *argv[]) g_argv = argv; + lret = g_personality(-1); + if (g_syscall_error(lret) != -1) { + lret |= 0x0240000; // ADDR_COMPAT_LAYOUT | ADDR_NO_RANDOMIZE + g_personality(lret); + } + fi = fopen("/proc/self/maps", "r"); CHECK_NE(fi, NULL, "fopen maps"); @@ -160,8 +168,8 @@ int main(int argc, char *argv[]) do_patches((char *)ptr + align, phdr[i].p_filesz); } - if (map_ptr < lowest_segment) - lowest_segment = map_ptr; + if (lowest_segments[0] == NULL || map_ptr < lowest_segments[0]) + lowest_segments[0] = map_ptr; } // build self bin path @@ -177,7 +185,7 @@ int main(int argc, char *argv[]) fclose(fi); - emu_init(lowest_segment); + emu_init(lowest_segments, 0); // generate stack frame: argc, argv[], NULL, env[], NULL for (envc = 0; environ[envc] != NULL; envc++)