使用SONAME

时间:2017-02-25 16:02:19

标签: gcc linker openssl clang ld

如何强制gcc链接器链接到系统上共享库的给定版本(soname)?

我需要这样做以强制执行#include'ed的openssl版本与任何系统上链接的版本匹配,即使安装了多个版本的openssl也是如此。要查找ABI版本,我的配置脚本首先编译并运行一个程序,从头中提取SONAME:

#include <openssl/opensslv.h>
#include <stdio.h>

int main () {
  printf(SHLIB_VERSION_NUMBER);
  return 0;
}

SHLIB_VERSION_NUMBER包含so版本字符串,例如0.9.81.0.2k1.1.0。但是,如何告诉gcc链接此版本的libssllibcrypto而非任何-lssl

我尝试了"in situ" linking,因此我们不使用gcc main.c -lcrypto进行关联,而是使用:

gcc main.c libcrypto.so.1.1.0

然而,似乎无法找到链接器libcrypto.so.1.1.0

gcc: error: libcrypto.so.1.1.0: No such file or directory

我想系统只在使用-l标志时搜索标准位置。有没有更好的方法让我的软件链接到libcrypto.so.1.1.0

1 个答案:

答案 0 :(得分:0)

要选择正确版本的openssl共享库,请使用:

gcc main.c -l:libssl.so.1.0.0 -l:libcrypto.so.1.0.0

回答这个问题的关键是&#34;我如何控制ld以便链接正确版本的共享库?&#34;。

使用gnu编译器(gcc,g ++,gdc等等)将链接器标志(命令行参数传递给ld)的正确方法是使用前缀为&#34; -l&的普通ld参数#34 ;.例如-lssl或-L / usr / local / lib。

修改:根据How to specify the library version to use at link time?,您可以阅读ld手册:man ld