我正在尝试将OpenSSL静态链接到我的程序中。

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

由于未使用-fPIC编译OpenSSL,尝试将OpenSSL静态链接到共享库会导致错误。是否可以在不重新编译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



修复起来很容易。您只需在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



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



通常,您只需要配置shared即可。这会触发-fPIC,它使您可以重定位代码。

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

您可以在Build OpenSSL with RPATH?上看到修改Configure的示例

07-24 18:30
查看更多