2

我正在使用 NaCL 开发 Google Chrome 扩展程序。它非常酷且易于使用,但我有疑问。

我的扩展需要 GPGME(GnuPG Made Easy),所以我使用“--enable-shared”选项编译该库并将该库添加到 .mnf 文件中:

{
    ...
    "files": {
        "libgpgme.so": {
            "x86-64": {
                "url": "libs/libgpgme.so"
            },
            "x86-32": {
                "url": "libs/libgpgme.so"
        }
    }
    ...
}

我还使用选项“-lgpgme”更新了 makefile,但是当我编译我的 .nexe 时,出现以下错误:“libgpgme.so:文件无法识别:文件格式无法识别”。

所以,我的问题是:

  1. 我可以在我的项目中使用外部库吗?
  2. 我怎样才能做到这一点?

——干杯,何塞

4

2 回答 2

3

由于 Native CLient 的内部沙箱依赖于二进制文件的验证,因此您需要使用 Native Client 工具编译 libgpgme。一般来说,Native Client 需要在执行之前验证任何代码,包括任何库,无论它们是静态链接还是动态链接。到目前为止,创建可验证的二进制文件的最简单方法是使用 Native Client 编译器。

移植到本机客户端: 由于 libgpgme 使用自动工具,特别是配置,因此您需要通过在文件 config.sub 的 basic_machine 部分添加类似这样的部分来向他们宣传 NaCl 平台,该部分应位于 libgpgme 中的某个位置源码树:

   nacl*)
           basic_machine=i686-pc
           os=-nacl
           ;;

并添加

  -nacl*

到同一文件的 os 部分。一个特别干净的端口的例子是 libogg。您可以在http://code.google.com/p/naclports/source/browse/trunk/src/libraries/libogg-1.1.4/nacl-libogg-1.1.4.patch看到完整的补丁。(严格来说,config.sub 是从 configure.in 生成的,但编辑 config.sub 往往更方便。)

除了第一步之外,移植还有更多内容,因此一些指南和指向现有移植的指针可以让您了解它是如何完成的。

指南:有关更多信息,请参阅https://developers.google.com/native-client/community/developers 上的几个移植事后分析。特别是,https://developers.google.com/native-client/community/porting/xaos上关于 XaoS 的那篇有一个关于自动工具的简短部分。

现有端口: 此外,还有一个基于社区的 Native Client 存储库,称为 naclports。它包含几个已经被移植的库,但不幸的是还没有 libgpgme。您可以在http://code.google.com/p/naclports/source/browse/trunk/src/libraries/查看 naclports 中的库列表。虽然它包含有关如何进行移植的有用示例,但 naclports 不适合胆小的人,因为它经常损坏并且 - 考虑到它是在自愿/尽力而为的基础上维护的 - 可能需要时间来修复。

于 2012-12-18T11:44:59.553 回答
1

您需要先将 libgpgme 移植到 NaCl。即 libgpgme 应该由 NaCl 编译器而不是 Linux 编译器编译。

GPGME 使用配置。因此移植通常通过将包装脚本作为编译器传递来完成。这些脚本将 NaCl 编译器生成的 NaCl 程序替换为通过 sel_ldr 调用它们的脚本。通过这种方式,configure 可以像运行普通的 Linux 程序一样运行编译过的 NaCl 程序。

于 2012-12-17T20:03:05.663 回答