2009-06-25 14 views
6

Ich versuche, eine vordefinierte Binärdatei in einem benutzerdefinierten Android-Image zu installieren.Installieren einer vorgefertigten Binärdatei unter Android: "nicht gefunden"

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

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

Also, wenn ich make system_image binary_name laufen, die Binärdatei /bin/ in Systemabbild kopiert: Dafür habe ich es in ein neues Verzeichnis in prebuilt/android-arm/ mit einer Android.mk Datei ähnlich wie diese kopiert. Und wenn ich den Emulator starte, kann ich die Binärdatei in /system/bin sehen. Die Berechtigungen sind die gleichen wie bei den anderen ausführbaren Dateien (-rwxr-xr-x) und gemäß file ist dies eine ARM-Binärdatei (ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped).

Aber wenn ich es auf dem Emulator laufen, heißt es:

# binary_name 
binary_name: not found 

Ich habe es straced und das ist, was ich sehen kann:

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

Aber die Datei ist da, und strace kann es finden.

Irgendeine Idee von was kann passieren?

UPDATE: Wie Kristof sagt, ist dies wahrscheinlich ein Problem der dynamischen Verknüpfung ist, aber ich habe nicht ldd für Android ARM ...

Antwort

7

einige der erforderlichen dynamischen Bibliotheken Vielleicht kann nicht gefunden werden .

Try ‚ldd binary_name‘

Der Ausgang ein wenig so aussehen sollte, wenn alle Bibliotheken gefunden werden kann. Fehlende Bibliotheken sollten deutlich gekennzeichnet sein.

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

Danke, Sie sind wahrscheinlich in der richtigen Weise, wissen Sie, wie kann ich LDD in einem Android-Image haben? –

+4

Ihre Cross-Compiler-Toolchain könnte eine haben. Versuchen Sie 'arm-android-ldd' auf Ihrem Host-System, vorausgesetzt, Ihr gcc ist 'arm-android-gcc'. Sie können auch 'readelf -d binary_name' auf Ihrem Host-System versuchen. Beide sollten Ihnen eine Liste der benötigten dynamischen Bibliotheken geben, aber Sie müssen die Liste manuell überprüfen. –

+0

Bestätigt, es handelt sich um etwas, das sich auf gemeinsam genutzte Bibliotheken bezieht, von denen eine nicht im integrierten Image enthalten ist. Ich wusste nicht, realelf, es ist toll :) Danke! –