2009-06-25 13 views
6

Estoy tratando de instalar un archivo binario precompilado en una imagen personalizada de Android. Para ello, he copiado a un nuevo directorio en prebuilt/android-arm/ con un archivo Android.mk similar a éste:Instalación de un binario precompilado en Android: "no encontrado"

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

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

Así que si me quedo make system_image binary_name, el archivo binario se copia en /bin/ imagen del sistema en. Y si ejecuto el emulador, puedo ver el archivo binario en /system/bin. Los permisos son los mismos que los otros ejecutables (-rwxr-xr-x) y, de acuerdo con file, este es un binario ARM (ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped).

Pero cuando lo ejecuto en el emulador, que dice:

# binary_name 
binary_name: not found 

He straced él y esto es lo que puedo ver:

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

embargo, el archivo está allí, y strace es capaz de encontrarlo

¿Alguna idea de lo que puede estar pasando?

ACTUALIZACIÓN: Como dice Kristof, esto es probablemente un problema de enlace dinámico, pero no tengo LDD para Android ARM ...

Respuesta

7

Quizás algunas de las bibliotecas dinámicas requeridas no se puede encontrar .

Try 'LDD binary_name'

El resultado debe ser un poco como esto si todas las bibliotecas se pueden encontrar. Las bibliotecas que faltan deben estar claramente marcadas.

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

Gracias, probablemente estés en el camino correcto, ¿sabes cómo puedo tener ldd en una imagen de Android? –

+4

Su herramienta de compilación cruzada puede tener una. Pruebe 'arm-android-ldd' en su sistema host suponiendo que su gcc es 'arm-android-gcc'. También puede probar 'readelf -d nombre_binario' en su sistema host. Ambos deberían proporcionarle una lista de las bibliotecas dinámicas requeridas, pero deberá verificar la lista manualmente. –

+0

Confirmado, es algo relacionado con las bibliotecas compartidas, una de ellas no está incluida en la imagen construida. No sabía readelf, es genial :) ¡Gracias! –

Cuestiones relacionadas