如何知道一个共享库是否依赖于另一个共享库?
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
之后我用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)
好像没有依赖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
我写了一个名为 "libmyssl.so" 的共享库,我在我的代码中使用了一些 openssl 函数,make 文件如下所示:
g++ -v -shared -lz -lssl -lcrypto -Wl,-soname,libmyssl.so.1,-o libmyssl.so.1.0 myssl.o
之后我用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)
好像没有依赖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