Tôi là một người mới đến kêu vang, vì vậy có khả năng tôi đang làm điều gì đó ngớ ngẩn. Nhưng tôi đã dành vài giờ tìm kiếm các giải pháp, bao gồm tìm kiếm ở đây, nơi tôi chưa tìm thấy câu hỏi giải quyết -flto với các gói được cung cấp phân phối. Các chi tiết của mô tả này là cụ thể cho Fedora 18, nhưng tôi có vấn đề tương tự trên Ubuntu 13.04, do đó, vấn đề không phải là cụ thể cho Fedora. Đó là tôi hoặc tiếng kêu.Clang liên kết tối ưu hóa thời gian không hoạt động đúng trên Fedora 18
Sự cố: Tôi đang cố gắng biên dịch chương trình hello-world đơn giản bằng cách sử dụng clang++ -flto
để nhận được lợi ích của tối ưu hóa thời gian liên kết. Không có -flto nó hoạt động tốt. Với -flto nó không liên kết. Gọi như clang -flto -o hello hello.o -v
để xem dòng lệnh mối liên kết đầy đủ, tôi nhận được:
$ 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)
Dường như có hai vấn đề:
kêu vang ++ gọi mối liên kết như
/usr/bin/ld
, và đó không phải là mối liên kết vàng. Fedora18 cài đặt vàng là/usr/bin/ld.gold
. Tôi đã thử tạo một liên kết tượng trưng từ/usr/local/bin/ld
đến/usr/bin/ld.gold
, xác minh rằngwhich ld
nói/usr/local/bin/ld
, nhưng clang ++ không sử dụng điều đó. Nó dường như được hardwired đến/usr/bin/ld.clang ++ đã gọi trình liên kết với
-plugin /usr/bin/../lib/LLVMgold.so
. Đó là sai, vì sự phân bố của clarin Fedora đặt nó tại/usr/lib64/llvm/LLVMgold.so
.
Tôi đã thử bằng tay gọi là dòng liên kết ở trên với các tinh chỉnh như sau:
Thay
-plugin /usr/bin/../lib/LLVMgold.so
với-plugin /usr/lib64/llvm/LLVMgold.so
. Điều này mang lại thông báo lỗihello.o: file not recognized: File format not recognized
. Vì vậy, các liên kết không vàng dường như biết về plugins nhưng sẽ không lấy của. Mà có chứa bitcoin LLVM.Thay thế
/usr/bin/ld
bằng/usr/bin/ld.gold
. Công trình này, tạo ra một tệp thực thi chạy như mong đợi.Cả hai bên trên đều có
--plugin
thay vì-plugin
. Sự thay đổi này không có sự khác biệt.
Vậy cách nào tốt nhất cho ai đó thích gắn bó với các gói do hệ thống cung cấp để sử dụng clang -flto? Tôi hy vọng có một tập tin cấu hình, hoặc tùy chọn không có giấy tờ hoặc các biến môi trường mà sẽ cho phép tôi ghi đè lên những. Hoặc tốt hơn, rằng tôi đang thiếu một gói và một "yum install ..." sẽ sửa nó.
Tôi không muốn gọi trình liên kết trực tiếp, vì vậy các tệp makefiles của tôi cần biết các đối tượng hệ thống và thư viện mà chúng nên không biết (ví dụ: crt1.o, crtbegin.o, crtend.o). Tôi cũng có thể xây dựng bản thân mình, nhưng tôi không thấy bất cứ điều gì trong kịch bản cấu hình của nó cho phép tôi định cấu hình đường dẫn của trình liên kết và plugin.
Tôi đang chạy Fedora 18. Các gói không phân phối duy nhất trên máy tính là google chrome và VMware Tools (đó là khách trong VMWare Fusion).Phiên bản của gói Fedora có liên quan (toàn bộ máy tính đang "yum cập nhật" như của ngày hôm nay, 29-Apr-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
Chỉ để tiết kiệm thời gian, như bạn thấy, nó đang tìm trong 'lib', không phải 'lib64'. Liên kết tượng trưng hoạt động với tôi là 'sudo ln -s /usr/lib64/llvm/LLVMgold.so/usr/lib/LLVMgold.so'. – Jerska