node-gyp 扩展可以调用扩展链接 OpenSSL 而不是节点 OpenSSL 吗?

Can node-gyp extension call extension linked OpenSSL instead of node OpenSSL?

运行 在 linux-wmxt 4.16.8-1-default (Tumbleweed) 上。

我有一个调用 openssl 1.0 API 的库。我可以动态 link 或静态 link。两者都产生相同的结果。

如果我 运行 这个来自 C 测试工具,它工作正常。

通过 node-gyp 扩展使用节点的相同调用会产生内存错误,我认为这是由于调用被路由到 API 调用的节点版本,我相信它使用 openssl 1.1( ABI 与 1.0 不兼容)。

:
#17 0x12838e1 in ASN1_item_d2i_bio (/home/me/.nvm/versions/node/v10.1.0/bin/node+0x12838e1)
#18 0x7f808108687e in _extractp7certs /home/me/Projects/git/test.sdk.c/c/test/src/testcrypto.c:678
:
SUMMARY: AddressSanitizer: heap-buffer-overflow

MacOS High Sierra 上完全相同的代码库(静态 linked)在节点 9.9 上运行良好。

在深入探讨之前:一个简单的问题。有没有办法让 node-gyp 确保我的代码调用我的 OpenSSL 版本而不是节点?或者我必须将我的代码更新为 openssl 1.1 吗?

您可以更改 binding.gyp 并使其在您的节点插件中包含来自您的 openssl 版本(通过提供路径)的库和文件。

我确实尝试了对 binding.gyp 的各种更改,例如

{
  "targets": [
    {
      "target_name": "myid",
      "include_dirs": [ "../dep/include" ],
      "sources": [ "./src/myid.c" ],
      "libraries": [
            "/home/me/local/lib64/libcrypto.so",
            "/home/me/local/lib64/libssl.so",
            "/home/me/local/lib64/libcurl.so",
            "/home/me/local/lib64/libxmlsec1.so",
            "../dep/slib/libmylib.so"
        ]
    }
    ]
}

这些 1.0 库构建于:

openssl: ./config --prefix=$HOME/local --openssldir=$HOME/local/openssl

libcurl: ./configure --prefix=$HOME/local --with-ssl=$HOME/local --disable-ldap

libxmlsec1: ./configure --prefix=$HOME/local --without-libxslt --with-openssl=$HOME/local

同样的结果。所以我硬着头皮升级了我的代码以兼容 OpenSSL 1.1+。

现在节点绑定工作了。