2012-11-21 12 views
6

Ich habe zwei ausführbare Dateien, beide kompiliert, um in Android zu laufen. Ich habe beide auf dem Gerät im selben Verzeichnis abgelegt. Ich habe alle Shared Libraries, auf die sie angewiesen sind, in dasselbe Verzeichnis gestellt, einschließlich ld-linux.so.3. Ich betreiben die ausführbaren Dateien unter Verwendung von:Mögliche Ursachen für "Zuordnung des Segments vom gemeinsamen Objekt fehlgeschlagen: Operation nicht zulässig" und Debuggen?

ld-linux.so.3 --library-path/path/to/Bibliotheken

executable_name

arbeiten beide auf älteren Android-Versionen, wenn sie als jeden Benutzer ausgeführt wird. Beide funktionieren auf der neuesten Android-Version, wenn sie als root ausgeführt werden. Nur einer funktioniert auf der neuesten Android-Version, wenn er als beliebiger Benutzer ausgeführt wird. Stattdessen gibt es:

ausgefallenes Segment aus dem gemeinsamen Objekt abbilden: executable_name Betrieb nicht

erlaubt

Wie kann ich herausfinden, was mit der ausführbaren Datei unterscheidet, die nicht ausgeführt werden?

ich las viel online und die meisten Leute, die diesen Fehler erhalten, entweder:

A) hat keine Berechtigungen zum Ausführen für eine der Bibliotheken sie auf oder der ausführbaren Datei selbst abhängig sind.

oder

B) versuchen, aus einem Verzeichnis auszuführen, das als NOEXEC montiert ist.

beide scheinen nicht der Fall zu sein. Es kann alle Bibliotheken finden und ich kann jede Bibliothek selbst laden und sehen, welche anderen Dinge davon abhängig sind, gelöst zu werden. Außerdem kann ich grundlegende Skripte aus den Verzeichnissen von Interesse ausführen.

Die neuere Version von Android, Jelly Bean, ist eine andere Linux-Kernel-Version und ich frage mich, ob das verwandt ist.

Was geben? Wie kann ich debuggen?

+0

eine andere Art und Weise der Frage (mit Prämie) hier: http://stackoverflow.com/questions/13467951/issue-including-executable-with-android-application- when-using-jelly-bean – corbin

Antwort

1

Das Problem war mit, wie die ausführbaren Dateien kompiliert wurden. Sie mussten mit einem Cross-Compiler kompiliert werden, der neuere Armmodule korrekt unterstützte. Der Compiler, den ich verwendete, erzeugte ausführbare Dateien, die nur auf einer Untergruppe von Arm-Geräten funktionieren würden. Das Problem war nicht mit den verschiedenen Versionen von Android.

0

SELinux ist standardmäßig auf Android 4.3 aktiviert, es soll jedoch "permissive" [0] sein. Möglicherweise hat Ihr Telefonanbieter strengere Regeln hinzugefügt.

[0] https://source.android.com/devices/tech/security/se-linux.html

+0

Dieses Problem trat bei der ersten Version von Jelly Bean auf, also vor dieser Änderung. Aber das ist eine interessante Lektüre. Ich habe 4.3 nicht viel benutzt. – corbin

2

Ich hatte diesen Fehler in einem anderen Kontext. Aus irgendeinem Grund verursacht es einen Fehler beim Versuch, den Ordner /tmp zu verwenden.

das ich einfach zu lösen:

mkdir tmp 
export TMPDIR=`pwd`/tmp 
+0

Was ist ** TMPDIR **? –