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.
Có thể để ngăn chặn
clang
từ việc sử dụngcompiler-rt/lib/builtins
trong bitcode phát ra? Hoặc nếu không phảiCó 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:
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.
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. –
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. –
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/) –