Linux 系统中的 nm 命令: 符号解析的利器299


nm 命令是 Linux 系统中一个强大的工具,用于显示可执行文件、共享库和目标文件中定义的符号。它解析符号表,提供有关函数、变量和数据结构的宝贵信息。对于逆向工程、调试和理解代码依赖关系,nm 命令至关重要。

nm 命令的语法nm [选项]

其中, 是要解析的目标文件或可执行文件。常用的选项包括:* -A:打印所有符号,包括外部和未定义符号
* -g:按名称对符号进行分组
* -p:打印符号的地址
* -r:按地址对符号进行排序

解析符号表

nm 命令输出由多列组成,提供以下信息:* 类型:符号类型,例如函数、数据或未定义
* 值:符号的地址或值
* 大小:对于函数,为大小;对于数据,为偏移量
* 名称:符号名称

例如,以下输出显示了 bash 可执行文件中的符号:
$ nm bash
00000970 T bash
00000300 T dyld_setup_environment
000002c0 T dyld_use_image
...

其中,T 表示函数符号,而 00000970 是 bash 入口点的地址。

确定函数地址

nm 命令的一个重要用法是确定函数的地址。这对于动态链接库(DLL)或共享对象(SO)很有用,因为这些库中的函数不是静态链接的,而是加载时动态解析的。

要查找函数地址,可以使用带有 -A -g 选项的 nm 命令:
$ nm -Ag | grep MyFunction
U MyFunction

输出表明 MyFunction 未定义,这意味着它在 中未定义,而是在其他库或可执行文件中定义。要查找实际地址,可以使用 dlopen 和 dlsym 函数:
#include
int main() {
void *handle = dlopen("", RTLD_NOW);
if (handle) {
void *funcPtr = dlsym(handle, "MyFunction");
if (funcPtr) {
printf("MyFunction address: %p", funcPtr);
}
}
return 0;
}

识别外部依赖项

nm 命令还可以帮助识别代码的外部依赖项。使用 -u 选项,可以列出未定义的符号,这些符号在当前可执行文件中未定义,但可能在其他库或可执行文件中定义。
$ nm -u my_program | grep UNDEF
U :MyFunction

输出表明 my_program 依赖于 中的 MyFunction 函数,因此在链接时需要 。

调试符号

nm 命令还可用于调试符号问题。当代码中出现未定义或重定义的符号时,nm 命令可以帮助查找根本原因。通过检查符号表,可以确定符号的来源和定义方式,从而简化调试过程。

nm 命令是 Linux 系统中一个功能强大的工具,用于解析符号表并提供有关代码符号的宝贵信息。对于逆向工程、调试和理解代码依赖关系,它都是不可或缺的。通过熟练掌握 nm 命令的语法和选项,系统管理员和开发人员可以深入了解代码结构并轻松解决符号问题。

2024-12-09


上一篇:华为鸿蒙系统的深入体验与技术解析

下一篇:Windows系统轻点:优化系统性能的Insider秘诀

新文章
揭秘华为荣耀70的系统之谜:HarmonyOS、Android与分布式生态的深度剖析
揭秘华为荣耀70的系统之谜:HarmonyOS、Android与分布式生态的深度剖析
3分钟前
深度解析:Linux系统精简与性能优化实践
深度解析:Linux系统精简与性能优化实践
7分钟前
iOS系统字体添加与管理:从开发者集成到用户自定义的全方位解析
iOS系统字体添加与管理:从开发者集成到用户自定义的全方位解析
11分钟前
Linux内核恐慌深度解析:从触发机制、诊断到系统恢复的专家指南
Linux内核恐慌深度解析:从触发机制、诊断到系统恢复的专家指南
16分钟前
解锁鸿蒙:华为分布式操作系统资源包的专业解析与生态洞察
解锁鸿蒙:华为分布式操作系统资源包的专业解析与生态洞察
26分钟前
深度解析Android流量消耗之谜:系统级与应用级数据“偷跑”根源、诊断及终极解决方案
深度解析Android流量消耗之谜:系统级与应用级数据“偷跑”根源、诊断及终极解决方案
30分钟前
华为HarmonyOS平板:入门级硬件上的分布式操作系统深度解析
华为HarmonyOS平板:入门级硬件上的分布式操作系统深度解析
39分钟前
Android底部导航栏深度定制:从应用层到系统级的专业解析
Android底部导航栏深度定制:从应用层到系统级的专业解析
43分钟前
跨界融合的梦想:苹果硬件运行安卓系统的技术挑战与生态壁垒
跨界融合的梦想:苹果硬件运行安卓系统的技术挑战与生态壁垒
52分钟前
Intel Atom Z3735F 与 Android 系统深度解析:x86架构下的移动操作系统挑战与机遇
Intel Atom Z3735F 与 Android 系统深度解析:x86架构下的移动操作系统挑战与机遇
1小时前
热门文章
iOS 系统的局限性
iOS 系统的局限性
12-24 19:45
Linux USB 设备文件系统
Linux USB 设备文件系统
11-19 00:26
Mac OS 9:革命性操作系统的深度剖析
Mac OS 9:革命性操作系统的深度剖析
11-05 18:10
华为鸿蒙操作系统:业界领先的分布式操作系统
华为鸿蒙操作系统:业界领先的分布式操作系统
11-06 11:48
**三星 One UI 与华为 HarmonyOS 操作系统:详尽对比**
**三星 One UI 与华为 HarmonyOS 操作系统:详尽对比**
10-29 23:20
macOS 直接安装新系统,保留原有数据
macOS 直接安装新系统,保留原有数据
12-08 09:14
Windows系统精简指南:优化性能和提高效率
Windows系统精简指南:优化性能和提高效率
12-07 05:07
macOS 系统语言更改指南 [专家详解]
macOS 系统语言更改指南 [专家详解]
11-04 06:28
iOS 操作系统:移动领域的先驱
iOS 操作系统:移动领域的先驱
10-18 12:37
华为鸿蒙系统:全面赋能多场景智慧体验
华为鸿蒙系统:全面赋能多场景智慧体验
10-17 22:49