如何知道一个共享库是否依赖于另一个共享库? [英] How to know if one shared library depends on another shared library or not?

查看:524
本文介绍了如何知道一个共享库是否依赖于另一个共享库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个名为libmyssl.so的共享库,我在代码中使用了一些openssl函数,make文件如下所示:


g ++ -v -shared -lz -lssl -lcrypto -Wl,-soname,libmyssl.so.1,-o
libmyssl.so.1.0 myssl.o

blockquote>

之后,我使用 ldd 命令查看它是否依赖于 libssl.so


ldd libmyssl.so.1.0


结果如下:

  linux-vdso.so.1 => (0x00007fff743fe000)
libstdc ++。so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6(0x00007f0bc963b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6(0x00007f0bc9276000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6(0x00007f0bc8f6f000)
/lib64/ld-linux-x86-64.so.2(0x00007f0bc9ea0000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1(0x00007f0bc8d59000)

看来它没有't取决于 libssl.so ,是吗?



然而,我使用 readelf -s 命令来请参阅以下符号:


readelf -s libmyssl.so.1.0


结果如下:

  ...... 
259: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND SSL_new
260:0000000000000000 0 NOTYPE GLOBAL DEFAULT UND SSL_get_shutdown
261:0000000000000000 0 FUNC GLOBAL DEFAULT UND close@GLIBC_2.2.5(4)
262:0000000000000000 0 NOTYPE GLOBAL DEFAULT UND d2i_X509
263:0000000000000000 0 NOTYPE GLOBAL DEFAULT UND X509_get_pubkey
264:0000000000000000 0 NOTYPE GLOBAL DEFAULT UND SSL_set_info_callback
265:0000000000000000 0 FUNC GLOBAL DEFAULT UND gmtime_r@GLIBC_2.2.5(4)
......

似乎 X509_get_putkey 未重新定位。所以它应该取决于 libssl.so 。也许我不明白。



希望有人可以更多地解释这一点,非常感谢! 某些发行版会要求你在引用它们的目标文件之后列出链接库(以模仿静态库如何工作)。因此,请尝试构建:

  g ++ -v -shared -Wl,-soname,libmyssl.so.1,-o libmyssl .so.1.0 myssl.o -lz -lssl -lcrypto 


I wrote a shared library named "libmyssl.so", I use some openssl function in my code, the make file looks like follows:

g++ -v -shared -lz -lssl -lcrypto -Wl,-soname,libmyssl.so.1,-o libmyssl.so.1.0 myssl.o

After that, I use ldd command to look if it depends on libssl.so:

ldd libmyssl.so.1.0

The result as follows:

linux-vdso.so.1 =>  (0x00007fff743fe000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0bc963b000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bc9276000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0bc8f6f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f0bc9ea0000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0bc8d59000)

It seems it didn't depend on libssl.so, am I right?

However, I use readelf -s command to see the symbols as follows:

readelf -s libmyssl.so.1.0

The reasult as follow:

......
259: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND SSL_new
260: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND SSL_get_shutdown
261: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND close@GLIBC_2.2.5 (4)
262: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND d2i_X509
263: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND X509_get_pubkey
264: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND SSL_set_info_callback
265: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND gmtime_r@GLIBC_2.2.5 (4)
......

It seems that the X509_get_putkey is not relocated. So it should depend on libssl.so. Maybe I didn't understand it well.

Hope someone can explain more about that, thanks very much!

解决方案

Some distributions would require you to list linked libraries after object files that reference them (to mimic how static libs work). So try to build like:

g++ -v -shared -Wl,-soname,libmyssl.so.1,-o libmyssl.so.1.0 myssl.o -lz -lssl -lcrypto

这篇关于如何知道一个共享库是否依赖于另一个共享库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