我正在尝试将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
的示例