2016-08-30 5 views
3

Problem: Ich muss gnutls zu Android Port in einer gemeinsam genutzten Bibliothek verwendet werden (sagen Bibliothek A) Ich verwende in meiner Android-Anwendung.Gemeinsame Bibliothek mit statischen gnutls Bibliothek hat Textverlagerungen

Was ich versucht habe: ich die make file für Openconnect geändert haben eine .a statische Bibliotheksdatei für gnutls und ihre Abhängigkeiten (libgmp, libnettle und libhogweed) zu erzeugen, habe ich sie statische Bibliotheken bauen in meinem und Android-Projekt verwiesen sie in der gemeinsam genutzten Bibliothek A.-Code baut und installiert in Ordnung, aber auf M + Geräte bekomme ich folgende Fehler zur Laufzeit:

java.lang.UnsatisfiedLinkError: dlopen failed: libA.so: has text relocations 

ich habe versucht, die -fPIC Flagge zu übergeben, wenn die statischen Bibliotheken bauen (.a-Dateien) und wenn ich die libA.so-Datei ohne Erfolg erstelle, sehe ich immer TEXTREL-Einträge in der libA.so-Datei. Ich bin mir sicher, dass dies auf die neuen statischen Bibliotheken zurückzuführen ist, da ich zuvor libA ohne Probleme verwendet habe. Andere Sache, die ich versuchte: versucht gnunls als eine gemeinsame Bibliothek zu bauen, die generierte libA.so hatte jetzt keine Textverlagerungen aber würde immer noch nicht zur Laufzeit laden, weil die gnutls so Dateien eine Version (zB libgnutls.so.3.0) und Android haben unterstützt keine versionierten Bibliotheken.

Spezifische Frage: Wie kann ich entweder: 1.Build gnutls als eine statische Bibliothek ohne Textverlagerungen oder 2. Erstellen Sie es als eine gemeinsame Bibliothek ohne Soname?

Edit: Ich sehe das gleiche question gefragt, auf der openconnect-Mailing-Liste, aber keine klare Möglichkeit, wie "die TEXTRELs im nativen Code zuerst zu beheben".

Ich habe andere Antworten mit Text Verlagerungen wie diese question und this Frage für Probleme gesehen, aber das hat nicht geholfen, da ich die neueste NDK zu bauen und das Bestehen den PIC-Flag bereits

+1

Mögliche Duplikat [libavcodec.so: hat Text Verlagerungen] (http://stackoverflow.com/questions/32346402/libavcodec-so-has-text-relocations) –

+0

Ich glaube nicht, dass es ein Duplikat ist, weil ich das neueste NDK verwende und auch das -fPIC-Flag zur Erstellung eines positionsunabhängigen Codes übergebe. – Nonos

+0

Es ist wirklich das selbe Problem wie von @RichardCritten erwähnt, schau mal im Abschnitt "Text Relocations (Erzwungen seit API 23)" von [dieser Seite] (http://android-developers.blogspot.ru/2016/06/android-changes-for-ndk-developers.html), obwohl das akzeptiert Antwort auf diese Frage ist nur ein Workaround, die eigentliche Sache ist es, die Bibliothek zu reparieren, aber das ist Bibliothek-spezifische (beginnend mit der Tatsache, dass Sie vier von ihnen kombiniert haben) und abhängig dant auf Optionen, die Sie verwenden, um es zu bauen. –

Antwort

0

Ich habe es endlich herausgefunden. Da Gnutls von Brennnessel und Gmp abhängig ist, während Brennnessel ebenfalls von gmp abhängt, musste ich gmp als eine gemeinsame Bibliothek und den Rest als statisch aufbauen. Da libgmp das einzige Gebäude ohne Sonames war, hatte ich kein Problem, es so zu bauen. Also das ist meine letzte Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libgmp 
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libgmp.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libhogweed 
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libhogweed.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libnettle 
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libnettle.a 
LOCAL_SHARED_LIBRARIES := libgmp 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libgnutls 
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libgnutls.a 
LOCAL_SHARED_LIBRARIES := libgmp 
LOCAL_STATIC_LIBRARIES := libhogweed libnettle 
include $(PREBUILT_STATIC_LIBRARY) 
1

Sie bin nicht laden Eine Bibliothek, für die Textverlagerungen erforderlich sind:

Beginnend mit API 23 dürfen freigegebene Objekte keine Textverlagerungen enthalten. Das heißt, der Code muss unverändert geladen werden und darf nicht geändert werden.

(source)

Antworten:

Wie kann ich bauen gnutls als eine statische Bibliothek ohne Text Verlagerungen?

-fPIC kann nicht alle Textverschiebung verhindern. Wenn Ihre Bibliothek Inline asm verwendet, kann der Compiler es in einigen Fällen nicht positionsunabhängig machen (PIC). Wenn Sie jedoch sicher sind, dass Ihre Bibliothek positionsunabhängig sein kann, kann es sich um ein Problem in Ihrer Build-Konfiguration handeln.

Wenn nicht, sollten Sie verhindern, dass Ihre Bibliothek Textverlagerungen verwendet. Glücklicherweise gibt es eine großartige Wiki-Seite, die erklärt, wie man das in Gentoo Wiki macht.

Wie kann ich es als eine gemeinsame Bibliothek ohne Soname bauen?

Sie können Ihren Soname einstellen mit: gcc -shared -Wl,-soname,your_soname.

+0

Es tut mir leid, aber diese Antwort gibt nur die Frage wieder ... Beachten Sie, dass ich das Problem in der Frage detailliert und dass ich verstehe, was die Symptome sind, aber die Antworten auf ähnliche Fragen nicht in meinem Fall, genauer gesagt ich gab an, dass ich mit -fPIC gebaut habe, was eine Textverschiebung verhindern sollte und dass ich das neueste NDK beim Aufbau der gemeinsam genutzten Bibliothek verwendet habe. – Nonos

+0

'-fPIC' kann nicht alle Textumsetzungen verhindern. Wenn Ihre Bibliothek "Inline-Asm" verwendet, kann der Compiler sie manchmal nicht als "PIC" definieren. Daher sollten Sie dies selbst beheben. Sehen Sie den Link von Gentoo, um zu sehen, wie es geht. –

+0

@Nonos Ich habe die Antwort aktualisiert. –

Verwandte Themen