Search code examples
c++node.jscygwinopensslwaf

Compiling native C++ module for Node.js, linking to openSSL/libcrypto fails


I'm using Cygwin/Windows and I'm trying to build a native module for node.js. I intend to make use of the OpenSSL Library. I have installed openssl from the Cygwin package manager.

I have the following lines in my .cc file:

#include <openssl/dh.h>

and

 DH*    public_dh_key = DH_new();

But when I try to link/compile it with node-waf configure build, I get:

undefined reference to _DH_new

Edit:

Part of the build script:

def build(bld):
  ppp= bld.new_task_gen('cxx', 'shlib', 'node_addon')
  ppp.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall", "-L/usr/lib", "-lssl"]
...

(I have tried adding -lcrypto but still get the same result. I have also tried various combinations of "-lssl32","-lssleay32","-llibeay32".)

Edit

Output of the build script:

$ node-waf configure build
Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok
Checking for node path                   : not found
Checking for node prefix                 : ok /usr/local
'configure' finished successfully (0.330s)
Waf: Entering directory `/usr/src/build'
[1/2] cxx: ppp.cc -> build/default/ppp_1.o
[2/2] cxx_link: build/default/ppp_1.o -> build/default/ppp.node build/default/libppp.dll.a
Creating library file: default/libppp.dll.a
default/ppp_1.o:/usr/src/build/../ppp.cc:289: undefined reference to `_HMAC'
collect2: ld returned 1 exit status
Waf: Leaving directory `/usr/src/build'
Build failed:  -> task failed (err #1):
        {task: cxx_link ppp_1.o -> ppp.node,libppp.dll.a}

Edit

I have the header file dh.h in usr/include/openssl

And I have the required files (libssl32.dll, libeay32.dll and ssleay32.dll) in /usr/lib/

The answer

jHackTheRipper answered this and got the credit for it, but the final answer is buried in the comments beneath his answer. So to summarise, the waf mantra is

obj.lib='crypto'

Solution

  • Adding -lcrypto should do the trick.
    According to the nm output on my system _DH_new and _HMAC seem to be in the libcrypto (part of OpenSSL) dynamic library :

    jhacktheripper@macbook-prolocal:~$ nm /usr/lib/libcrypto.dylib | grep _DH_new
    0000000000036360 T _DH_new
    0000000000036120 T _DH_new_method
    
    
    jhacktheripper@macbook-prolocal:~$ nm /usr/lib/libcrypto.dylib | grep HMAC
    0000000000090d40 T _HMAC
    0000000000090c80 T _HMAC_CTX_cleanup
    0000000000090910 T _HMAC_CTX_init
    00000000000908c0 T _HMAC_CTX_set_flags
    0000000000090940 T _HMAC_Final
    0000000000090cc0 T _HMAC_Init
    0000000000090a10 T _HMAC_Init_ex
    0000000000090a00 T _HMAC_Update