使用clang将Apache httpd编译为LLVM字节码

时间:2012-12-13 01:44:42

标签: llvm clang apache llvm-clang

我想使用 clang httpd 编译成LLVM字节码。首先,我尝试使用 gcc 进行编译,为此我做了以下操作:

./configure --prefix=/home/varun/apache/httpd/gcc --with-included-apr
make
sudo make install

它成功安装了!

现在,我尝试用clang编译它,我为此做了以下几点:

CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/apache/httpd/clang --with-included-apr
make   # didn't come to this step
sudo make install # didn't come to this step

而且,配置本身也失败了。我选择 -O4 ,因为我读到LLVM输出字节码如果你使用-O4或-emit-llvm作为CFLAGS(它们都不起作用)。

这是我得到的错误:

checking whether the C compiler works... no
configure: error: in `/home/varun/apache/httpd/httpd-2.4.3/srclib/apr':
configure: error: C compiler cannot create executables

这是否与链接器无法链接LLVM字节码文件有关?

3 个答案:

答案 0 :(得分:3)

[我知道这与链接步骤有关,但无法使工作正常进行。最后编译成功,所以我正在写自己的答案]

方法1(失败)

  1. 使用Synaptic Package Manager在我的系统上安装了clang。
  2. 安装了binutils-gold,因为需要将LLVMgold.so作为插件提供给链接器。但是对于这个安装的铿锵声,应该有黄金插件。
  3. 尝试使用此命令配置httpd:

    CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/work/httpd/build --with-included-apr
    

    这里,httpd需要--with-included-apr。 -O4是必需的,以便通过字节码进行编译。

    此配置步骤本身 失败 ,因为安装的clang没有正确的插件来启用链接器链接字节码对象文件。

    方法2(成功)

    1. 已安装binutils-gold。还获得了binutils的来源。
    2. 编译LLVM并使用binutils源代码进行编译,以便LLVM具有黄金插件。
    3. 编译LLVM,

      ../configure --with-binutils-include=/usr/src/binutils/binutils-2.22/include --enable-gold --prefix=/usr/local
      make
      sudo make install
      
      ln -s /usr/local/lib/LLVMgold.so /usr/lib/bdf-plugins/LLVMgold.so
      

      现在,编译 httpd

      CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/work/httpd/build --with-included-apr
      make
      sudo make install
      

答案 1 :(得分:1)

LLVM字节码是LLVM中使用的中间表示。它不能由任何机器执行。这就是配置脚本抱怨

的原因
C compiler cannot create executables.

不输出LLVM字节码。尝试使用其他优化级别。 (并且不要在-emit-llvm中使用CFLAGS

答案 2 :(得分:1)

我在这里回答了一个非常相似的问题:

Generate LLVM IR for httpd

对于大多数写得很好的项目来说,实际上很容易构建IR。

我们工具的无耻插件:

https://github.com/SRI-CSL/whole-program-llvm

祝你好运。