奥卡姆传奇
razor的Python项目详细描述
说明
OCCAM是整个程序的部分 用于llvm位码的求值器,其目的是解除程序和 在特定部署上下文中运行的共享/静态库。
occam架构
occam体系结构
先决条件
occam目前在linux、os x和freebsd上运行良好。这取决于 安装LLVM。occam当前需要llvm-5.0。你也会 需要google protobuffer编译器protoc和相应的 Pythonpackage。
如果需要生成应用程序位代码,则需要安装 WLLVM,从PIP package或github repository。
测试线束还需要 lit和FileCheck。 FileCheck通常可以在llvm的二进制目录中找到 安装,但是如果您自己构建,则可能需要阅读 this.提示:生成 生成它,但不安装它(请尝试locate FileCheck,然后 复制到bin目录)。
ubuntu 14.04的详细配置说明可以从 bootstrap.sh 以及每个分支的travis ci脚本 .travis.yml
建造和安装
设置occam库的存储位置:
export OCCAM_HOME={path to location in your home directory}
如果不是标准配置,请指向您的llvm位置:
export LLVM_HOME=/usr/local/llvm-5.0 export LLVM_CONFIG=llvm-config-5.0
设置系统库(包括google协议缓冲区)的位置 位置:
export LD_FLAGS='-L/usr/local/lib'
克隆、构建和安装occam,使用:
git clone --recurse-submodules https://github.com/SRI-CSL/OCCAM.git make make install make test
使用occam
您可以通过设置 以下变量:
export OCCAM_LOGFILE={absolute path to log location} export OCCAM_LOGLEVEL={INFO, WARNING, or ERROR}
使用剃须刀
razor是一个pip包,它依赖于与 occam,因此您应该首先按照说明构建并安装occam。 上面。razor提供命令行工具slash。你也可以 可以从这个存储库安装razor,也可以只执行a
pip install razor
要从此存储库安装可编辑版本,请执行以下操作:
make -f Makefile develop
这可能需要sudo特权。现在您可以使用slash:
slash [--work-dir=<dir>] [--force] [--no-strip] [--intra-spec-policy=<type>] [--inter-spec-policy=<type>] <manifest>
其中
type=none|aggressive|nonrec-aggressive
值none将阻止任何模块间或模块内 专业化。值aggressive专门用于调用(如果有) 参数是常数。值nonrec-aggressive专门用于 如果函数是非递归的且任何参数都是常量,则调用。
要正确运行slash,请调用llvm工具,如opt和 clang++。这些应该在您的PATH中提供,并且是 当前支持的版本(5.0)。像wllvm,slash,将支付 注意环境变量LLVM_OPT_NAME和 LLVM_CXX_NAME如果这些工具的版本被修饰为 后缀。
清单(O)
slash的清单应该是有效的json。以下键具有 含义:
- main:包含main项的位码模块的路径 要点
- modules:指向所需其他位代码模块的路径列表。
- binary:所需可执行文件的名称。
- native_libs:标志列表(-lm,-lc,-lpthread) 或指向本机对象的路径(.o,.a,.so,.dylib)
- ldflags:链接器标志的列表,例如--static, --nostdlib
- args:希望在main中专门化的参数列表 总共main。
- constraints:一个由正整数组成的列表,后跟 一些字符串。数字表示预期的数字 专门程序将接收的参数,以及 字符串是原始程序的专用参数。
注意args和constraints是互斥的。如果你 用一个你不应该用另一个。
例如,(请参见examples/linux/apache),以预实现apache:
{ "main" : "httpd.bc" , "binary" : "httpd_slashed" , "modules" : ["libapr-1.so.bc", "libaprutil-1.so.bc", "libpcre.so.bc"] , "native_libs" : ["-lcrypt", "-ldl", "-lpthread"] , "args" : ["-d", "/var/www"] , "name" : "httpd" }
另一个例子(参见examples/linux/musl_nweb)专门针对 nweb与musl libc.c:
{ "main" : "nweb.o.bc" , "binary" : "nweb_razor" , "modules" : ["libc.a.bc"] , "native_libs" : ["crt1.o", "libc.a"] , "ldflags" : ["-static", "-nostdlib"] , "args" : ["8181", "./root"] , "name" : "nweb" }
第三个例子(见examples/portfolio/tree,说明了使用 部分专门化参数的constraints字段的 tree实用程序。
{ "main" : "tree.bc" , "binary" : "tree" , "modules" : [] , "native_libs" : [] , "ldflags" : [ "-O2" ] , "name" : "tree" , "constraints" : ["1", "tree", "-J", "-h"] }
专用程序将以json表示法输出其结果,即 将包括一个人类可读的大小字段。专业课程 需要一个额外的参数,目录或另一个标志 输出当前工作目录的内容。
这份材料是根据国家科学基金会资助的工作编写的 基金会 ACI-1440800。 任何意见、调查结果、结论或建议 这些材料是作者的,不一定反映 国家科学基金会的观点。