2009-06-25 5 views
6

Я пытаюсь установить предварительно построенный двоичный файл в пользовательский образ Android. Для этого я скопировал его в новый каталог в prebuilt/android-arm/ с Android.mk файл, похожий на этот:Установка готовой бинарной версии на Android: «не найден»

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

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

Так что, если я бегу 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 

Я straced это и это то, что я могу видеть:

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

Но файл есть, и Трассирование может найти его.

Любая идея о том, что может произойти?

UPDATE: Как говорит Кристоф, это, вероятно, проблема динамического связывания, но у меня нет LDD для Android ARM ...

ответ

7

Возможно, некоторые из необходимых динамических библиотек не может быть найден ,

Try «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) 
+0

Спасибо, вы, вероятно, находитесь в правильном направлении, знаете ли вы, как я могу получить ldd на образе Android? –

+4

Возможно, у вашей кросс-компилятора инструментальная цепочка. Попробуйте «arm-android-ldd» на вашей хост-системе, предполагая, что ваш gcc - «arm-android-gcc». Вы также можете попробовать 'readelf -d binary_name' в своей хост-системе. Оба должны предоставить вам список требуемых динамических библиотек, но вам нужно будет проверить список вручную. –

+0

Подтверждено, что-то связано с разделяемыми библиотеками, один из них не включен в построенное изображение. Я не знал себя, это здорово :) Спасибо! –