5

Attempt 1, Vanilla Link to Library

I'm trying to use a patched version of OpenSSL (so DTLS is easier to use). OpenSSL is in

/usr/local/openssl-1.0.1c

The ./include/openssl subfolder has a ton of header files (as I assume it should):

lrwxrwxrwx 1 root root   22 Dec 25 05:49 aes.h -> ../../crypto/aes/aes.h
lrwxrwxrwx 1 root root   24 Dec 25 05:49 asn1.h -> ../../crypto/asn1/asn1.h
lrwxrwxrwx 1 root root   28 Dec 25 05:49 asn1_mac.h -> ../../crypto/asn1/asn1_mac.h
...

GCC links to the include folder and gives me an error- it cannot find SSL. I'm using more or less the same thing other people are. This works, on OSX (10.6), but not on Ubuntu:

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto  -o server server.c
server.c:20:25: fatal error: openssl/ssl.h: No such file or directory
compilation terminated.

Attempt 2, Symbolic Link to Library in /usr/include

So, then I try creating a symbolic link to OpenSSL in my /usr/include:

sudo ln -s /usr/local/openssl-1.0.1c/include/openssl /usr/include/openssl

and re-attempting compilation:

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto  -o server server.c
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
collect2: ld returned 1 exit status
make: *** [server] Error 1

Why does the first method (ie no symbolic link) not work? Permissions? Why does the second method not work? Why does this work on OSX???

Community
  • 1
  • 1
nflacco
  • 4,972
  • 8
  • 45
  • 78

2 Answers2

9

The problem with the header file not being found seems to be you mixing up your options. -L adds a path to the linker library search paths, while -I adds a directory to the preprocessor header file search path. Change the -L to -I to solve that problem:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o

Now the linker problem is because you erroneously use the -L option to tell the linker to look for libraries in the include path. You need to change that path to the directory where the libraries are, usually a lib subdirectory. Also, the linker wants libraries in reverse order of their dependencies, so place the libraries you want to link with last on the command line:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o \
    -L/usr/local/openssl-1.0.1c/lib -lssl -lcrypto
Some programmer dude
  • 400,186
  • 35
  • 402
  • 621
3

Your compilation command appears to work on OSX but is actually compiling and linking with the system-provided OpenSSL rather than the version you wanted. It fails outright on Ubuntu because you don't have the headers and development library links for the system OpenSSL installed.

This is because you have the search path options mixed up, and you need two of them. To tell GCC where headers are you use -I. To tell it where object-code libraries are you use -L. The compilation command you need, ON BOTH SYSTEMS, is something like this:

$ gcc -I /usr/local/openssl-1.0.1c/include -L /usr/local/openssl-1.0.1c/lib \
      -o server server.c -lssl -lcrypto
zwol
  • 135,547
  • 38
  • 252
  • 361