我一直在使用clang-3.5
来愉快地构建musl libc的bitcode版本
使用结果生成漂亮的独立可执行文件。
最近对clang-3.8
的尝试并不那么开心。看起来
bitcode clang-3.8
生成
compiler-rt/lib/builtins
我发现污染bitcode的函数的典型示例是mulxc3
,mulsc3
和muldc3
。如果我对这是什么有任何明确的想法,我可以通过链接libgcc
,甚至是llvm替代方案来解决这个问题。虽然我宁愿首先防止问题发生。
我已经看到像rtlib=compiler-rt
等标志的提及,但是在这个主题上找到了很少的文档。
所以这里有一些简单的问题。
是否可以阻止clang
使用compiler-rt/lib/builtins
在发射的bitcode?或者如果不是
llvm是否会生成我可以使用的libgcc版本。其实我会的 可能会构建一个bitcode版本,但除此之外。
喜欢听到有关此事的指导。
已于2016年12月8日添加:所以我将通过特定的工作流程说明我的问题 人们可以复制,如果他们愿意,或者更有可能只是指出我在哪里愚蠢。
首先退房:
并按照README中的说明编译(这里我在ubuntu 14.04上使用clang-3.8)
WLLVM_CONFIGURE_ONLY=1 CC=wllvm ./configure --target=LLVM --build=LLVM
make
cd lib
extract-bc -b libc.a
您还需要一个简单可执行文件的bitcode。我将在这里使用nweb.c。
wllvm nweb.c -o nweb
extract-bc nweb
现在我们可以做以下事情:
clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
对于clang-3.5,此工作流程顺利进行,但对于clang-3.8,我们得到:
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)
因为@ paul-brannan指出我们可以尝试
clang -static -nostdlib --rtlib=compiler-rt nweb.bc libc.a.bc crt1.o libc.a -o nweb
但这可能是我愚蠢的地方,因为我得到了:
clang-3.8: warning: argument unused during compilation: '--rtlib=compiler-rt'
无论我是否将其用作链接或编译标记。
答案 0 :(得分:0)
好的,所以我终于在这方面取得了进展。我使用llvm-3.8.1
和compiler-rt
与wllvm
项目一起构建了wllvm++
。
其中一个构建产品是libclang_rt.builtins-x86_64.a
,
从这个档案中我能够提取bitcode模块
libclang_rt.builtins-x86_64.bc
使用命令:
extract-bc -b libclang_rt.builtins-x86_64.a
这个bitcode模块定义了那些讨厌的instrinsics
__mulxc3
,__mulsc3
和__muldc3
。
哈利路亚!