如何知道一个共享库是否依赖于另一个共享库? [英] How to know if one shared library depends on another shared library or not?
问题描述
我写了一个名为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屋!