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

nm命令和nm -D命令参数

出现这种差异的原因在于:动态库中的符号分为两种类型

  • 常规符号表(regular symbol table):通常用于静态链接和调试,默认不包含在动态库中(除非显式保留)。
  • 动态符号表(dynamic symbol table):专门用于动态链接,始终存在于动态库中,供运行时解析符号。

具体解释:

  1. nm默认查看的是常规符号表
    如果动态库在编译时通过-fvisibility=hiddenstrip命令移除了常规符号表(为减小体积或保护代码),nm会显示"no symbols"。

  2. nm -D强制查看动态符号表(.dynsym段)
    动态链接器(如ld.so仅依赖动态符号表解析符号,因此即使常规符号表被剥离,动态符号表仍必须保留(除非库被完全strip -R .dynsym,但这会导致库无法使用)。

如何验证?

  • 检查动态符号表是否存在:
    readelf -S libxxx.so | grep dynsym
    若存在.dynsym段,则nm -D必然有输出。

  • 检查是否被剥离:
    file libxxx.so
    输出若包含stripped,说明常规符号表已被移除,但动态符号表可能仍存在。

总结:

  • nm看不到符号 → 常规符号表被剥离(不影响动态链接)。
  • nm -D能看到符号 → 动态符号表正常(足够动态链接使用)。

这是动态库优化后的正常现象,无需担心功能问题。

二、常规符号表的作用

常规符号表(regular symbol table,通常是.symtab.strtab段)只在静态链接和调试阶段有用,对动态库的正常运行完全没有作用。具体用途如下:


1. 调试(Debug)

  • 作用:为调试器(如gdb)提供符号信息(函数名、变量名、行号等)。
  • 例子
    如果动态库保留了常规符号表,调试时可以准确看到崩溃栈中的函数名:
    #0  0x00007ffff7a8b2c4 in my_function() from libxxx.so
    
    如果符号表被剥离,只能看到地址:
    #0  0x00007ffff7a8b2c4 in ?? from libxxx.so
    

2. 静态链接(Static Linking)

  • 作用:如果某个**静态库(.a文件)**需要链接这个动态库中的符号,常规符号表是必需的。
  • 例子
    假设libxxx.so中有函数foo(),如果另一个静态库libbar.a需要在编译时链接foo(),则需要libxxx.so的常规符号表来解析foo()的地址。
    (但这种情况极少见,因为动态库通常不会用于静态链接。)

3. 分析工具(如nmobjdump

  • 作用:帮助开发者检查库的内部符号(如是否有未导出的全局符号)。
  • 例子
    nm libxxx.so可以查看所有符号(包括未导出的),而nm -D libxxx.so只能看到动态符号表(导出的符号)。

4. 性能分析(Profiling)

  • 作用perf等性能分析工具依赖符号表将地址转换为函数名。
  • 例子
    如果符号表被剥离,perf report只能显示十六进制地址,无法直观看到热点函数。

常规符号表 vs 动态符号表

特性常规符号表(.symtab动态符号表(.dynsym
作用调试、静态链接动态链接
是否必须存在否(可剥离)是(必须存在)
工具查看nmobjdump -tnm -Dreadelf -sD
大小较大(含所有符号)较小(仅导出符号)

结论:

  • 对最终用户:常规符号表完全无用,可以安全strip(如strip libxxx.so)。
  • 对开发者:建议保留调试版(带符号表)用于调试,发布版剥离符号表以减小体积。
http://www.xdnf.cn/news/1293733.html

相关文章:

  • Docker部署 Neo4j 及集成 APOC 插件:安装与配置完整指南(docker-compose)
  • python的游戏评级论坛系统
  • [AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库
  • 《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》
  • 实盘回测一体的期货策略开发:tqsdk获取历史数据并回测,附python代码
  • Java 基础概念笔记
  • davici configurator 报错:License file of SIP has no valid checksum.
  • GitHub宕机时的协作方案
  • 如何使用 Ollama 在本地设置并运行 Qwen3
  • Git核心机制:工作区、暂存区与版本库
  • PyTorch Tensor完全指南:深度学习数据操作的核心艺术
  • Windows基础概略——第一阶段
  • 锂电池自动化生产线:智能制造重塑能源产业格局
  • 全球AI安全防护迈入新阶段:F5推出全新AI驱动型应用AI安全解决方案
  • C语言——深入理解指针(三)
  • YOLOv11+TensorRT部署实战:从训练到超高速推理的全流程
  • TeamViewer 以数字化之力,赋能零售企业效率与客户体验双提升
  • ROS2实用工具
  • 前端工程师的技术成长路线图:从入门到专家
  • 黑盒测试:用户视角下的软件“体检”
  • 自动驾驶轨迹规划算法——Apollo EM Planner
  • C++QT HTTP与HTTPS的使用方式
  • Pytest项目_day14(参数化、数据驱动)
  • 基于SpringBoot+Vue的智能消费记账系统(AI问答、WebSocket即时通讯、Echarts图形化分析)
  • 挂糊:给食材穿层 “黄金保护衣”
  • 量子安全新纪元:F5发布全新AI驱动的全栈式后量子加密AI安全方案
  • 美团搜索推荐统一Agent之交互协议与多Agent协同
  • 【P21】OpenCV Python——RGB和BGR,HSV和HSL颜色空间,及VScode中报错问题解决
  • 408每日一题笔记 41-50
  • 车载软件架构 --- MCU刷写擦除相关疑问?