问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

nm命令的高级用法与实战技巧

创作时间:
作者:
@小白创作中心

nm命令的高级用法与实战技巧

引用
CSDN
8
来源
1.
https://blog.csdn.net/Dontla/article/details/136478248
2.
https://www.geeksforgeeks.org/nmcli-command-in-linux-with-examples/
3.
https://www.computernetworkingnotes.com/linux-tutorials/the-nm-connection-editor-command-on-linux.html
4.
https://labex.io/tutorials/linux-linux-nm-command-with-practical-examples-422841
5.
https://www.cisco.com/c/zh_cn/support/docs/ios-nx-os-software/ios-xe-16/220270-use-cisco-ios-xe-hardening-guide.html
6.
https://help.aliyun.com/zh/analyticdb/analyticdb-for-postgresql/user-guide/tpc-ds-benchmark-performance-test
7.
https://www.baeldung.com/linux/strip-executables
8.
https://www.jterrazz.com/articles/3

在Linux系统中,nm命令是一个强大的工具,用于查看目标文件(如可执行文件、库文件或目标文件)中的符号表信息。通过分析符号表,开发者可以深入了解程序的内部结构,这对于调试和优化代码非常有帮助。本文将介绍nm命令的一些高级用法和实用技巧。

基本用法

在开始高级用法之前,让我们先回顾一下nm命令的基本用法。最简单的使用方式是直接在命令行中输入nm加上目标文件的名称:

nm myprogram

这将显示目标文件中所有符号的列表,包括符号的值、类型和名称。符号类型用单个字符表示,例如:

  • Tt:表示文本(代码)节中的符号
  • Dd:表示数据节中的符号
  • Bb:表示bss节中的符号
  • U:表示未定义的符号

高级用法

1. 显示动态符号表

默认情况下,nm命令显示的是静态符号表。如果要查看动态符号表,可以使用--dynamic选项:

nm --dynamic myprogram

这对于分析动态链接库(.so文件)特别有用。

2. 符号信息过滤

在处理大型项目时,符号表可能会非常长。使用--defined-only选项可以只显示已定义的符号,排除外部符号:

nm --defined-only myprogram

如果需要查找特定符号,可以结合使用grep命令:

nm myprogram | grep "my_function"

3. 显示符号大小

默认情况下,nm只显示符号的地址。如果要查看符号的大小,可以使用-S选项:

nm -S myprogram

这对于分析函数或变量的大小非常有帮助。

4. 以十六进制格式显示

默认的输出格式可能不够直观。使用-x选项可以将所有数值以十六进制格式显示:

nm -x myprogram

5. 显示所有符号

有时候,目标文件中可能包含未在默认输出中显示的符号。使用-A--with-filename选项可以确保显示所有符号,并在每个符号前加上文件名:

nm -A myprogram

6. 调试信息

如果目标文件包含调试信息,使用-C--demangle选项可以将C++的mangled名称转换为可读格式:

nm -C myprogram

这对于分析C++程序特别有用。

实际应用场景

调试链接错误

当遇到链接错误时,nm可以帮助检查目标文件中是否确实缺少某个符号:

nm --defined-only mylib.a | grep "missing_function"

如果找不到该符号,说明需要进一步检查代码或链接其他库。

分析程序结构

在处理不熟悉的代码库时,nm可以帮助快速了解程序的结构:

nm -AC myprogram | less

这将显示所有符号及其所在文件,便于分析程序的模块结构。

检查符号重定义

在大型项目中,可能会出现多个源文件定义了同名符号的情况。使用nm可以检查这种冲突:

nm -AC *.o | grep "multiple definition"

总结

nm命令虽然简单,但功能强大。通过掌握其高级用法,开发者可以更有效地进行代码调试和性能优化。无论是分析符号表、检查链接错误,还是理解程序结构,nm都是一个不可或缺的工具。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号