Linux 下 ldd 检查依赖 | strings用法 | locate

Linux 下 ldd 检查依赖 | strings用法 | locate

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, std::allocator >

U vtable for std::__cxx11::basic_stringstream, std::allocator >

U vtable for std::__cxx11::basic_istringstream, std::allocator >

U vtable for std::__cxx11::basic_ostringstream, std::allocator >

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 用法示例

截图参考博文链接

相关推荐