create an additional linkpage reachable from SOs
[ginge.git] / loader / loader.c
index 2d7d3d2..8a021df 100644 (file)
@@ -17,6 +17,7 @@
 #include "realfuncs.h"
 
 char *bin_path;
+char **g_argv;
 
 #define CHECK_(val, fail_operator, expect, err_msg) \
   if (val fail_operator expect) { \
@@ -65,7 +66,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;
@@ -81,6 +82,8 @@ int main(int argc, char *argv[])
     return 1;
   }
 
+  g_argv = argv;
+
   fi = fopen("/proc/self/maps", "r");
   CHECK_NE(fi, NULL, "fopen maps");
 
@@ -157,8 +160,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
@@ -174,7 +177,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++)