【问题标题】:Linking OpenSSL into a dynamic library将 OpenSSL 链接到动态库
【发布时间】:2015-05-08 17:20:01
【问题描述】:

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

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

由于未使用 -fPIC 编译 OpenSSL,尝试将 OpenSSL 静态链接到共享库会导致错误。是否可以在不重新编译 openssl 的情况下做到这一点?

另外,有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果需要静态链接,可能需要自己编译。
  • 需要重新编译才能得到.so文件。

标签: c++ gcc openssl


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2018-08-22
    • 2015-07-14
    相关资源
    最近更新 更多