Jestem nowicjuszem, który kłamie, więc prawdopodobnie robię coś głupiego. Ale spędziłem kilka godzin szukając rozwiązań, w tym przeszukując tutaj, gdzie nie znalazłem pytań adresujących -flto z pakietami dostarczanymi przez distro. Szczegóły tego opisu są specyficzne dla Fedory 18, ale mam podobne problemy w Ubuntu 13.04, więc problem nie jest specyficzny dla Fedory. To albo ja, albo klang.Optymalizacja czasu linku w klangie nie działa poprawnie w Fedorze 18
Problem: Próbuję skompilować prosty program do czatu z użyciem clang++ -flto
, aby uzyskać korzyści z optymalizacji czasu łącza. Bez fletu działa dobrze. Z -flto nie łączy się. Wywoływanie jak clang -flto -o hello hello.o -v
aby zobaczyć pełną linię poleceń łącznika, dostaję:
$ clang++ -flto -o hello hello.o -v
clang version 3.2 (tags/RELEASE_32/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../.. -L/lib -L/usr/lib -plugin /usr/bin/../lib/LLVMgold.so hello.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crtn.o
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error loading plugin
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error in plugin cleanup (ignored)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Nie wydają się być dwa problemy:
Clang ++ wywołuje łącznik jako
/usr/bin/ld
, a to nie jest łącznik złota. Fedora18 instaluje złoto jako/usr/bin/ld.gold
. Próbowałem utworzyć dowiązanie symboliczne od/usr/local/bin/ld
do/usr/bin/ld.gold
, sprawdziłem, czywhich ld
mówi/usr/local/bin/ld
, ale clang ++ nie używa tego. Wygląda na to, że jest on podłączony do/usr/bin/ld.clang ++ wywołał linker z
-plugin /usr/bin/../lib/LLVMgold.so
. To źle, ponieważ dystrybucja Clang umieszcza ją pod adresem/usr/lib64/llvm/LLVMgold.so
.
Próbowałem ręcznie wywoływania tę linię łącznikową powyżej z następujących poprawek:
wymienić
-plugin /usr/bin/../lib/LLVMgold.so
z-plugin /usr/lib64/llvm/LLVMgold.so
. Daje to komunikat o błędziehello.o: file not recognized: File format not recognized
. Tak więc nie-złoty linker wydaje się wiedzieć o wtyczkach, ale nie przyniesie plików .o, które zawierają kodek LLVM.Wymień
/usr/bin/ld
na/usr/bin/ld.gold
. To działa, generuje plik wykonywalny, który działa zgodnie z oczekiwaniami.Oba powyższe z
--plugin
zamiast-plugin
. Ta zmiana nie ma znaczenia.
Jaki jest najlepszy sposób dla kogoś, kto woli trzymać się pakietów dostarczanych przez system, aby użyć flang-flto? Mam nadzieję, że istnieje plik konfiguracyjny lub nieudokumentowane opcje lub zmienne środowiskowe, które pozwolą mi je zastąpić. Albo lepiej, że brakuje mi pakietu i "yum install ..." to naprawi.
Wolałbym nie wywoływać bezpośrednio linkera, ponieważ wtedy moje pliki makefile muszą znać obiekty systemowe i biblioteki, o których powinni wiedzieć (np. Crt1.o, crtbegin.o, crtend.o). Mogłabym też zbudować klang sam, ale nie widzę niczego w swoim skrypcie konfiguracyjnym, który pozwala mi skonfigurować ścieżkę łącznika i wtyczki.
Używam Fedory 18. Jedynymi pakietami niebędącymi dystrybucją na komputerze są google chrome i VMware Tools (jest to gość wewnątrz VMWare Fusion).Wersje odpowiednich pakietów Fedory (cały komputer „yum zaktualizowane” na dzień dzisiejszy 29-kwi-2013):
$ yum list --noplugins installed binutils* clang* llvm* gcc*
Installed Packages
binutils.x86_64 2.23.51.0.1-6.fc18 @updates
binutils-devel.x86_64 2.23.51.0.1-6.fc18 @updates
clang.x86_64 3.2-2.fc18 @updates
clang-devel.x86_64 3.2-2.fc18 @updates
clang-doc.noarch 3.2-2.fc18 @updates
gcc.x86_64 4.7.2-8.fc18 @fedora
gcc-c++.x86_64 4.7.2-8.fc18 @fedora
llvm.x86_64 3.2-2.fc18 @updates
llvm-libs.x86_64 3.2-2.fc18 @updates
Aby zaoszczędzić trochę czasu, jak widać, wygląda to w "lib", a nie "lib64". Dowiązaniem symbolicznym, które działało, było 'sudo ln -s /usr/lib64/llvm/LLVMgold.so/usr/lib/LLVMgold.so'. – Jerska