Christian Stewart
Christian Stewart

Reputation: 15519

Linking OpenSSL into a dynamic library

I'm trying to static link OpenSSL into my program.

It works fine when linking into the executable. I need to use OpenSSL in a shared library (so, or dll) that I dynamically load later on when the process executes.

Trying to statically link OpenSSL into the shared library causes errors due to OpenSSL not being compiled with -fPIC. Is it possible to do this without recompiling openssl?

Also, is there a better way to do this?

Upvotes: 2

Views: 6684

Answers (1)

jww
jww

Reputation: 102205

I'm trying to static link OpenSSL into my program.

In this case, its as simple as:

gcc prog.c /usr/local/lib/libssl.a /usr/local/lib/libcrypto.a -o prog.exe -ldl

It works fine when linking into the executable.

Devil's advocate... Does it work fine with Position Independent Code (PIE)? PIE on a program is the equivalent to PIC on a shared object (some hand waiving).

gcc -fPIE prog.c /usr/local/lib/libssl.a /usr/local/lib/libcrypto.a -o prog.exe -ldl

According to the GCC folks, you can compile with fPIC, and then build a shared object with -fPIC or a relocatable executable with -fPIE. That is, its OK to use -fPIC for both.


Trying to statically link OpenSSL into the shared library causes errors due to OpenSSL not being compiled with -fPIC.

That's easy enough to fix. You simply specify shared in configure:

./config shared no-ssl2 no-ssl3 no-comp --openssldir=/usr/local/ssl
make
sudo make install

I think you can also (notice the lack of shared):

export CFLAGS="-fPIC"
./config no-ssl2 no-ssl3 no-comp --openssldir=/usr/local/ssl
make
sudo make install

not being compiled with -fPIC. Is it possible to do this without recompiling openssl?

NO, you have to compile with PIC to ensure GCC generates relocatable code.


Also, is there a better way to do this?

Usually you just configure with shared. That triggers -fPIC, which gets you relocatable code.

There's other things you can do, but they are more intrusive. For example, you can modify Configure line (like linux-x86_64), and add -fPIC in the second field. The fields are separated by colons, and the second field is $cflags used by the OpenSSL build system.

You can see an example of modifying Configure at Build OpenSSL with RPATH?

Upvotes: 2

Related Questions