当前位置: 首页 > 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.dtcms.com/a/330280.html

相关文章:

  • 19. 重载的方法能否根据返回值类型进行区分
  • Java之String类
  • 3.Cursor提效应用场景实战
  • UEdior富文本编辑器接入AI
  • 算法篇----分治(归并排序)
  • 云电竞盒子对游戏性能有影响吗?
  • 手游业务怎么做防护
  • 智慧城市数字孪生:城市管理的“平行宇宙”
  • 补环境基础(四) Hook插件
  • 黎阳之光立体物业透明管理:开启智慧物业新时代
  • 设计原则之【抽象层次一致性(SLAP)】,方法也分三六九等
  • 安装Win10怎样跳过欢迎界面
  • ant-design a-from-model的校验
  • poetry
  • 《深入解析C++中的Map容器:键值对存储的终极指南》
  • 基于51单片机zigbee的病房呼叫系统
  • Datawhale AI夏令营 「2025全球AI攻防挑战赛-赛道一:图片全要素交互认证-生成赛」的赛事项目实践
  • springboot接口请求参数校验
  • 双椒派E2000D系统盘制作全攻略
  • 在腾讯云CodeBuddy上实现一个AI聊天助手
  • 实盘回测一体的期货策略开发:tqsdk获取历史数据并回测,附python代码
  • java循环分页查询数据,任何把查询到的数据,分批处理,多线程提交到数据库清洗数据
  • 第十二节:粒子系统:海量点渲染
  • 远程办公,如何轻松访问公司内网?出差在外也能远程控制局域网内电脑、外网直接连接到指定端口应用
  • 基于通用优化软件GAMS的数学建模和优化分析(GAMS安装和介绍、GAMS程序编写、GAMS程序调试)
  • Ubuntu22.04轻松安装Qt与OpenCV库
  • 【力扣】面试经典150题总结02-双指针、滑动窗口
  • Kubernetes 网络排错
  • 《嵌入式Linux应用编程(四):Linux Framebuffer图形编程》
  • 数学建模算法-day[17]