use compat memory layout
[ginge.git] / loader / loader.c
index 27ea856..84758c1 100644 (file)
@@ -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 <program> [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++)