Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何知道一个共享库是否依赖于另一个共享库?_C++_Linux_Gcc_Linker_Shared Libraries - Fatal编程技术网

C++ 如何知道一个共享库是否依赖于另一个共享库?

C++ 如何知道一个共享库是否依赖于另一个共享库?,c++,linux,gcc,linker,shared-libraries,C++,Linux,Gcc,Linker,Shared Libraries,我编写了一个名为“libmyssl.so”的共享库,我在代码中使用了一些openssl函数,make文件如下所示: g++-v-shared-lz-lssl-lcrypto-Wl,-soname,libmyssl.so.1,-o libmyssl.so.1.0 myssl.o 之后,我使用ldd命令查看它是否依赖于libssl ldd libmyssl.so.1.0 结果如下: linux-vdso.so.1 => (0x00007fff743fe000) libstdc++.so.6

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

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

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

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。那么,我说得对吗

但是,我使用readelf-s命令查看符号,如下所示:

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)
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

更好的检查方法是使用
objdump
并查找所需的库,如
objdump-p libmyssl.so.1.0 | grep needed
我尝试使用您的命令并得到相同的结果-列表中只有libstdc++.so.6和libc.so.6,libssl.so没有出现。非常感谢!你是对的。我将-lz-lssl-lcrypto移动到命令行的末尾,之后,我发现“ldd libmyssl.so.1.0”的结果包含“libssl.so”。我尝试从命令行中删除“-lssl”,它仍然可以成功地构建“myssl.so.1.0”。所以我想知道在构建共享库时是否可以删除所有依赖库?默认情况下,ld不需要解析共享库中缺少的符号,因此如果删除-lssl,它不会发出错误。不过,在运行时您会得到一个错误(加载程序不知道它需要加载libssl,并且您会得到SSL\u new的未定义符号)。我建议链接
-Wl,--no undefined
,以便在构建时捕获此类错误。请理解。感谢您的解释。