clang-3.8和compiler-rt vs libgcc

Ian*_*son 6 llvm clang llvm-clang llvm-ir

我一直clang-3.5在愉快地构建bintode版本的musl libc,并使用结果生成漂亮的独立可执行文件.

最近的尝试并clang-3.8没有那么开心.似乎bitcode clang-3.8生成了定义的使用函数

compiler-rt/lib/builtins
Run Code Online (Sandbox Code Playgroud)

功能我觉得污染位码典型的例子是mulxc3,mulsc3muldc3.libgcc如果我对这是什么有任何明确的想法,我可以通过链接,甚至是llvm替代方案来解决这个问题.虽然我宁愿首先防止问题发生.

我已经看到过像rtlib=compiler-rt等标志的提及,但是已经找到了关于这个主题的珍贵文献.

所以这里有一些简单的问题.

  1. 是否有可能为防止clang从使用compiler-rt/lib/builtins 中发出的位码?或者如果没有

  2. llvm是否会生成我可以使用的libgcc版本.实际上我可能会建立一个bitcode版本,但这是重点.

喜欢听到一些关于此的指导.

2016年12月8日新增:所以我将通过特定工作流程来说明我的问题,如果他们愿意,人们可以复制,或者更有可能只指出我愚蠢的地方.

所以先看看:

musllv

并按照README.to编译中的说明进行操作(这里我在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
Run Code Online (Sandbox Code Playgroud)

你还需要一个简单的可执行文件的bitcode.我将在这里使用nweb.c.

 wllvm nweb.c -o nweb
 extract-bc nweb
Run Code Online (Sandbox Code Playgroud)

现在我们可以做以下事情:

clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
Run Code Online (Sandbox Code Playgroud)

对于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)
Run Code Online (Sandbox Code Playgroud)

所以@ paul-brannan指出我们可以试试

clang -static -nostdlib --rtlib=compiler-rt nweb.bc libc.a.bc crt1.o libc.a -o nweb
Run Code Online (Sandbox Code Playgroud)

但这是我可能是愚蠢的地方,因为我得到:

clang-3.8: warning: argument unused during compilation: '--rtlib=compiler-rt'
Run Code Online (Sandbox Code Playgroud)

无论我是否将其用作链接或编译标志.

Ian*_*son 0

好的,我终于在这方面取得了进展。我使用和llvm-3.8.1与项目一起构建。compiler-rtwllvmwllvm++

其中一个构建产品是libclang_rt.builtins-x86_64.a,从这个存档中我能够提取位码模块

libclang_rt.builtins-x86_64.bc

使用命令: extract-bc -b libclang_rt.builtins-x86_64.a 此位码模块具有那些讨厌的内联函数的定义 __mulxc3,例如__mulsc3、 和__muldc3

哈利路亚!