2009-06-25 9 views
6

Sto tentando di installare un binario precompilato in un'immagine Android personalizzata. Per questo ho copiato in una nuova directory in prebuilt/android-arm/ con un file Android.mk simile a questo:Installazione di un binario precompilato su Android: "non trovato"

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 corro make system_image binary_name, il file binario viene copiato /bin/ immagine del sistema a. 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, in base allo file, questo è un binario ARM (ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped).

Ma quando l'eseguo sull'emulatore, si dice:

# binary_name 
binary_name: not found 

ho straced 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 di cosa può accadere?

UPDATE: Come dice Kristof, questo è probabilmente un problema di collegamento dinamico, ma non ho LDD per Android ARM ...

risposta

7

Forse alcune delle librerie dinamiche richieste non può essere trovato .

Try 'ldd binary_name'

L'output dovrebbe apparire un po 'come questo se tutte le librerie possono essere trovati. 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) 
+0

Grazie, probabilmente sei nel modo giusto, sai come posso avere ldd in un'immagine Android? –

+4

La tua catena di strumenti cross compilatore potrebbe averne uno. Prova 'arm-android-ldd' sul tuo sistema host assumendo che gcc sia 'arm-android-gcc'. Puoi anche provare 'readelf -d binary_name' sul tuo sistema host. Entrambi dovrebbero darti un elenco delle librerie dinamiche richieste ma dovrai verificare manualmente l'elenco. –

+0

Confermato, è qualcosa relativo alle librerie condivise, una delle quali non è inclusa nell'immagine costruita. Non sapevo di me stesso, è fantastico :) Grazie! –