奥卡姆传奇

razor的Python项目详细描述


PyPI versionBuild Status

说明

OCCAM是整个程序的部分 用于llvm位码的求值器,其目的是解除程序和 在特定部署上下文中运行的共享/静态库。

occam架构

OCCAM architecture

occam体系结构

先决条件

occam目前在linux、os x和freebsd上运行良好。这取决于 安装LLVM。occam当前需要llvm-5.0。你也会 需要google protobuffer编译器protoc和相应的 Pythonpackage

如果需要生成应用程序位代码,则需要安装 WLLVM,从PIP package或github repository

测试线束还需要 litFileCheckFileCheck通常可以在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工具,如optclang++。这些应该在您的PATH中提供,并且是 当前支持的版本(5.0)。像wllvmslash,将支付 注意环境变量LLVM_OPT_NAMELLVM_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:一个由正整数组成的列表,后跟 一些字符串。数字表示预期的数字 专门程序将接收的参数,以及 字符串是原始程序的专用参数。

注意argsconstraints是互斥的。如果你 用一个你不应该用另一个。

例如,(请参见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)专门针对 nwebmusl 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。 任何意见、调查结果、结论或建议 这些材料是作者的,不一定反映 国家科学基金会的观点。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何向xsi:nil元素添加另一个属性?   Java抽象泛型方法,使用具体类型实现通配符   java使用pcap4j截断pcap文件   当我放置字母a、b和c时,java中的异常预期会下降   java设置活动对话框不可取消   接口类型变量上的Java克隆   使用Java或BouncyCastle对CSR(证书签名请求)进行安全解码/读取   java调用SavingsAccount对象上的函数并打印结果   java如何在Android应用程序上显示地图上的兴趣点(POI)并与之交互?   如果在JavaFX中的ResultSet中未找到任何内容,则显示java警报   java我将springboot和@component与@scheduled一起使用,它每12小时锁定一次   ApachePOI如何使用java删除包含字符串的word表的行   java如果对象(x,y)靠近其他对象(x,y)   从未对JMSException调用java JMS CachingConnectionFactory OneException方法   javascript使用java将HTML页面转换为MS word