Installing a prebuilt binary on Android: "not found"

10,109

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)
Share:
10,109
Jaime Soriano
Author by

Jaime Soriano

Software Engineer in Elastic Beats

Updated on June 05, 2022

Comments

  • Jaime Soriano
    Jaime Soriano almost 2 years

    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...

  • Jaime Soriano
    Jaime Soriano almost 15 years
    Thanks, you are probably in the right way, do you know how can I have ldd in an Android image?
  • Kristof Provost
    Kristof Provost almost 15 years
    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.
  • Jaime Soriano
    Jaime Soriano almost 15 years
    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!