#include "header.h"
#include "realfuncs.h"
+#include "syscalls.h"
char *bin_path;
+char **g_argv;
#define CHECK_(val, fail_operator, expect, err_msg) \
if (val fail_operator expect) { \
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;
long *stack_frame;
struct stat st;
char buf[64];
+ long lret;
if (argc < 2) {
fprintf(stderr, "usage: %s <program> [args]\n", argv[0]);
return 1;
}
+ 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");
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
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++)