termux / proot

An chroot-like implementation using ptrace.
https://wiki.termux.com/wiki/PRoot
Other
761 stars 160 forks source link

32bit ARM Android executable fail with "vpid1: terminated with signal 11" on aarch64 #119

Open truboxl opened 4 years ago

truboxl commented 4 years ago

https://ralph.bakerlab.org/download/rosetta_4.20_arm-android-linux-gnu

Above is an application downloaded by BOINC for doing science stuff. On aarch64 with LD_PRELOAD unset, ./rosetta_4.20_arm-android-linux-gnu launches and exits normally (stderr.txt, stdout.txt should appear). However, proot ./rosetta_4.20_arm-android-linux-gnu will get proot info: vpid 1: terminated with signal 11

$ PROOT_VERBOSE=9 LD_PRELOAD='' proot ./rosetta_4.20_arm-android-linux-gnu
proot info: binding = /
proot info: Checking for f2fs case sensitivity bug
proot info: f2fs bug not present on device
proot info: vpid 1: translate("/data/data/com.termux/files/home/boinc-test" + "./rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: translate("/data/data/com.termux/files/home/boinc-test" + "./rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: exe = /data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu
proot info: argv = ./rosetta_4.20_arm-android-linux-gnu
proot info: initial cwd = /data/data/com.termux/files/home/boinc-test
proot info: verbose level = 9
proot info: pid 3299: access to "/dev/pts/4" (fd 0) won't be translated until closed
proot info: pid 3299: access to "/dev/pts/4" (fd 1) won't be translated until closed
proot info: pid 3299: access to "/dev/pts/4" (fd 2) won't be translated until closed
proot info: pid 3299: access to "/proc/3299/fd" (fd 3) won't be translated until closed
proot info: vpid 1: sysenter start: prctl(0x26, 0x1, 0x0, 0x0, 0x0, 0x0) = 0x26 [0x7fff498f10, 0]
proot info: vpid 1: sysenter end: prctl(0x26, 0x1, 0x0, 0x0, 0x0, 0x0) = 0x26 [0x7fff498f10, 0]
proot info: vpid 1: sysexit start: prctl(0x0, 0x1, 0x0, 0x0, 0x0, 0x0) = 0x0 [0x7fff498f10, 0]
proot info: vpid 1: sysexit end: prctl(0x0, 0x1, 0x0, 0x0, 0x0, 0x0) = 0x0 [0x7fff498f10, 0]
proot info: vpid 1: sysenter start: prctl(0x16, 0x2, 0x7fff498f30, 0x0, 0x0, 0x0) = 0x16 [0x7fff498f10, 0]
proot info: vpid 1: sysenter end: prctl(0x16, 0x2, 0x7fff498f30, 0x0, 0x0, 0x0) = 0x16 [0x7fff498f10, 0]
proot info: vpid 1: sysexit start: prctl(0x0, 0x2, 0x7fff498f30, 0x0, 0x0, 0x0) = 0x0 [0x7fff498f10, 0]
proot info: vpid 1: sysexit end: prctl(0x0, 0x2, 0x7fff498f30, 0x0, 0x0, 0x0) = 0x0 [0x7fff498f10, 0]
proot info: vpid 1: sysenter start: execve(0x772e644060, 0x7fff49b130, 0x7fff49b140, 0x0, 0x40100401, 0x0) = 0x772e644060 [0x7fff498f60, 0]
proot info: vpid 1: translate("/" + "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: translate("/" + "/system/bin/linker")
proot info: vpid 1:          -> "/apex/com.android.runtime/bin/linker"
proot info: vpid 1: sysenter end: execve(0x7fff498f29, 0x7fff49b130, 0x7fff49b140, 0x0, 0x40100401, 0x0) = 0x7fff498f29 [0x7fff498f29, 0]
proot info: ptrace acceleration (seccomp mode 2, new syscall order) enabled
proot info: skipping PTRACE_EVENT_SECCOMP for already handled sysenter
proot info: vpid 1: sysexit start: fremovexattr(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) = 0x0 [0x7fff498f29, 0]
proot info: vpid 1: sysexit end: restart_syscall(0xff80caac, 0x0, 0x0, 0x0, 0x0, 0x0) = 0xff80caac [0xff80caac, 1]
proot info: vpid 1: sysenter start: open(0xff80cc5c, 0x0, 0x0, 0x80, 0x0, 0x0) = 0xff80cc5c [0xff80caa8, 1]
proot info: vpid 1: translate("/" + "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: sysenter end: open(0xff80ca59, 0x0, 0x0, 0x80, 0x0, 0x0) = 0xff80ca59 [0xff80caa8, 1]
proot info: vpid 1: translate("/" + "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: terminated with signal 11

PROOT_NO_SECCOMP=1 does not have any effect. strace produce way too much output for me to understand. Probably need to fix this before proot do all in Termux API29+. Maybe need improve aarch32 support or do something else on the BOINC side...

Grimler91 commented 4 years ago

Have you tried with export PROOT_NO_SECCOMP=1?

truboxl commented 4 years ago

Done, same thing.

$ export PROOT_VERBOSE=9
$ unset LD_PRELOAD
$ export PROOT_NO_SECCOMP=1
$ proot ./rosetta_4.20_arm-android-linux-gnu
proot info: binding = /
proot info: Checking for f2fs case sensitivity bug
proot info: f2fs bug not present on device
proot info: vpid 1: translate("/data/data/com.termux/files/home/boinc-test" + "./rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: translate("/data/data/com.termux/files/home/boinc-test" + "./rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: exe = /data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu
proot info: argv = ./rosetta_4.20_arm-android-linux-gnu
proot info: initial cwd = /data/data/com.termux/files/home/boinc-test
proot info: verbose level = 9
proot info: pid 30383: access to "/dev/pts/5" (fd 0) won't be translated until closed
proot info: pid 30383: access to "/dev/pts/5" (fd 1) won't be translated until closed
proot info: pid 30383: access to "/dev/pts/5" (fd 2) won't be translated until closed
proot info: pid 30383: access to "/proc/30383/fd" (fd 3) won't be translated until closed
proot info: vpid 1: sysenter start: execve(0x7110c44060, 0x7feb8be740, 0x7feb8be750, 0x0, 0x40100401, 0x71128eeef8) = 0x7110c44060 [0x7feb8bc570, 0]
proot info: vpid 1: translate("/" + "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: translate("/" + "/system/bin/linker")
proot info: vpid 1:          -> "/apex/com.android.runtime/bin/linker"
proot info: vpid 1: sysenter end: execve(0x7feb8bc539, 0x7feb8be740, 0x7feb8be750, 0x0, 0x40100401, 0x71128eeef8) = 0x7feb8bc539 [0x7feb8bc539, 0]
proot info: vpid 1: sysexit start: fremovexattr(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) = 0x0 [0x7feb8bc539, 0]
proot info: vpid 1: sysexit end: restart_syscall(0xffb4756c, 0x0, 0x0, 0x0, 0x0, 0x0) = 0xffb4756c [0xffb4756c, 1]
proot info: vpid 1: sysenter start: open(0xffb4771c, 0x0, 0x0, 0xb4, 0x0, 0x0) = 0xffb4771c [0xffb47568, 1]
proot info: vpid 1: translate("/" + "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: sysenter end: open(0xffb47519, 0x0, 0x0, 0xb4, 0x0, 0x0) = 0xffb47519 [0xffb47519, 1]
proot info: vpid 1: sysexit start: open(0x3, 0x0, 0x0, 0xb4, 0x0, 0x0) = 0x3 [0xffb47519, 1]
proot info: vpid 1: sysexit end: open(0x3, 0x0, 0x0, 0xb4, 0x0, 0x0) = 0x3 [0xffb47568, 1]
proot info: vpid 1: sysenter start: mmap2(0xf000000, 0x9302000, 0x5, 0x12, 0x3, 0x0) = 0xf000000 [0xffb47568, 1]
proot info: vpid 1: sysenter end: mmap2(0xf000000, 0x9302000, 0x5, 0x12, 0x3, 0x0) = 0xf000000 [0xffb47568, 1]
proot info: vpid 1: sysexit start: mmap2(0xf000000, 0x9302000, 0x5, 0x12, 0x3, 0x0) = 0xf000000 [0xffb47568, 1]
proot info: vpid 1: sysexit end: mmap2(0xf000000, 0x9302000, 0x5, 0x12, 0x3, 0x0) = 0xf000000 [0xffb47568, 1]
proot info: vpid 1: translate("/" + "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu")
proot info: vpid 1:          -> "/data/data/com.termux/files/home/boinc-test/rosetta_4.20_arm-android-linux-gnu"
proot info: vpid 1: terminated with signal 11
$ file ./rosetta_4.20_arm-android-linux-gnu
./rosetta_4.20_arm-android-linux-gnu: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
michalbednarski commented 4 years ago

This is similar to #107, please try applying changes described there (and if they work please post, I think that at this point if they work it might make sense to include them in Termux proot available in apt.

truboxl commented 4 years ago

I can confirm the patch at https://github.com/termux/proot/issues/107#issuecomment-630365545 works for the 32bit but it will break 64bit version of the binary with proot info: vpid 1: terminated with signal 7 EDIT: apparently it is already broken before for some 64bit version, this probably going to be a big rabbit hole EDIT2: I use on device building proot, does that have any effect? EDIT3: There is difference in using proot build from on device vs build from NDK....

I think I am more interested if proot can do away hardcoding the address like the next commit and message in that comment. Will test that next...

Or I probably should do blocking from BOINC side to not download 32bit tasks on 64bit devices for the Termux package... It probably won't work anyway for future 64bit only devices...