【问题标题】:clang-3.8 and compiler-rt vs libgccclang-3.8 和 compiler-rt vs libgcc
【发布时间】:2016-11-30 13:17:57
【问题描述】:

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

最近对clang-3.8 的尝试并不那么开心。看起来 位码clang-3.8 生成使用在

中定义的函数
compiler-rt/lib/builtins

我发现污染位码的函数的典型示例是mulxc3mulsc3muldc3。我可以通过链接libgcc 来解决这个问题,如果我清楚地知道那是什么的话,甚至可以使用 llvm 替代方案。虽然我宁愿首先防止问题发生。

我看到过提到 rtlib=compiler-rt 等标志,但发现关于该主题的宝贵文档很少。

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

  1. 是否可以防止clang 使用compiler-rt/lib/builtins 在发出的位码中?或者如果不是

  2. llvm 是否生成我可以使用的 libgcc 版本。其实我会 可能会构建它的位码版本,但这不是重点。

很想听听这方面的指导。

添加于 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

您还需要一个简单可执行文件的位码。我将在这里使用 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


【解决方案1】:

好的,所以我终于设法在这方面取得了进展。我使用wllvmwllvm++ 构建了llvm-3.8.1compiler-rt 项目。

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

libclang_rt.builtins-x86_64.bc

使用命令: extract-bc -b libclang_rt.builtins-x86_64.a 这个位码模块有那些讨厌的内在定义,比如 __mulxc3__mulsc3__muldc3

哈利路亚!

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2016-09-04
    • 2023-03-19
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多