notaz.gp2x.de
/
ginge.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
use compat memory layout
[ginge.git]
/
loader
/
loader.c
diff --git
a/loader/loader.c
b/loader/loader.c
index
27ea856
..
84758c1
100644
(file)
--- a/
loader/loader.c
+++ b/
loader/loader.c
@@
-15,6
+15,7
@@
#include "header.h"
#include "realfuncs.h"
#include "header.h"
#include "realfuncs.h"
+#include "syscalls.h"
char *bin_path;
char **g_argv;
char *bin_path;
char **g_argv;
@@
-66,7
+67,7
@@
extern char **environ;
int main(int argc, char *argv[])
{
int main(int argc, char *argv[])
{
- void *lowest_segment
= (void *)-1
;
+ void *lowest_segment
s[2] = { NULL, NULL }
;
Elf32_Ehdr hdr;
Elf32_Phdr *phdr;
FILE *fi;
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 *stack_frame;
struct stat st;
char buf[64];
+ long lret;
if (argc < 2) {
fprintf(stderr, "usage: %s <program> [args]\n", argv[0]);
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;
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");
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);
}
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_segment
s[0]
= map_ptr;
}
// build self bin path
}
// build self bin path
@@
-177,7
+185,7
@@
int main(int argc, char *argv[])
fclose(fi);
fclose(fi);
- emu_init(lowest_segment);
+ emu_init(lowest_segment
s, 0
);
// generate stack frame: argc, argv[], NULL, env[], NULL
for (envc = 0; environ[envc] != NULL; envc++)
// generate stack frame: argc, argv[], NULL, env[], NULL
for (envc = 0; environ[envc] != NULL; envc++)