当前位置 : 主页 > 网络安全 > 测试自动化 >

构建自动化软件到LLVM位码

来源:互联网 收集:自由互联 发布时间:2021-06-19
我想使用autotools构建系统将软件编译成LLVM位码;也就是说,我希望最终获得的可执行文件是LLVM的位代码,而不是实际的机器代码. (目标是能够在整个程序中运行LLVM位码分析工具.) 我已经尝
我想使用autotools构建系统将软件编译成LLVM位码;也就是说,我希望最终获得的可执行文件是LLVM的位代码,而不是实际的机器代码.

(目标是能够在整个程序中运行LLVM位码分析工具.)

我已经尝试指定CC =“clang -emit-llvm -use-gold-plugins”和变体到配置脚本,没有用.总是出现了一些问题(例如,软件包构建了一个静态库,它被链接器拒绝).

在我看来,正确的方法是LLVM的位代码应该是一个交叉编译的目标.要设置为–host =,但没有这样的标准目标(即使有一个目标为Knuth的MMIX).

到目前为止,我已经使用了kludges,例如用CC =“clang -emit-llvm -use-gold-plugins”进行编译,并手动运行链接行(使用llvm-ld或llvm-link).这适用于简单的包,如grep.

我想要一个强大的方法,适用于大多数(如果不是全部)配置脚本,包括中间.a文件或中间目标.

有一些方法像 this.但对于简单的构建,中间静态库不被使用,那么你可以做一些更简单的事情.你需要的东西的列表是

> llvm,配置了金插件支持.参见this
cl
> dragonegg,如果你需要前端Fortran,去等等

关键是在编译时和链接时间之间启用“-flto”作为clang或dragonegg(前端).这是笨蛋:

CC = clang
CLINKER = clang
CFLAGS = -flto -c
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm

如果需要,请添加其他“-plugin-opt”选项以指定特定于llvm的代码选项:

-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.对我来说很好.

网友评论