2016-03-16 4 views
25

Wenn ich Android kompilieren bin 5.1.1, bekomme ich Dutzende von Fehlern wie folgt aus:Gebäude Android aus Quellen: nicht unterstützte reloc 43

... 
... 
... 
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43 
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43 
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43 
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43 

und das Make-Prozess versagt schließlich:

clang: error: linker command failed with exit code 1 (use -v to see invocation) 
build/core/host_shared_library_internal.mk:44: recipe for target 'out/host/linux-x86/obj32/lib/libnativehelper.so' failed 
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1 

Ich habe versucht, Quellen mit und ohne Klang und mit verschiedenen Versionen von Klang zu bauen. Aber in neueren Zweigen ist der Klang eine Voraussetzung, und ohne ihn beginnt der Klang nicht.

Was könnte falsch sein?

Antwort

20

Man sollte diesen Patch anwenden, um die Dinge arbeiten https://android-review.googlesource.com/#/c/223100/

öffnen build/core/clang/HOST_x86_common.mk Datei in Ihrem Android-Quellcode-Verzeichnis mit einigen Editor fügen Sie diese Zeilen zu erhalten, wie in diesem

link erwähnt

Für Android Lollipop oder einer früheren Version, achten Sie darauf, -no-integrated-as während der Anwendung dieses Patches zu halten. Stellen Sie sicher, dass die Zeilenfortsetzungen korrekt sind (\ am Ende jeder Zeile mit Ausnahme der letzten Zeile).

Aber -no-integrated-as wird in Marshmallow entfernt.

+0

danke für den Link zum Patch, ich habe git cherry-pick verwendet und es scheint, es funktioniert OK (der Build ist noch in Arbeit und es war nur einer der Fehler, die ich beheben musste ... Warten auf den nächsten ...) – Mixaz

+0

Es funktionierte für mich zu diesem Zeitpunkt. – mysticTot

+0

funktioniert in der Tat, thx – Mixaz

2

Bauen Sie auf Arch Linux? Ich habe das gleiche Problem seit heute. Meine vorherigen Builds waren vor 3 Tagen und alles war in Ordnung. Heute scheitern alle.

Ich sehe das Admin einige Pakete aktualisiert vor 2 Tagen, vor allem diese

[2016-03-16 15:29] [ALPM] upgraded glibc (2.22-3 -> 2.23-1) 
[2016-03-16 15:29] [ALPM] upgraded lib32-glibc (2.22-3.1 -> 2.23-1) 
[2016-03-16 15:29] [ALPM] upgraded lib32-gcc-libs (5.3.0-3 -> 5.3.0-5) 
[2016-03-16 15:29] [ALPM] upgraded gcc-libs-multilib (5.3.0-3 -> 5.3.0-5) 
[2016-03-16 15:29] [ALPM] upgraded libcap (2.24-2 -> 2.25-1) 
[2016-03-16 15:29] [ALPM] upgraded binutils (2.25.1-3 -> 2.26-3) 
[2016-03-16 15:29] [ALPM] upgraded gcc-multilib (5.3.0-3 -> 5.3.0-5) 
[2016-03-16 15:29] [ALPM] upgraded libcups (2.1.2-3 -> 2.1.3-1) 

binutils der Täter sein könnte? (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=808206)

auch https://groups.google.com/d/msg/android-x86/U1XpL0tUpqw/y4W3wRCdJgAJ sehen ...

+0

Also hast du es irgendwie repariert? Ich habe das gleiche Problem mit Lollipop auf Arch in letzter Zeit. – Ov3r1oad

+0

Ich bin auch auf diesen debian bugreport gestoßen: * Dies würde mit gcc-5 und mit gcc-4.9 passieren. Downgrade libc6 würde es beheben. Nach einigem Herumspielen wurde mir klar, dass ein Upgrade auf binutils = 2.25.90.20151209-1 (aktuell aktuell in sid) das Problem behebt. I.e. Mit der neuesten libc6 und den neuesten binutils-Paketen funktionieren die Dinge. * Mein Build-System ist ein Ubuntu-16.10-Container auf einem Arch-Linux-Host und verwendet keine der betroffenen Versionen. Aber das Android-Build-System wählt seinen Linker aus seinem eigenen vorgefertigten Verzeichnis (gcc 4.6, glibc 2.11). ** Also: Wie können wir die systemweiten Build-Tools mit Android verwenden? ** –

