I am trying to run an ARM shared binary compiled for Android (found in .apk) on a Raspberry PI ARM machine.
Unfortunately, the binary is closed source, and I cannot recompile it for os, which works on raspberry pi (raspiansky, debiansky output)
Quick question: is it possible to run such a .so compiled for android on raspberry pi? I downloaded the binary here: http://www.speedyshare.com/MSXq9/libfoo.so (Sorry for the inconvenient download).
I found this similar question here Running ARM binaries for Android on Linux ARM , and it suggests that the binaries not run on other unix distributions (I use the output of debian, raspian on my raspberries), since the android c library is Bionic.
Is it possible to install bionic on debian? How can I run this library?
All of the following output was created on the rasbperry machine: I want to run / load libfoo.so.
When I try to load the .so file in python (before, I set LD_PRELOAD accordingly)
import ctypes import os path = os.path.dirname(os.path.realpath(__file__)) print ctypes.cdll.LoadLibrary('libfoo.so')
I get OSError: libfoo.so: cannot open shared objects file: there is no such file or directory.
But, looking at strace's output, it seems that the bootloader cannot load libfoo.so and thus fails with an error message that is misleading. There is no such file or directory (after all .so is found, and the bootloader tries to load it, but it fails).
When readelf -h libfoo.so is released, I get
root@raspberrypi :/home/pi
Also, the hh section of the aeabi attribute for libfoo.so (obtained using readelf - all )
No version information found in this file. Attribute Section: aeabi File Attributes Tag_CPU_name: "5TE" Tag_CPU_arch: v5TE Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-1 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: int
And in comparison, the same result as above for the locally compiled .so on the raspberry platform, where I try to run libfoo.so:
Attribute Section: aeabi File Attributes Tag_CPU_name: "6" Tag_CPU_arch: v6 Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-1 Tag_FP_arch: VFPv2 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: int Tag_ABI_HardFP_use: SP and DP Tag_ABI_VFP_args: VFP registers Tag_ABI_optimization_goals: Aggressive Speed Tag_DIV_use: Not allowed
There are some differences in the processor with which the shared libraries were compiled, but I assume this is not so important as the ARM architectures are compatible below.
Here's the strace output for loading libfoo.so :
root@raspberrypi :/home/pi# strace ./test -s libfoo.so execve("./test", ["./test", "-s", "libfoo.so"], [/* 19 vars */]) = 0 brk(0) = 0x36f000 uname({sys="Linux", node="raspberrypi", ...}) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f6a000 access("/etc/ld.so.preload", R_OK) = 0 open("/etc/ld.so.preload", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 mmap2(NULL, 44, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0xb6f69000 close(3) = 0 open("/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\270\4\0\0004\0\0\0"..., 512) = 512 lseek(3, 7276, SEEK_SET) = 7276 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 lseek(3, 7001, SEEK_SET) = 7001 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\24\1\25"..., 47) = 47 fstat64(3, {st_mode=S_IFREG|0755, st_size=10170, ...}) = 0 mmap2(NULL, 39740, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f3e000 mprotect(0xb6f40000, 28672, PROT_NONE) = 0 mmap2(0xb6f47000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0xb6f47000 close(3) = 0 munmap(0xb6f69000, 44) = 0 open("/usr/lib/tls/v6l/vfp/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/tls/v6l/vfp", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/tls/v6l/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/tls/v6l", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/tls/vfp/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/tls/vfp", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/tls/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/tls", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/v6l/vfp/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/v6l/vfp", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/v6l/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/v6l", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/vfp/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/vfp", 0xbea66f20) = -1 ENOENT (No such file or directory) open("/usr/lib/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0 open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=43090, ...}) = 0 mmap2(NULL, 43090, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f33000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/libdl.so.2", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0(\t\0\0004\0\0\0"..., 512) = 512 lseek(3, 8652, SEEK_SET) = 8652 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1160) = 1160 lseek(3, 8320, SEEK_SET) = 8320 read(3, "A0\0\0\0aeabi\0\1&\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\24\1\25"..., 49) = 49 fstat64(3, {st_mode=S_IFREG|0644, st_size=9812, ...}) = 0 mmap2(NULL, 41136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f28000 mprotect(0xb6f2a000, 28672, PROT_NONE) = 0 mmap2(0xb6f31000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0xb6f31000 close(3) = 0 open("/usr/lib/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\214y\1\0004\0\0\0"..., 512) = 512 lseek(3, 1198880, SEEK_SET) = 1198880 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1360) = 1360 lseek(3, 1198444, SEEK_SET) = 1198444 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\24\1\25"..., 47) = 47 fstat64(3, {st_mode=S_IFREG|0755, st_size=1200240, ...}) = 0 mmap2(NULL, 1242408, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6df8000 mprotect(0xb6f1b000, 28672, PROT_NONE) = 0 mmap2(0xb6f22000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x122) = 0xb6f22000 mmap2(0xb6f25000, 9512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f25000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f69000 set_tls(0xb6f694c0, 0xb6f69b98, 0xb6f6e048, 0xb6f694c0, 0xb6f6e048) = 0 mprotect(0xb6f22000, 8192, PROT_READ) = 0 mprotect(0xb6f31000, 4096, PROT_READ) = 0 mprotect(0xb6f6d000, 4096, PROT_READ) = 0 munmap(0xb6f33000, 43090) = 0 open("/usr/lib/libfoo.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0`\v\1\0004\0\0\0"..., 512) = 512 lseek(3, 341440, SEEK_SET) = 341440 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 840) = 840 lseek(3, 341224, SEEK_SET) = 341224 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4\24\1\25"..., 41) = 41 close(3) = 0 open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=43090, ...}) = 0 mmap2(NULL, 43090, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f33000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/tls/v6l/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/tls/v6l/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/tls/v6l/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/tls/v6l", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/tls/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/tls/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/tls/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/tls", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/v6l/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/v6l/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/v6l/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/v6l", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/arm-linux-gnueabihf/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/arm-linux-gnueabihf", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0 open("/usr/lib/arm-linux-gnueabihf/tls/v6l/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/tls/v6l/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/tls/v6l/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/tls/v6l", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/tls/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/tls/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/tls/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/tls", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/v6l/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/v6l/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/v6l/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/v6l", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/arm-linux-gnueabihf", {st_mode=S_IFDIR|0755, st_size=28672, ...}) = 0 open("/lib/tls/v6l/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/tls/v6l/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/tls/v6l/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/tls/v6l", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/tls/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/tls/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/tls/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/tls", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/v6l/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/v6l/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/v6l/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/v6l", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/vfp/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/vfp", 0xbea66f40) = -1 ENOENT (No such file or directory) open("/lib/libfoo.so", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 open("/usr/lib/libfoo.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0`\v\1\0004\0\0\0"..., 512) = 512 lseek(3, 341440, SEEK_SET) = 341440 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 840) = 840 lseek(3, 341224, SEEK_SET) = 341224 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4\24\1\25"..., 41) = 41 close(3) = 0 brk(0) = 0x36f000 brk(0x390000) = 0x390000 munmap(0xb6f33000, 43090) = 0 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f68000 write(1, "Service libfoo.so Not Fo"..., 115Service libfoo.so Not Found: libfoo.so: cannot open shared object file: No such file or directory ) = 115 write(1, "Problem calling generic_function"..., 91Problem calling generic_function_entry(): ./test: undefined symbol: generic_function_entry ) = 91 --- SIGSEGV (Segmentation fault) @ 0 (0) --- +++ killed by SIGSEGV +++ Segmentation fault