2009-06-25 14 views
6

Próbuję zainstalować wstępnie skompilowany plik binarny w niestandardowym obrazie systemu Android. Do tego mam skopiowane go do nowego katalogu w prebuilt/android-arm/ z Android.mk pliku podobnego do tego:Instalowanie wstępnie skompilowanego pliku binarnego na systemie Android: "nie znaleziono"

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

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

Więc jeśli biegnę make system_image binary_name plik binarny jest kopiowany do /bin/ w systemie obrazu. A jeśli uruchomię emulator, widzę plik binarny w /system/bin. Uprawnienia są takie same jak innych plików wykonywalnych (-rwxr-xr-x) i, zgodnie z file, jest to plik binarny ARM (ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped).

Ale kiedy go uruchomić na emulatorze, to mówi:

# binary_name 
binary_name: not found 

Mam straced go i to, co widzę:

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

ale plik istnieje, i strace jest w stanie go znaleźć.

Czy masz pojęcie, co może się wydarzyć?

UPDATE: Jak mówi Kristof, to prawdopodobnie problem z dynamicznego łączenia, ale nie mam ldd dla Android ARM ...

Odpowiedz

7

Być może niektóre z wymaganych bibliotek dynamicznych nie można znaleźć .

Try „LDD binary_name”

Wyjście powinno wyglądać trochę tak, jeśli można znaleźć wszystkie biblioteki. Brakujące biblioteki powinny być wyraźnie oznaczone.

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

Dzięki, jesteś pewnie we właściwy sposób, czy wiesz, jak mogę mieć HDD w obrazie systemu Android? –

+4

Twój zestaw narzędzi do kompilacji krzyżowej może mieć jeden. Wypróbuj 'arm-android-ldd' na twoim systemie hostującym, zakładając, że twój gcc to 'arm-android-gcc'. Możesz też wypróbować "readelf -d nazwa_binalu" w systemie hosta. Oba powinny dać ci listę wymaganych bibliotek dynamicznych, ale musisz ręcznie zweryfikować listę. –

+0

Potwierdzone, jest to coś związanego z bibliotekami współdzielonymi, jedna z nich nie jest zawarta w zbudowanym obrazie. Nie znałem readelf, jest wspaniale :) Dziękujemy! –

Powiązane problemy