【发布时间】:2016-11-30 13:17:57
【问题描述】:
我一直在使用clang-3.5 愉快地构建 musl libc 的位码版本和
使用结果生成漂亮的独立可执行文件。
最近对clang-3.8 的尝试并不那么开心。看起来
位码clang-3.8 生成使用在
compiler-rt/lib/builtins
我发现污染位码的函数的典型示例是mulxc3、mulsc3 和muldc3。我可以通过链接libgcc 来解决这个问题,如果我清楚地知道那是什么的话,甚至可以使用 llvm 替代方案。虽然我宁愿首先防止问题发生。
我看到过提到 rtlib=compiler-rt 等标志,但发现关于该主题的宝贵文档很少。
所以这里有一些简单的问题。
是否可以防止
clang使用compiler-rt/lib/builtins在发出的位码中?或者如果不是llvm 是否生成我可以使用的 libgcc 版本。其实我会 可能会构建它的位码版本,但这不是重点。
很想听听这方面的指导。
添加于 2016 年 12 月 8 日:所以我将说明我的问题与一个特定的工作流程, 人们可以根据自己的意愿进行复制,或者更有可能的是,指出我在哪里愚蠢。
所以从检查开始:
并按照 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
您还需要一个简单可执行文件的位码。我将在这里使用 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'
不管我是用它作为链接还是编译标志。
【问题讨论】:
-
我不知道问题的答案,但我相信这个错误报告是相关的:llvm.org/bugs/show_bug.cgi?id=16404 BTW,使用 --rtlib=compiler-rt 链接解决了我寻找 __muloti4 的链接问题,而与 libgcc 链接没有。
-
感谢@paul-brannan 的提示,看起来'can-o-wormish'。仍然我似乎没有迈达斯的感觉。我将发布后续消息,以便人们可以复制我的问题,并照顾我到应许之地。
-
我在这里添加这个,因为虽然它没有回答我的问题,但它似乎也很相关。 Build GNU-free executables with clang
标签: clang llvm llvm-clang llvm-ir