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

举报
墨理学AI 发表于 2022/01/10 23:53:21 2022/01/10
【摘要】 Linux 下 使用 locate 命令 定位文件位置 locate libc.a /usr/lib/x86_64-linux-gnu/libc.a /usr/share/doc/libkl...

Linux 下 使用 locate 命令 定位文件位置

locate libc.a

/usr/lib/x86_64-linux-gnu/libc.a
/usr/share/doc/libklibc/README.klibc.arch


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

Linux下的库操作工具-nm、ar、ldd、ldconfig、ld.so

0


ldd 检查依赖

主要整理自 – 该文章


ldd是用来分析程序运行时需要依赖的动态库的工具;
nm是用来查看指定程序中的符号表相关内容的工具

ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27

which ldd
/usr/bin/ldd


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 示例 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)

/*
# 第一列:程序需要依赖什么库
# 第二列: 系统提供的与程序需要的库所对应库位置
# 第三列:库加载的开始地址
*/

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 示例 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<char, std::char_traits<char>, std::allocator<char> >
                 U vtable for std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >
                 U vtable for std::__cxx11::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >
                 U vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >
                 U vtable for std::istream
                 U vtable for std::basic_filebuf<char, std::char_traits<char> >
                 U vtable for std::basic_ifstream<char, std::char_traits<char> >
                 U vtable for std::basic_ofstream<char, std::char_traits<char> >
                 U vtable for std::basic_streambuf<char, std::char_traits<char> >


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 通常会 使用 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

/*
 第一列:当前符号的地址
 第二列:当前符号的类型
 第三列:当前符号的名称
*/

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

strings 用法直接参考大佬的博客即可

/*
strings  基本用法是  打印 程序
*/

strings test.py 

/*
进阶用法 ,当然是 单个文件 或者 多个文件 进行 关键词 搜索
*/

strings -f * | grep "my dear"

strings /lib64/libc.so.6 | grep GLIBC


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

ldd 和 readelf -d 用法示例


5-1

5-2
5-3


文章来源: positive.blog.csdn.net,作者:墨理学AI,版权归原作者所有,如需转载,请联系作者。

原文链接:positive.blog.csdn.net/article/details/115200579

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。