为什么openssl / md5.h链接“crypto”而不是“ssl”

时间:2017-01-17 12:21:21

标签: linux build openssl

我试图了解链接错误的原因。这个例子是具体的,但原因可能是我不理解的一般原则。

我想从this post构建最小的示例。 Ubuntu 14.05.5。我做了:

$ apt-get install libssl-dev
$ opensll version
OpenSSL 1.0.1f 6 Jan 2014
$ echo $LD_LIBRARY_PATH
/usr/local:
$ gcc  -I/usr/include/openssl -o test md5.c  -L/usr/lib/x86_64-linux-gnu -lssl
/tmp/ccUSgfgs.o: In function `main':
md5.c:(.text+0x26): undefined reference to `MD5_Init'
md5.c:(.text+0x68): undefined reference to `MD5_Update'
md5.c:(.text+0xab): undefined reference to `MD5_Final'
collect2: error: ld returned 1 exit status

引发常见的链接错误。它无法找到这些符号的定义。通过随机尝试,我发现了这个版本:

$ gcc  -I/usr/include/openssl -o test md5.c  -L/usr/lib/x86_64-linux-gnu -lcrypto    

唯一的区别是'-l crypto'而不是'-l ssl'

为什么一个构建而另一个不构建?

1 个答案:

答案 0 :(得分:0)

因为libcrypto.a包含定义,而不是libssl.a。证据是:

$ nm /usr/lib/x86_64-linux-gnu/libssl.a | grep MD5
             U MD5_Init
             U MD5_Transform

嗯,其中一个符号在那里,但U表示未定义。更确切地说:

$ nm /usr/lib/x86_64-linux-gnu/libcrypto.a | grep MD5
  nm: ebcdic.o: no symbols
  00000000000001f0 T MD5_Final
  0000000000000340 T MD5_Init
  00000000000001e0 T MD5_Transform
  0000000000000000 T MD5_Update

符号有定义。案件解决了。通过阅读文档可能可以节省一些时间。