我想使用 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字节码文件有关?
答案 0 :(得分:3)
[我知道这与链接步骤有关,但无法使工作正常进行。最后编译成功,所以我正在写自己的答案]
方法1(失败)
尝试使用此命令配置httpd:
CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/work/httpd/build --with-included-apr
这里,httpd需要--with-included-apr。 -O4是必需的,以便通过字节码进行编译。
此配置步骤本身 失败 ,因为安装的clang没有正确的插件来启用链接器链接字节码对象文件。
方法2(成功)
编译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)
我在这里回答了一个非常相似的问题:
对于大多数写得很好的项目来说,实际上很容易构建IR。
我们工具的无耻插件:
祝你好运。