Linux 下 使用 locate 命令 定位文件位置
locate libc.a
/usr/lib/x86_64-linux-gnu/libc.a
/usr/share/doc/libklibc/README.klibc.arch
Linux下的库操作工具-nm、ar、ldd、ldconfig、ld.so
ldd 检查依赖
主要整理自 – 该文章
ldd是用来分析程序运行时需要依赖的动态库的工具; nm是用来查看指定程序中的符号表相关内容的工具
ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27
which ldd
/usr/bin/ldd
示例 ldd 检查依赖
ldd libkrrface.so
linux-vdso.so.1 (0x0000007f82c5b000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000007f7d75a000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x0000007f7d5b5000)
libm.so.6 => /lib64/libm.so.6 (0x0000007f7d4f4000)
libgomp.so.1 => /lib64/libgomp.so.1 (0x0000007f7d4b3000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000007f7d482000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000007f7d44d000)
libc.so.6 => /lib64/libc.so.6 (0x0000007f7d2d7000)
/lib/ld-linux-aarch64.so.1 (0x0000007f82c2d000)
/*
# 第一列:程序需要依赖什么库
# 第二列: 系统提供的与程序需要的库所对应库位置
# 第三列:库加载的开始地址
*/
示例 nm 查看指定程序中的符号表相关内容
/*
直接 检查所有 , 可能会输出一些不是很能看懂的东西
*/
nm -D libkrrface.so
00000000051a3b08 V _ZTVN3MNN12SizeComputerE
00000000051a3b38 V _ZTVN3MNN13WrapExecutionE
00000000051a4a88 V _ZTVN3MNN7Express9Optimizer10ParametersE
U _ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE
U _ZTVNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE
U _ZTVNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE
U _ZTVNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEE
U _ZTVSi
U _ZTVSt13basic_filebufIcSt11char_traitsIcEE
U _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE
U _ZTVSt14basic_ofstreamIcSt11char_traitsIcEE
U _ZTVSt15basic_streambufIcSt11char_traitsIcEE
/*
在nm的时候,加上-C选项,就可以把这些难以识别的符号,转换成便于我们阅读的符号TestHello()
这个主要是c++中的mangle机制所导致的,加上-C就是指定列出的符号是demangle了的
*/
nm -D libkrrface.so -C
00000000051a3b08 V vtable for MNN::SizeComputer
00000000051a3b38 V vtable for MNN::WrapExecution
00000000051a4a88 V vtable for MNN::Express::Optimizer::Parameters
U vtable for std::__cxx11::basic_stringbuf
U vtable for std::__cxx11::basic_stringstream
U vtable for std::__cxx11::basic_istringstream
U vtable for std::__cxx11::basic_ostringstream
U vtable for std::istream
U vtable for std::basic_filebuf
U vtable for std::basic_ifstream
U vtable for std::basic_ofstream
U vtable for std::basic_streambuf
通常会 使用 grep 来 判断指定程序中有没有定义 指定的符号 或者 方法
nm -D libkrrface.so | grep WF_
000000000008f000 T WF_HeadLite_HeadAlign
000000000008f510 T WF_HeadLite_HeadDetect
000000000008f180 T WF_HeadLite_HeadFeatureExtract
000000000008f350 T WF_HeadLite_HeadFeatureVerify
000000000008f178 T WF_HeadLite_GetHeadAlignSize
000000000008ec70 T WF_HeadLite_InitializeInstance
000000000008edf0 T WF_HeadLite_ReleaseInstance
/*
第一列:当前符号的地址
第二列:当前符号的类型
第三列:当前符号的名称
*/
strings 用法直接参考大佬的博客即可
/*
strings 基本用法是 打印 程序
*/
strings test.py
/*
进阶用法 ,当然是 单个文件 或者 多个文件 进行 关键词 搜索
*/
strings -f * | grep "my dear"
strings /lib64/libc.so.6 | grep GLIBC
ldd 和 readelf -d 用法示例
截图参考博文链接