当前位置: 首页 > article >正文

别再只会用objdump了!用nm命令快速定位Linux程序里的函数和变量(附实战调试技巧)

别再只会用objdump了用nm命令快速定位Linux程序里的函数和变量附实战调试技巧在Linux开发环境中当遇到程序崩溃、链接错误或需要逆向分析时开发者往往会条件反射地打开objdump或gdb。但有一个更轻量级的工具被严重低估——nm命令。它能像手术刀一样精准定位二进制文件中的符号信息而无需加载整个调试环境。想象一下这样的场景凌晨三点线上服务突然报undefined reference错误你需要快速确认动态库是否导出了关键函数这时候nm -D libxxx.so | grep func_name可能就是最快的救命稻草。1. 为什么nm命令应该成为你的首选工具与objdump等工具相比nm有三大不可替代的优势速度极快直接解析符号表而不反汇编处理大型二进制文件时优势明显输出简洁专注于符号信息过滤避免反汇编输出的信息过载组合灵活配合grep/awk可以快速构建符号查询管道实际测试对比在4GB大小的Go语言编译产物上# nm执行时间 $ time nm large_binary | wc -l real 0m0.227s # objdump执行时间 $ time objdump -d large_binary | wc -l real 0m12.841s常见符号类型速查表类型说明典型示例T/t文本(代码)段符号函数定义U未定义符号外部引用的函数D/d初始化数据段全局变量B/bBSS段(未初始化数据)未初始化的全局变量C公共符号弱符号定义W/w弱引用符号可选的动态库依赖2. 核心参数实战解决真实开发问题2.1 排查undefined reference错误当链接器报未定义引用时组合使用-u和-D参数# 查看当前目标文件缺失的符号 $ nm -u objfile.o # 检查动态库是否导出所需符号 $ nm -D libtarget.so | grep missing_symbol注意动态库符号查找时务必使用-D参数否则只能看到静态链接符号2.2 分析C名称修饰问题C的重载机制会导致函数名被修饰使用-C参数自动解析# 未经解析的输出 $ nm libsample.a | grep Foo 0000000000000000 T _ZN3Foo3barEi # 使用demangle后的输出 $ nm -C libsample.a | grep Foo 0000000000000000 T Foo::bar(int)2.3 逆向分析中的符号定位逆向工程时快速定位关键函数地址# 按地址排序并显示大小信息 $ nm -nS target_binary | grep -A5 main 0000000000401120 0000000000000025 T main 0000000000401145 0000000000000015 T helper常用过滤组合# 只查看已定义的文本(代码)符号 $ nm --defined-only target | grep T # 查找所有读写数据区域 $ nm target | egrep [DdBb] 3. 高级技巧融入日常调试工作流3.1 与gdb配合使用在gdb中直接调用nm命令(gdb) shell nm -n $_通过gdb-python扩展自动加载符号信息import gdb import subprocess class NmSymbols(gdb.Command): def __init__(self): super().__init__(nm-syms, gdb.COMMAND_USER) def invoke(self, arg, from_tty): output subprocess.check_output(fnm -C {arg}, shellTrue) gdb.write(output.decode()) NmSymbols()3.2 自动化符号检查脚本创建符号验证脚本check_syms.sh#!/bin/bash # 检查二进制文件是否包含所有必需的符号 required_syms($) binary${required_syms[-1]} unset required_syms[-1] available_syms$(nm -D $binary | awk {print $3}) for sym in ${required_syms[]}; do if ! grep -q $sym $available_syms; then echo [ERROR] Missing symbol: $sym 2 exit 1 fi done使用示例$ ./check_syms.sh malloc free pthread_create /lib/x86_64-linux-gnu/libc.so.64. 特殊场景深度应用4.1 分析动态库符号冲突当遇到symbol already defined错误时# 查找重复定义的全局符号 $ nm -g lib1.o lib2.o | awk / [A-Z] / {print $3} | sort | uniq -d4.2 检查符号可见性使用--visibility参数需配合新版binutils# 检查隐藏符号 $ nm --visibilityhidden libtarget.so # 检查默认可见性符号 $ nm --visibilitydefault libtarget.so4.3 内核模块符号分析针对Linux内核模块的特殊处理# 需要先提取符号表 $ nm --uniquify *.ko | grep [Tt] # 结合modinfo使用 $ modinfo -F depends mymodule.ko | xargs nm -D5. 性能优化实战案例5.1 减少符号表体积通过strip控制符号级别# 保留调试符号 $ strip --strip-debug binary # 完全去除符号表 $ strip --strip-all binary5.2 符号缓存加速对大型项目建立符号缓存# 建立符号数据库 find . -name *.so -exec nm -D {} \; syms.db # 快速查询 makesymdb() { find $1 -type f -exec file {} \; | grep -E ELF.*(executable|shared object) | cut -d: -f1 | xargs nm -D 2/dev/null syms.db } query_symdb() { grep -w $1 syms.db | awk {print $NF} | sort -u }在最近处理的一个性能敏感项目中通过nm --size-sort发现几个异常巨大的符号最终定位到是模板实例化爆炸问题。相比直接反汇编整个二进制nm让这类分析变得异常高效——这也是为什么我现在总是优先考虑nm而不是objdump。

