Installazione di un binario predefinito su Android: & # 8220; non trovato & # 8221;
Domanda
Sto cercando di installare un binario predefinito in un'immagine Android personalizzata. Per questo l'ho copiato in una nuova directory in prebuilt / android-arm /
con un file Android.mk
simile a questo:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := binary_name
LOCAL_MODULE := binary_name
LOCAL_MODULE_CLASS := EXECUTABLES
include $(BUILD_PREBUILT)
Quindi, se eseguo make system_image binary_name
, il file binario viene copiato in / bin /
nell'immagine di sistema. E se eseguo l'emulatore posso vedere il file binario in / system / bin
. Le autorizzazioni sono le stesse degli altri eseguibili ( -rwxr-xr-x
) e, secondo il file
, questo è un binario ARM ( ELF 32-bit Eseguibile LSB, ARM, versione 1 (SYSV), collegato dinamicamente (utilizza librerie condivise), rimosso
).
Ma quando lo eseguo sull'emulatore, dice:
# binary_name
binary_name: not found
L'ho individuato e questo è quello che posso vedere:
# 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>
Ma il file è lì e strace è in grado di trovarlo.
Qualche idea su cosa può succedere?
AGGIORNAMENTO : come dice Kristof, questo è probabilmente un problema di collegamento dinamico, ma non ho ldd per Android ARM ...
Soluzione
Forse non è possibile trovare alcune delle librerie dinamiche richieste.
Prova 'ldd binary_name'
L'output dovrebbe apparire un po 'come questo se tutte le librerie possono essere trovate. Le librerie mancanti devono essere chiaramente contrassegnate.
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)