views:

1524

answers:

1

I'm trying to install a prebuilt binary in a custom Android image. For that I have copied it to a new directory in prebuilt/android-arm/ with an Android.mk file similar to this one:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := binary_name
LOCAL_MODULE := binary_name
LOCAL_MODULE_CLASS := EXECUTABLES
include $(BUILD_PREBUILT)

So if I run make system_image binary_name, the binary file is copied to /bin/ in system image. And if I run the emulator I can see the binary file in /system/bin. The permissions are the same as the other executables (-rwxr-xr-x) and, according to file, this is an ARM binary (ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped).

But when I run it on the emulator, it says:

# binary_name
binary_name: not found

I have straced it and this is what I can see:

# strace binary_name
execve("/system/bin/binary_name", ["binary_name"], [/* 9 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec", 12strace: exec)            = 12
write(2, ": ", 2: )                       = 2
write(2, "No such file or directory", 25No such file or directory) = 25
write(2, "\n", 1
)                       = 1
io_submit(1, -1344063348, {...} <unfinished ... exit status 1>

But the file is there, and strace is able to find it.

Any idea of what can be happening?

UPDATE: As Kristof says, this is probably a problem of dynamic linking, but I don't have ldd for Android ARM...

+3  A: 

Perhaps some of the required dynamic libraries can't be found.

Try 'ldd binary_name'

The output should look a little like this if all libraries can be found. Missing libraries should be clearly marked.

linux-gate.so.1 =>  (0xb7fbf000)
libcap.so.2 => /lib/libcap.so.2 (0xb7fa7000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7fa3000)
libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7f64000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7f3e000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dde000)
libattr.so.1 => /lib/libattr.so.1 (0xb7dd9000)
/lib/ld-linux.so.2 (0xb7fc0000)
Kristof Provost
Thanks, you are probably in the right way, do you know how can I have ldd in an Android image?
Jaime Soriano
Your cross compiler toolchain might have one. Try 'arm-android-ldd' on your host system assuming your gcc is 'arm-android-gcc'.You can also try 'readelf -d binary_name' on your host system. Both should give you a list of required dynamic libraries but you'll need to verify the list manually.
Kristof Provost
Confirmed, it's something related to shared libraries, one of them is not included in the built image.I didn't know readelf, it's great :) Thank you!
Jaime Soriano
'arm-eabi-readelf -d libfoo.so' worked for me. Thanks!
cpeterso