在Google Native Client上运行已编译的文件

时间:2015-08-29 10:50:54

标签: javascript c++ c linux google-nativeclient

如何使用Google Native Client(PNaCl)直接运行编译文件?它试图检查他们的documentation。它说 -

  

Native Client是一个沙箱,用于高效安全地在浏览器中运行已编译的C和C ++ 代码,与用户的操作系统无关。

但是在他们的文档中,他们只处理应用程序的来源。有没有办法直接运行编译代码?我想运行包含.exe.deb扩展名

的文件

我不限制Native Client的答案。任何可以做这种工作的机制都适合我。

2 个答案:

答案 0 :(得分:16)

您无法在NaCl或PNaCl中运行预编译的代码。您必须使用the SDK提供的编译器。这有三个主要原因:

  • NaCl是一个执行沙箱,它以非常特殊的方式依赖于制作机器代码(x86-32,x86-64,ARM,MIPS)。这是从CPU的角度来看的常规机器代码,但允许沙箱运行验证器并确保代码不能执行任何恶意操作。这称为软件故障隔离,在this paper中进行了解释。其他ISA沙箱是also documented
  • PNaCl靶向NaCl,但是与建筑无关的中间表示。这意味着您可以将所谓的字节码发送出去,并且浏览器根据用户的机器确定要生成哪种类型的机器代码(x86-32,x86-64,ARM,MIPS)。开发人员不会生成4个二进制文件。
  • 在上述两种情况下,代码都可以按原样在Windows,MacOSX,Linux,ChromeOS和(通常不会发货)Android上执行。这意味着NaCl沙箱本身就是一个操作系统,并提供相同的API。这些API与其他操作系统不同,尽管它们与POSIX非常接近,尤其是如果您使用nacl_io

以上几点要求您使用SDK提供的编译器。

技术上可以运行为其他体系结构或操作系统构建的二进制文件,因为系统是图灵完备的。这是QEMU做什么,Rosetta做了什么,Transmeta做了什么,以及Android Runtime for Chome (ARC)启用了什么。这通常需要二进制转换和所有操作系统调用的仿真。这在技术上难以实施,并且通常具有严重的性能成本。我不建议使用此选项。

答案 1 :(得分:4)

正如@JFBastien所指出的,仿真是在浏览器环境中执行预编译本机代码的唯一选择。但它仍是一种选择。根据您对性能的要求,它甚至可能是一个可行的选择。

例如,点击here以在浏览器中启动运行Windows(非常旧的版本)的模拟器。

从菜单选择中,例如,notepad.exe(使用键盘上的光标向下键)并按Enter键。你有它:在浏览器中运行的未经修改的,预编译的本机notepad.exe! (并且可能比这个操作系统是新的那天更快)。

网上有很多用Javascript编写的模拟器。运行具有可用性能甚至网络(!),图形和声音的小型Linux发行版实际上是可行的。查看OpenRISC emulator。您甚至可以运行ssh守护程序并从本地计算机登录!