2016-07-26 16 views
5

Tôi đã sử dụng clang-3.5 để vui vẻ xây dựng các phiên bản bitcode của libl musl và sử dụng kết quả để tạo ra các tệp thi hành độc lập.clang-3.8 và trình biên dịch-rt vs libgcc

Những nỗ lực gần đây với clang-3.8 đã không được hạnh phúc. Dường như các bitcode clang-3.8 tạo sử dụng các chức năng quy định tại

compiler-rt/lib/builtins 

ví dụ điển hình của các chức năng tôi thấy ô nhiễm bitcode là mulxc3, mulsc3, và muldc3. Tôi có thể giải quyết vấn đề này bằng cách liên kết với libgcc hoặc thậm chí thay thế llvm nếu tôi có bất kỳ ý tưởng rõ ràng nào về điều đó. Mặc dù tôi muốn ngăn chặn vấn đề xảy ra ngay từ đầu.

Tôi đã thấy đề cập đến các cờ như rtlib=compiler-rt v.v. nhưng đã tìm thấy tài liệu quý giá về chủ đề này.

Vì vậy, đây là một số câu hỏi đơn giản.

  1. Có thể để ngăn chặn clang từ việc sử dụng compiler-rt/lib/builtins trong bitcode phát ra? Hoặc nếu không phải

  2. Có llvm tạo phiên bản libgcc mà tôi có thể sử dụng hay không. Trên thực tế tôi sẽ có thể xây dựng một phiên bản bitcode của nó, nhưng đó là ngoài điểm.

Thích nghe một số hướng dẫn về điều này.

Đã thêm 12/8/2016: Vì vậy, tôi sẽ minh họa các vấn đề của mình với quy trình cụ thể mà mọi người có thể sao chép nếu họ muốn hoặc nhiều khả năng chỉ ra nơi tôi đang ngu ngốc.

Vì vậy, bắt đầu bằng cách xem:

musllv

và làm theo các hướng dẫn trong README.to biên dịch (ở đây tôi đang sử dụng kêu vang-3.8 trên Ubuntu 14,04)

WLLVM_CONFIGURE_ONLY=1 CC=wllvm ./configure --target=LLVM --build=LLVM 
make 
cd lib 
extract-bc -b libc.a 

bạn sẽ cũng cần bitcode của một tệp thực thi đơn giản. Tôi sẽ sử dụng nweb.c ở đây.

wllvm nweb.c -o nweb 
extract-bc nweb 

Bây giờ chúng ta có thể làm những việc như:

clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb 

Quy trình này diễn ra trôi chảy cho vang-3.5 nhưng đối với vang-3.8 chúng tôi nhận được:

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) 

Vì vậy, như @ paul-Brannan chỉ ra chúng ta có thể thử

clang -static -nostdlib --rtlib=compiler-rt nweb.bc libc.a.bc crt1.o libc.a -o nweb 

Nhưng đây là nơi mà tôi có thể là ngu ngốc, bởi vì tôi nhận được:

clang-3.8: warning: argument unused during compilation: '--rtlib=compiler-rt' 

bất kể tôi có sử dụng nó làm cờ liên kết hay biên dịch hay không.

+0

Tôi không biết câu trả lời cho câu hỏi, nhưng tôi tin rằng báo cáo lỗi này là có liên quan: https://llvm.org/bugs/show_bug.cgi?id=16404 BTW, liên kết sử dụng --rtlib = trình biên dịch-rt giải quyết vấn đề liên kết của tôi đang tìm kiếm __muloti4, trong khi liên kết với libgcc thì không. –

+0

Cảm ơn bạn đã tip @ paul-brannan, trông 'can-o-wormish'. Tuy nhiên tôi dường như không có cảm giác midas. Tôi sẽ đăng một cuộc theo dõi để mọi người có thể sao chép vấn đề của tôi, và y tá tôi đến vùng đất hứa. –

+0

Tôi đang thêm điều này ở đây, bởi vì trong khi nó không trả lời câu hỏi của tôi nó cũng có vẻ có liên quan. [Xây dựng các tệp thi hành GNU miễn phí bằng tiếng kêu vang] (https://blogs.gentoo.org/gsoc2016-native-clang/2016/05/31/build-gnu-free-executables-with-clang/) –

Trả lời

0

OK vì vậy cuối cùng tôi đã xoay xở để thực hiện điều này. Tôi đã xây dựng llvm-3.8.1 cùng với dự án compiler-rt sử dụng wllvmwllvm++.

Một trong những sản phẩm xây dựng là libclang_rt.builtins-x86_64.a, và từ kho lưu trữ này tôi đã có thể trích xuất các mô-đun bitcode

libclang_rt.builtins-x86_64.bc

sử dụng lệnh: extract-bc -b libclang_rt.builtins-x86_64.a mô-đun bitcode này có định nghĩa cho những instrinsics pesky như __mulxc3, __mulsc3__muldc3.

Hallelujah!

Các vấn đề liên quan