我想使用autotools构建系统将软件编译为LLVM bitcode;也就是说,我希望最后获得的可执行文件是LLVM bitcode,而不是实际的机器代码。
(目标是能够在整个程序上运行LLVM bitcode分析工具。)
我已尝试为CC="clang -emit-llvm -use-gold-plugins"
脚本指定configure
和变体,但无济于事。总会出现问题(例如,包构建.a
静态库,链接器会拒绝这些库。
在我看来,正确的方法是LLVM bitcode应该是一个交叉编译目标。使用--host=
进行设置,但没有这样的标准目标(即使Knuth的MMIX有目标)。
到目前为止,我已经使用了kludges,例如使用CC="clang -emit-llvm -use-gold-plugins"
进行编译并手动运行链接行(使用llvm-ld
或llvm-link
)。这适用于简单的包,例如grep
。
我想要一个健壮且适用于大多数(如果不是全部)配置脚本的方法,包括存在中间.a
文件或中间目标时。
答案 0 :(得分:3)
有一些方法,如this。但对于不使用中间静态库的简单构建,您可以做一些更简单的事情。您需要的东西是
关键是在编译时和链接时为clang或dragonegg(前端)启用'-flto'。 clang是直截了当的:
CC = clang
CLINKER = clang
CFLAGS = -flto -c
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm
如果需要,请添加额外的'-plugin-opt'选项以指定llvm特定的codegen选项:
-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim
转储的整个问题字节码将与最终的可执行文件一起使用。
使用dragonegg时还需要另外两件事。
首先,dragonegg不知道llvm gold插件的位置,需要在链接器标志中指定,如-Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...
其次,dragonegg只能转储IR而不是字节码。您需要一个用于此目的的包装脚本。我创建了一个here。对我来说很好。