在Android上安装预构建的二进制文件:"not found"

Jai*_*ano 7 linux android arm emulation libc

我正在尝试在自定义Android映像中安装预构建的二进制文件.为此,我将其复制到一个新目录,prebuilt/android-arm/其中包含Android.mk与此类似的文件:

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

LOCAL_SRC_FILES := binary_name
LOCAL_MODULE := binary_name
LOCAL_MODULE_CLASS := EXECUTABLES
include $(BUILD_PREBUILT)
Run Code Online (Sandbox Code Playgroud)

因此,如果我运行make system_image binary_name,二进制文件将被复制到/bin/系统映像中.如果我运行模拟器,我可以看到二进制文件/system/bin.权限与其他可执行文件(-rwxr-xr-x)相同,并且根据file这是一个ARM二进制文件(ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped).

但是当我在模拟器上运行它时,它说:

# binary_name
binary_name: not found
Run Code Online (Sandbox Code Playgroud)

我已经把它拉了过来,这就是我能看到的:

# 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>
Run Code Online (Sandbox Code Playgroud)

但文件存在,strace能够找到它.

什么可以发生什么?

更新:正如Kristof所说,这可能是动态链接的问题,但我没有Android ARM的ldd ......

Kri*_*ost 8

也许找不到一些必需的动态库.

试试'ldd binary_name'

如果可以找到所有库,输出应该看起来有点像这样.应清楚标记缺失的图书馆.

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)
Run Code Online (Sandbox Code Playgroud)

  • 您的交叉编译工具链可能有一个.假设你的gcc是'arm-android-gcc',试试你的主机系统上的'arm-android-ldd'.您也可以在主机系统上尝试"readelf -d binary_name".两者都应该为您提供所需动态库的列表,但您需要手动验证列表. (4认同)