当前位置: 首页 > 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.lryc.cn/news/620097.html

相关文章:

  • 互联网大厂Java求职面试实录:Spring Boot到微服务与AI的技术问答
  • 《量子雷达》第2章 从量子信息到量子雷达 预习2025.8.13
  • Canal解析MySQL Binlog原理与应用
  • RC4算法实现
  • 一键自动化:Kickstart无人值守安装指南
  • 如何优雅地实现API接口每 10秒轮询请求?
  • 力扣面试150题--三角形最小路径和 最小路径和 不同路径 最长回文子串
  • RagFlow启动源码说明
  • 前后端分离项目在云服务器的部署
  • 【系统安装】虚拟机中安装win10企业版系统记录
  • CSS保持元素宽高比,固定元素宽高比
  • 用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手
  • Python 环境隔离实战:venv、virtualenv 与 conda 的差异与最佳实践
  • 变分自编码器VAE的Pytorch实现
  • day39_2025-08-13
  • Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
  • Day19 C 语言标准 IO 机制
  • React useMemo 深度指南:原理、误区、实战与 2025 最佳实践
  • React常见的Hooks
  • 万字详解C++11列表初始化与移动语义
  • OpenCV的实际应用
  • 类和对象----中
  • 【COMSOL】Comsol学习案例时的心得记录分享
  • Mysql数据库迁移到GaussDB注意事项
  • pycharm配置连接服务器
  • 3.Cursor提效应用场景实战
  • MySQL相关概念和易错知识点(6)(视图、用户管理)
  • 大厂语音合成成本深度对比:微软 / 阿里 / 腾讯 / 火山 API 计费拆解与技术选型指南
  • trace分析之查找点击事件
  • cisco无线WLC flexconnect配置