相关文章:

别再只会用objdump了!用nm命令快速定位Linux程序里的函数和变量(附实战调试技巧)

别再只会用objdump了!用nm命令快速定位Linux程序里的函数和变量(附实战调试技巧) 在Linux开发环境中,当遇到程序崩溃、链接错误或需要逆向分析时,开发者往往会条件反射地打开objdump或gdb。但有一个更轻量级的工具被严…...

3个步骤,让顽固窗口乖乖听话:WindowResizer窗口调整魔法

3个步骤,让顽固窗口乖乖听话:WindowResizer窗口调整魔法 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾经遇到过这样的烦恼?某个重要软…...

不止于回归:用Stata玩转时间序列预测与面板数据模型(实战案例解析)

不止于回归:用Stata玩转时间序列预测与面板数据模型(实战案例解析) 在数据分析的进阶领域,时间序列与面板数据模型如同两把瑞士军刀,能切开复杂现实问题的坚硬外壳。当宏观经济指标在时间维度上波动起伏,当…...

LyricsX终极指南:macOS上最强大的歌词同步工具

LyricsX终极指南:macOS上最强大的歌词同步工具 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是macOS平台上最专业的歌词同步软件,能够智能识别当前播放的…...

华硕笔记本终极控制方案:10MB轻量级工具G-Helper完全指南

华硕笔记本终极控制方案:10MB轻量级工具G-Helper完全指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...

Dify插件开发实战指南:手把手完成OAuth2集成、LLM路由与状态持久化(附GitHub高星模板)

第一章:Dify插件开发入门与核心架构解析Dify 插件机制是其扩展能力的核心支柱,允许开发者以标准化方式接入外部服务、增强 LLM 应用的上下文感知与执行能力。插件基于 OpenAPI 3.0 规范定义,通过 YAML 或 JSON 描述接口契约,并由 …...

告别重复劳动:30个Illustrator脚本让你的设计效率提升300%

告别重复劳动:30个Illustrator脚本让你的设计效率提升300% 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾为Illustrator中重复性的操作感到疲惫?从…...

Windows更新修复终极指南:一键解决更新卡顿、失败与错误代码问题

Windows更新修复终极指南:一键解决更新卡顿、失败与错误代码问题 【免费下载链接】Script-Reset-Windows-Update-Tool This script reset the Windows Update Components. 项目地址: https://gitcode.com/gh_mirrors/sc/Script-Reset-Windows-Update-Tool 还…...

GraalVM Native Image内存优化实战手册(含JFR+Native Memory Tracking双验证数据)

第一章:GraalVM Native Image内存优化面试概览在Java生态的高性能场景中,GraalVM Native Image已成为高频考察点,尤其在一线大厂后端与中间件岗位的深度技术面试中,内存优化相关问题常作为区分候选人的关键维度。Native Image将JV…...

