proot: Properly handle relocated embedded loader
The _binary_loader_exe_size variable can be relocated by Android linker which makes it unusable, rely instead on end-start which can be relocated Also don't reject binaries with linker having it's own DT_INTERP section (like /system/bin/linker on ARM Android)
This commit is contained in:
parent
ab9c603c48
commit
788935ae8d
42
disabled-packages/proot/src-execve-enter.c.patch
Normal file
42
disabled-packages/proot/src-execve-enter.c.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
--- PRoot-5.1.0/src/execve/enter.c 2014-12-15 15:18:11.000000000 +0100
|
||||||
|
+++ src/src/execve/enter.c 2016-03-20 12:05:08.013426156 +0100
|
||||||
|
@@ -454,10 +454,10 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
extern unsigned char _binary_loader_exe_start;
|
||||||
|
-extern unsigned char _binary_loader_exe_size;
|
||||||
|
+extern unsigned char _binary_loader_exe_end;
|
||||||
|
|
||||||
|
extern unsigned char WEAK _binary_loader_m32_exe_start;
|
||||||
|
-extern unsigned char WEAK _binary_loader_m32_exe_size;
|
||||||
|
+extern unsigned char WEAK _binary_loader_m32_exe_end;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the built-in loader. This function returns NULL if an
|
||||||
|
@@ -483,11 +483,11 @@
|
||||||
|
|
||||||
|
if (wants_32bit_version) {
|
||||||
|
start = (void *) &_binary_loader_m32_exe_start;
|
||||||
|
- size = (size_t) &_binary_loader_m32_exe_size;
|
||||||
|
+ size = (size_t) (&_binary_loader_m32_exe_end - &_binary_loader_m32_exe_start);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
start = (void *) &_binary_loader_exe_start;
|
||||||
|
- size = (size_t) &_binary_loader_exe_size;
|
||||||
|
+ size = (size_t) (&_binary_loader_exe_end - &_binary_loader_exe_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
status2 = write(fd, start, size);
|
||||||
|
@@ -645,8 +645,10 @@
|
||||||
|
|
||||||
|
/* An ELF interpreter is supposed to be
|
||||||
|
* standalone. */
|
||||||
|
- if (tracee->load_info->interp->interp != NULL)
|
||||||
|
- return -EINVAL;
|
||||||
|
+ if (tracee->load_info->interp->interp != NULL) {
|
||||||
|
+ TALLOC_FREE(tracee->load_info->interp->interp);
|
||||||
|
+ // TODO: Print warning?
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
compute_load_addresses(tracee);
|
Loading…
x
Reference in New Issue
Block a user