+0

Wie ich die Idee verstehe, kann die Verwendung von Docker bei der Einstellung der Build-Zeit-Umgebung helfen: https://github.com/justfortherec/fairphone2-build- env Ich habe es selbst nicht benutzt, aber wahrscheinlich werde ich es versuchen, wegen der endlosen Anzahl von Fehlern, die FP2 Android von der Quelle aufbauen, was ein fehlerfreier Prozess sein sollte. Aber ich bin nicht überrascht, da ich bereits Probleme hatte, CM auf Arch Linux zu erstellen, und dann habe ich verstanden, dass ich das nächste Mal eine empfohlene Umgebung (Ubuntu) einbauen werde, aber es scheint nicht genug zu sein. Also ist der ** Docker ** unsere Zukunft? ;) – Mixaz

3

Als harte Abhilfe, die ich nur vorkompilierte Linker mit Soft-Link auf /usr/bin/ld.gold ersetzt. Es wurde hier beschrieben: https://bbs.archlinux.org/viewtopic.php?id=209698.

+0

Funktioniert für mich, danke! (Ich baue cm12.1, Lollipop, auf Arch Linux) –

+1

funktioniert bei mir nicht: ubuntu 16.04, kompilieren Android 5.1.1_r6. – Ezio

21

Es mir funktioniert:
in Datei /art/build/Android.common_build.mk erfahren Sie:

# Host. 
ART_HOST_CLANG := false 
ifneq ($(WITHOUT_HOST_CLANG),true) 
    # By default, host builds use clang for better warnings. 
    ART_HOST_CLANG := true 
endif 

Änderung:

# Host. 
ART_HOST_CLANG := false 
ifeq ($(WITHOUT_HOST_CLANG),false) 
    # By default, host builds use clang for better warnings. 
    ART_HOST_CLANG := true 
endif 

Wenn es immer noch nicht funktioniert, versuchen Sie dies in Ihrem Android-Root-Pfad: cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

+6

"cp ld.gold" funktioniert für mich. Danke vielmals. –

+0

Makefile-Wechsel ist Gold! toller Fund –

+0

FWIW, ich hatte den gleichen Fehler beim Erstellen von libcxx und libcxxabi. Kopieren funktioniert nicht für mich (ich habe ".../ld nicht gefunden (vielleicht ist ld nicht installiert), aber soft-linking tut (keine Ahnung warum). – autra

4

Probleme kommt von einer inkompatiblen Änderung in binutils: einige sectio n wurden hinzugefügt. Einige Build-Plattform haben die neuen binutils und Android Build-Baum haben alte. Der Fehler kommt von der Definition der Aufrufvariablen. Diese sagen nicht, dass clang die bereitgestellte Build-Kette verwenden soll. Dann verwendet clang die native Build-Plattform binutils (hier/usr/bin/als stattdessen die Prebuiltts als). Dann impliziert das Fixieren das Patch, auf das mysticTot zeigt, und dann das Entfernen aller von der Toolchain erzeugten Binaries (je nachdem, wo der Fehler auftaucht, könnte sich dies ändern, aber das Entfernen aller STATIC_LIBRARIES/SHARED_LIBRARIES/EXECUTABLES usw. outs in out tree sollte es tun). Entfernen Sie auch den Cache-Cache (da er .o speichert) und erstellen Sie ihn anschließend neu. Die von Ov3r1oad bereitgestellte Korrektur, die darin besteht, die vorgefertigte Toolchain ld durch die native ld zu ersetzen, ist keine Lösung, sondern nur ein Workaround und könnte gefährlich sein (die Mischbereichsnummer ist nicht gut). Hoffe, es wird helfen.