1、依赖查询
1.1 objdump
一个 动态库还可能依赖别的动态库,可用以下命令去查询[7]:
$ objdump -x libxxxxx.so | grep NEEDED以libpng12.so.0为例,查询结果如下:
liyihai@ubuntu:/lib/i386-linux-gnu$ objdump -x libpng12.so.0 | grep NEEDED NEEDED libz.so.1 NEEDED libm.so.6 NEEDED libc.so.6
1.2 ldd[11]
还可以直接使用ldd命令查看动态库的依赖关系:
ldd libXXX.so
2、-L、-rpath、-rpath-link
就算使用第1章的方法找到了libpng12.so.0所依赖的库,而且放到和libpng12.so.0同一个目录中,编译时还是可能找不到。使用-L可以指定可执行文件编译时需要的库目录,而动态库依赖于其它库的目录需要使用-rpath、rpath-link来指定[9]。
由于-rpath、rpath-link都是ld的参数,而不是gcc的,因此如果是gcc中使用这两个参数,要使用-Wl选项[10],例如:
$gcc hello.c -Wl,-rpath-link /usr/local/lib
3、函数
如果知道.so中包含了那些函数呢?,以libc.so.6为例,使用以下命令可以查找其中包含的函数[1]。
$ readelf -s libc.so.6
参考资料
[1]linux下,怎么用shell命令或脚本查看.so文件里面的所有函数名
[6]怎么让gcc编译出来的so文件不依赖于libgcc_s.so.1?