将OpenSSL链接到动态库

时间:2015-05-08 17:20:02

标签: c++ gcc openssl

我试图将OpenSSL静态链接到我的程序中。

链接到可执行文件时,它工作正常。我需要在共享库(so或dll)中使用OpenSSL,以后在进程执行时动态加载。

尝试将OpenSSL静态链接到共享库会导致由于OpenSSL未使用-fPIC编译而导致的错误。是否可以在不重新编译openssl的情况下执行此操作?

另外,有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

  

我试图将OpenSSL静态链接到我的程序中。

在这种情况下,它很简单:

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

链接到可执行文件时,它可以正常工作。

魔鬼的拥护者......位置独立代码(PIE)是否可行?程序上的PIE相当于共享对象上的PIC(某些手放弃)。

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

根据GCC人员的说法,您可以使用fPIC进行编译,然后使用-fPIC或使用-fPIE的可重定位可执行文件构建共享对象。也就是说,可以将-fPIC用于两者。

  

尝试将OpenSSL静态链接到共享库会导致由于OpenSSL未使用-fPIC编译而导致的错误。

这很容易解决。您只需在configure中指定shared

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

认为你也可以(注意缺少shared):

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

没有使用-fPIC编译。是否可以在不重新编译openssl的情况下执行此操作?

不,您必须使用PIC进行编译,以确保GCC生成可重定位代码。

  

另外,有更好的方法吗?

通常只需配置shared即可。这会触发-fPIC,它会为您提供可重定位的代码。

你还可以做其他事情,但它们更具侵入性。例如,您可以修改Configure行(如linux-x86_64),并在第二个字段中添加-fPIC。这些字段用冒号分隔,第二个字段是OpenSSL构建系统使用的$cflags

您可以在Build OpenSSL with RPATH?

查看修改Configure的示例
相关问题