STM32F407ZET6主控工控板:全面集成PLC与IO卡控制,8路高速脉冲输出与多路光耦隔...

主控STM32F407ZET6控制板PLC工控板FX3U,FX5U,控制IO卡 STM32F407ZET6工控板,包括pcb,原理图 ,/PLC STMF32F407ZET6/FX-3U/PCB生产方案,喜欢可直接联系。 不提供。 板载资源介绍 1. 8路高速脉冲加方向输出,带光耦隔离 2. 16路低速输出,加光耦和…...

如何用Botty轻松实现暗黑破坏神2重制版自动化:5个核心功能解析

如何用Botty轻松实现暗黑破坏神2重制版自动化:5个核心功能解析 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty 厌倦了在《暗黑破坏神2:重制版》中重复刷怪、捡装备的枯燥操作吗?Botty这款智…...

5分钟快速上手FF14动画跳过插件:告别冗长副本动画

5分钟快速上手FF14动画跳过插件:告别冗长副本动画 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip 还在为《最终幻想14》副本中冗长的动画而烦恼吗?这款专为CN服务器设计的智能跳…...

Loom协程+Spring WebFlux=安全灾难?揭秘2024年生产环境爆发的4类隐蔽竞态漏洞及修复清单

第一章:Loom协程与Spring WebFlux融合演进的必然性与风险图谱随着高并发、低延迟服务需求持续攀升,传统异步非阻塞模型面临抽象层级过深、调试成本高昂、线程上下文管理复杂等结构性瓶颈。Spring WebFlux 基于 Reactor 的响应式编程范式虽显著提升了资源…...

实战复盘:一次从PTH到PTT的完整内网横向移动(附Mimikatz、Kekeo命令实录)

域渗透实战:哈希与票据传递技术的攻防全景解析 当安全工程师第一次拿到域内某台主机的控制权时,眼前展开的往往是一个错综复杂的网络迷宫。如何从这台跳板机出发,逐步扩大控制范围直至域控服务器?这就像在黑暗森林中寻找一条隐蔽的…...

TongWeb部署实战:如何用Domain域搞定应用隔离、故障隔离与集群扩展?

TongWeb Domain域实战:应用隔离与集群扩展的架构艺术 在服务器资源有限而业务需求无限的矛盾中,如何优雅地实现应用隔离与资源扩展?这就像在一栋大楼里既要保证每个住户的隐私,又要确保公共设施的高效共享。TongWeb的Domain域设计…...

SpringMVC参数解析器实战:从@RequestBody到@RequestParam,手把手教你自定义参数绑定

SpringMVC参数解析器实战:从RequestBody到RequestParam,手把手教你自定义参数绑定 在构建现代RESTful API时,参数绑定是每个Spring开发者必须掌握的技能。想象一下这样的场景:你的API需要同时处理JSON请求体、URL路径变量、查询参…...

定时任务调度

定时任务调度:自动化管理的智慧引擎 在现代信息化系统中,定时任务调度是确保业务高效运行的核心技术之一。无论是每天凌晨的数据备份,还是每周的报表生成,亦或是电商平台的秒杀活动预热,都离不开定时任务的精准调度。…...

如何快速将HTML游戏打包成桌面应用:3步完成专业级跨平台分发

如何快速将HTML游戏打包成桌面应用:3步完成专业级跨平台分发 【免费下载链接】twine-app-builder Automatically generate Windows and macOS versions of your Twine games, for free! 项目地址: https://gitcode.com/gh_mirrors/tw/twine-app-builder 你是…...

单片机Flash不够用?手把手教你用AT24C256存储30张BMP图片(附完整代码)

突破单片机Flash限制:用AT24C256实现30张BMP图片存储的完整方案 当你在开发一个需要显示多张图片的单片机项目时,Flash存储空间不足是一个常见痛点。最近我在一个OLED显示项目中就遇到了这个问题——需要显示30张12864分辨率的BMP图片,但单片…...

