Ich habe clang-3.5
verwendet, um glücklich zu bauen Bitcode-Versionen von Musl libc und verwenden Sie das Ergebnis, um schöne eigenständige ausführbare Dateien zu produzieren.clang-3.8 und compiler-rt vs libgcc
Jüngste Versuche mit clang-3.8
nicht so glücklich gewesen. Es scheint, dass die Bitcode clang-3.8
erzeugt Funktionen in
compiler-rt/lib/builtins
Typische Beispiele für Funktionen definiert verwendet finde ich die Bitcode verschmutzen mulxc3
, mulsc3
und muldc3
. Ich kann das lösen, indem ich gegen libgcc
oder sogar die llvm Alternative verbinde, wenn ich eine klare Vorstellung davon hatte, was das war. Obwohl ich das Problem lieber verhindern würde.
Ich habe erwähnt Fahnen wie rtlib=compiler-rt
usw. gesehen, haben aber sehr wenig Dokumentation zu diesem Thema gefunden.
So, hier sind ein paar einfache Fragen.
Ist es möglich, zu verhindern
clang
im emittierten Bitcode diecompiler-rt/lib/builtins
verwenden? Oder wenn nichtHat llvm eine Version von libgcc produzieren, die ich verwenden könnte. Eigentlich würde ich wahrscheinlich eine Bitcode-Version davon bauen, aber das ist neben dem Punkt.
Liebe, einige Hinweise zu diesem Thema zu hören.
am 2016.12.08: Also werde ich meine Probleme mit einem bestimmten Workflow veranschaulicht, die Menschen reproduzieren können, wenn sie wollen, oder, was wahrscheinlicher ist, nur darauf hinweisen, wo ich dumm bin zu sein.
starten Also, indem Sie aus:
und die Anweisungen in der README.to folgen kompilieren (hier verwende ich Klirren-3.8 auf Ubuntu 14,04)
WLLVM_CONFIGURE_ONLY=1 CC=wllvm ./configure --target=LLVM --build=LLVM
make
cd lib
extract-bc -b libc.a
werden Sie benötige auch den Bitcode einer einfachen ausführbaren Datei. Ich werde nweb.c hier verwenden.
wllvm nweb.c -o nweb
extract-bc nweb
Jetzt können wir Dinge wie:
clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
Dieser Workflow reibungslos verläuft für Klirren-3.5 aber für Klirren-3.8 erhalten wir:
clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
/tmp/libc-f734a3.o: In function `cpowl':
libc.a.bc:(.text+0xbb9a): undefined reference to `__mulxc3'
/tmp/libc-f734a3.o: In function `cpowf':
libc.a.bc:(.text+0x38f7d): undefined reference to `__mulsc3'
/tmp/libc-f734a3.o: In function `csqrt':
libc.a.bc:(.text+0x78fc3): undefined reference to `__muldc3'
/tmp/libc-f734a3.o: In function `cpow':
libc.a.bc:(.text+0xafafc): undefined reference to `__muldc3'
clang-3.8: error: linker command failed with exit code 1 (use -v to seeinvocation)
So wie @ paul-brannan weist darauf hin, wir
clang -static -nostdlib --rtlib=compiler-rt nweb.bc libc.a.bc crt1.o libc.a -o nweb
könnten versuchen, aber das ist, wo ich wohl dumm bin zu sein, weil ich:
clang-3.8: warning: argument unused during compilation: '--rtlib=compiler-rt'
Unabhängig davon, ob ich es als Linking oder Compiling-Flag verwende.
Ich weiß nicht die Antwort auf die Frage, aber ich glaube, dass dieser Fehlerbericht relevant ist: https://llvm.org/bugs/show_bug.cgi?id=16404 BTW, Verknüpfung mit --rtlib = Compiler-RT löste meine Linking-Probleme auf der Suche nach __muloti4, während die Verbindung mit libgcc nicht funktioniert. –
Danke für den Tipp @ Paul-Brannan, sieht "Can-o-Wormish". Trotzdem scheint mir die Midas-Note nicht zu sein. Ich werde ein Follow-up veröffentlichen, so dass die Leute mein Problem duplizieren und mich in das gelobte Land bringen können. –
Ich füge das hier hinzu, denn obwohl es meine Frage nicht beantwortet, scheint es auch relevant zu sein. [Erzeuge GNU-freie ausführbare Dateien mit Klängen] (https://blogs.gentoo.org/gsoc2016-native-clang/2016/05/31/build-gnu-free-executables-with-clang/) –