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

时间:2018-05-23 08:16:05

标签: openssl node-gyp

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

我有一个调用openssl 1.0 API的库。我可以动态链接或静态链接。要么产生相同的结果。

如果我从C测试工具中运行它,它可以正常工作。

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

:
#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上完全相同的代码库(静态链接)与节点9.9完全兼容。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我确实尝试了对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 /本地   --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+兼容。

现在,节点绑定起作用了。