我试图将OpenSSL静态链接到我的程序中。
链接到可执行文件时,它工作正常。我需要在共享库(so或dll)中使用OpenSSL,以后在进程执行时动态加载。
尝试将OpenSSL静态链接到共享库会导致由于OpenSSL未使用-fPIC编译而导致的错误。是否可以在不重新编译openssl的情况下执行此操作?
另外,有更好的方法吗?
答案 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
。
Configure
的示例