深入UE5 Nanite:从“模型变黑”理解虚拟几何体的技术边界与最佳实践

深入UE5 Nanite:从“模型变黑”理解虚拟几何体的技术边界与最佳实践 当你在UE5中首次启用Nanite时,可能会遇到一个令人困惑的现象:某些模型突然变成了全黑色。这不是简单的材质错误或光照问题,而是触及了虚拟几何体技术的核心设计…...

别再只盯着Kaggle了!这10个免费数据源网站,让你数据分析项目素材不重样

解锁数据分析新视野:10个鲜为人知的免费数据宝藏平台 当你在深夜对着电脑屏幕,反复加载着Kaggle上那个已经被无数人用过的泰坦尼克号数据集时,是否曾想过——数据分析的世界远不止于此?真正有价值的数据分析项目,往往始…...

别再手动翻官网了!用Python脚本自动爬取CKEditor历史漏洞与安全更新(附完整代码)

高效获取CKEditor安全情报:Python自动化爬虫实战指南 每次安全审计前,团队总要花几小时手动翻找CKEditor的漏洞公告?作为经历过这种低效工作模式的安全工程师,我开发了一套自动化解决方案。这个工具不仅能抓取所有历史漏洞&#x…...

python学习-xx10-2进程与线程【⭐】

1进程详解与应用1、概念进程:程序运行的实例,执行的过程,它是系统调度与资源分配基本单元比如使用python运行一个.py的过程,这就是一个进程,当它运行的时候系统/计算机就会为它分配相应的运行空间,当它运行…...

解放双手!明日方舟自动化助手MAA:让游戏回归乐趣的智能解决方案

解放双手!明日方舟自动化助手MAA:让游戏回归乐趣的智能解决方案 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项…...

RDK X5 量化工具链环境搭建完整指南(Ubuntu 22.04 LTS + GPU版——RTX5080)

RDK X5 量化工具链环境搭建完整指南(Ubuntu 22.04 LTS GPU版——RTX5080) 适用场景:物理机 Ubuntu 22.04 LTS NVIDIA 5080独立显卡,用于地平线 RDK X5 模型量化部署 工具链版本:OpenExplorer v1.2.8-py310 验证环境&…...

OpenUtau终极免费开源音乐合成神器:零基础打造专属虚拟歌手完整指南

OpenUtau终极免费开源音乐合成神器:零基础打造专属虚拟歌手完整指南 【免费下载链接】OpenUtau Open singing synthesis platform / Open source UTAU successor 项目地址: https://gitcode.com/gh_mirrors/op/OpenUtau 你是否曾梦想创作属于自己的虚拟歌手歌…...

GetQzonehistory:3步完成QQ空间历史说说一键导出备份指南

GetQzonehistory:3步完成QQ空间历史说说一键导出备份指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间中的珍贵回忆会随着时间流逝而消失?…...

从苹果到OPPO:一个uni-app应用的多平台商店上架全流程复盘与避坑清单

从苹果到OPPO:一个uni-app应用的多平台商店上架全流程复盘与避坑清单 当你的uni-app项目终于完成开发,准备在各大应用商店上架时,可能会发现这比开发本身还要复杂。每个平台都有自己独特的规则和要求,稍有不慎就会陷入反复修改、反…...

如何快速掌握Salt Player歌词系统:终极配置指南

如何快速掌握Salt Player歌词系统:终极配置指南 【免费下载链接】SaltPlayerSource Salt Player (A local music player trusted and chosen by hundreds of thousands of users) for Android Release, Feedback. 项目地址: https://gitcode.com/GitHub_Trending/…...

ChemCrow:如何用AI大语言模型解决化学推理难题

ChemCrow:如何用AI大语言模型解决化学推理难题 【免费下载链接】chemcrow-public Chemcrow 项目地址: https://gitcode.com/gh_mirrors/ch/chemcrow-public 传统化学研究面临的核心挑战在于如何将复杂的分子结构分析、反应预测和专利检索等任务与智能化推理相…...