2013-04-30 48 views
14

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 đề:

  1. 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ằng which 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.

  2. 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ỗi hello.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 

Trả lời

7

Có một tiện ích alternatives trong Fedora - nó cho phép để subtitute một mối liên kết với nhau trên hệ thống mức:

$ sudo alternatives --display ld 
ld - status is auto. 
link currently points to /usr/bin/ld.bfd 
/usr/bin/ld.bfd - priority 50 
/usr/bin/ld.gold - priority 30 
Current `best' version is /usr/bin/ld.bfd. 
$ sudo alternatives --set ld /usr/bin/ld.gold 

Về LLVMgold.so vị trí mà bạn chỉ có thể báo cáo một lỗi trong Fedora Bugzilla, kể từ khi con đường được tích hợp sẵn trong nguồn kêu vang:

lib/driver/Tools.cpp: std :: string Plugin = ToolChain.getDrive r(). Dir + "/../lib/LLVMgold.so";

Các chàng Fedora có thể áp dụng bản vá cho gói nguồn của Clang hoặc tạo liên kết tượng trưng cho LLVMgold.so. Không có thay đổi nào ngay cả trong Fedora 20.

+5

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