【问题标题】:Compiling V8 without networking, etc不联网编译V8等
【发布时间】:2014-03-04 07:30:46
【问题描述】:

我想将 V8 嵌入到我正在处理的项目中。这个项目根本不使用网络——事实上它出于安全原因避免了网络(我不想打开一个我没有准备好的跨站点脚本潘多拉魔盒)。无论如何,我只想要javascript。

据我了解,V8 只是一个简单的 javascript 编译器和 VM,这很好——但它需要与各种 3rd 方库一起编译才能适应添加的功能。我猜,网络就是其中之一。为了能够构建使用 V8 的应用程序,您必须与 Winsock 链接。

我希望能够从引擎中剥离这些额外的库,并从头开始将绑定添加到我自己的内部代码(除了字符串和类似的东西),但我找不到指南或文档帮助我做到这一点。 V8 作为一个我应该知道的 javascript 引擎添加了哪些功能,我该如何删除它?

编辑:我还注意到包含 URI,这对我正在做的事情并不是特别有用。 URI 函数没有优化,因为各种标准库嵌入在可执行文件中,我也想删除它们(以及任何其他与 XML/Http 相关的 javascript 函数)。

【问题讨论】:

  • 那么,你问在这种情况下“等”是什么?这是你的问题吗?
  • @KarolyHorvath 整个问题都在最后一句话中。特别是“我怎样才能删除它?”
  • 查看Build config 它似乎不是当前的一个选项,当然也没有经过测试。你当然愿意分叉回购并自己做。
  • @NmdMystery 我不确定你可以;一方面,如果没有 URI 支持,“require”将如何工作?

标签: javascript c++ v8


【解决方案1】:

网络。目前V8的调试器代理需要联网,没有它也可以使用引擎,但需要修改源代码。

  1. src/platform/socket.h

    将您的操作系统的 NativeHandle typedef(如 V8_OS_WIN)替换为:

    typedef int NativeHandle;
    

    kInvalidNativeHandle 常量值替换为 -1。

    删除操作系统包含文件。

  2. src/platform/socket.cc

    用存根替换所有Socket 类方法的主体,例如:

    bool Socket::Bind(int port) {
      assert(!"Socket usage.");
      return true;
    }
    
    bool Socket::Listen(int backlog) {
      assert(!"Socket usage.");
      return true;
    }
    ...
    

    从此文件中删除其他特定于操作系统的功能,等等。

    这应该会删除所有 V8 网络依赖项。

XML/HTTP 函数。。 V8 不包括这些。它们通常由embedder实现。

URI 函数 我不建议删除这些以及任何其他 JavaScript 内置函数。这可能会损坏发动机。而且它们无论如何都可以安全使用。

重症监护室。您可以使用构建选项 i18nsupport=off 构建没有 ICU 库的 V8。 在这种情况下,您需要初始化内置 ICU:

   v8::V8::InitializeICU();

希望这会有所帮助。我自己在非常受限的环境中使用 V8,没有网络/文件系统等。如果我忘记了其他依赖项或者您有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多