我正在尝试将 OpenSSL 静态链接到我的程序中。
在这种情况下,它很简单:
gcc prog.c /usr/local/lib/libssl.a /usr/local/lib/libcrypto.a -o prog.exe -ldl
链接到可执行文件时效果很好。
Devil 的拥护者...它是否适用于位置无关代码 (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。
由于未使用 -fPIC 编译 OpenSSL,尝试将 OpenSSL 静态链接到共享库会导致错误。
这很容易解决。您只需在配置中指定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的例子