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.pswp.cn/news/918643.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下cuda的安装和配置

今天开始做一个cuda教程。由于本人主要在windows下使用visual studio进行开发,因此这里讲一下windows下的cuda开发环境。 下载cuda_toolkit 从网站https://developer.nvidia.com/cuda-toolkit中下载,先选择Download Now,然后跳转到如下页面&#xff1a…

【代码随想录day 19】 力扣 450.删除二叉搜索树中的节点

视频讲解:https://www.bilibili.com/video/BV1tP41177us/?share_sourcecopy_web&vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解:https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%A…

智慧养老丨实用科普+避坑指南:科技如何让晚年生活更安全舒适?

随着老龄化社会的到来,智慧养老产品逐渐成为改善老年人生活质量的重要工具。从智能手表到便携洗浴机,科技正为老年人的健康、安全与生活便利提供创新解决方案。我们这次主要介绍四类典型智慧养老产品,结合真实体验给出选购建议,并…

系统垃圾清理批处理脚本 (BAT)

系统垃圾清理批处理脚本 (BAT) 以下是一个Windows系统垃圾清理的批处理脚本,它可以清理常见的系统临时文件、缓存和日志等: echo off title 系统垃圾清理工具 color 0a echo. echo 正在清理系统垃圾文件,请稍候... echo.:: 清理临时文件 echo…

Terraform的零基础学习教程

一、Terraform 是什么? Terraform 是由 HashiCorp 开发的开源工具,用于自动化管理云基础设施(如 AWS、Azure、GCP 等)。 核心特点: 基础设施即代码(IaC):用代码定义和管理资源。跨…

429. N 叉树的层序遍历(中等)题解

题目描述给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root [1,…

Java 课程,每天解读一个简单Java之题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package ytr250813;import java.io.IOException;public class CharacterCounter {public static void main(String[] args) throws IOException {// 初始化计数器变量int letterCount 0; // 英文字母计数器int spaceCount 0; // 空格计数器int digitCount 0; // 数字计数器i…

GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档

一、环境准备1. 服务器准备一台Linux服务器(CentOS/Ubuntu皆可),推荐至少4核8GB内存已安装 Docker(及 Docker 服务已启动)已安装 GitLab Runner2. 服务器上安装 Docker (如果没装)# CentOS9以下…

LCP 17. 速算机器人

目录 题目链接: 题目: 解题思路: 代码: 总结: 题目链接: LCP 17. 速算机器人 - 力扣(LeetCode) 题目: # LCP 17. 速算机器人 小扣在秋日市集发现了一款速算机器人。…

Spring cloud集成ElastictJob分布式定时任务完整攻略(含snakeyaml报错处理方法)

ElasticJob 是一款轻量级、可扩展的分布式定时任务解决方案,基于 Quartz 二次开发,支持任务分片、失效转移、任务追踪等功能,非常适合在 Spring Cloud 微服务场景中使用。我将带你完成 Spring Cloud 集成 ElasticJob 的全过程,并分…

了解 Linux 中的 /usr 目录以及 bin、sbin 和 lib 的演变

Linux 文件系统层次结构是一个复杂且引人入胜的体系,其根源深植于类 Unix 操作系统的历史之中。在这一结构的核心,/usr 目录是一个至关重要的组成部分,随着时间的推移,它经历了显著的演变。与此同时,/bin、/sbin、/lib…

高级IO(五种IO模型介绍)

文章目录一、IO为什么慢?一、阻塞IO二、非阻塞IO三、信号驱动IO四、IO多路复用五、异步IO一、IO为什么慢? IO操作往往都是和外设交互,比如键盘、鼠标、打印机、磁盘。而最常见的就是内存与磁盘的交互,要知道磁盘是机械设备&#…

第十二节:粒子系统:海量点渲染

第十二节:粒子系统:海量点渲染 引言 粒子系统是创造动态视觉效果的神器,从漫天繁星到熊熊火焰,从魔法特效到数据可视化,都离不开粒子技术。Three.js提供了强大的粒子渲染能力,可轻松处理百万级粒子。本文将…

LeetCode Day5 -- 二叉树

目录 1. 啥时候用二叉树? (1)典型问题 (2)核心思路 2. BFS、DFS、BST 2.1 广度优先搜索BFS (1)适用任务 (2)解决思路​​:使用队列逐层遍历 2.2 深度…

<c1:C1DateTimePicker的日期时间控件,控制日期可以修改,时间不能修改,另外控制开始时间的最大值比结束时间小一天

两个时间控件 <c1:C1DateTimePicker Width"170" EditMode"DateTime" CustomDateFormat"yyyy-MM-dd" CustomTimeFormat"HH:mm:ss" Style"{StaticResource ListSearch-DateTimePicker}" x:Name"dateTimePicker"…

文件完整性监控工具:架构和实现

文件完整性监控(FIM)作为一道关键的防御层&#xff0c;确保系统和网络中文件及文件夹的完整性与安全性。文件完整性监控工具通过监控关键文件的变更并检测未经授权的修改&#xff0c;提供关于潜在安全漏洞、恶意软件感染和内部威胁的早期警报。为了使文件完整性监控工具发挥实效…

Linux信号量和信号

1.温故知新上一篇博客&#xff0c;我们又知道了一种进程间通信的方案&#xff1a;共享内存。它是在物理内存中用系统调用给我们在物理内存开辟一个共享内存&#xff0c;可以由多个进程的页表进行映射&#xff0c;共享内存不和管道一样&#xff0c;它的生命周期是随内核的&#…

腾讯测试岗位面试真题分析

以下是对腾讯测试工程师面试问题的分类整理、领域占比分析及高频问题精选&#xff08;基于​​92道问题&#xff0c;总出现次数118次​​&#xff09;。问题按​​7大技术领域​​划分&#xff0c;高频问题标注优先级&#xff08;1-5&#x1f31f;&#xff09;&#xff1a; 不…

全面解析远程桌面:功能实现、性能优化与安全防护全攻略

远程桌面技术已成为工作与生活中不可或缺的协作工具&#xff0c;但在实际应用中&#xff0c;用户常遇到连接失败、卡顿延迟、安全隐患等问题。本文从远程桌面功能原理、网络与性能优化、安全防护策略、跨平台兼容性等角度&#xff0c;详细解析常见问题的解决方案&#xff0c;并…

【问题】Mybatis-plus框架使用@Select注解编写查询SQL,json字段查询转换失败

问题描述在使用mybaits-plus的时候定义的Mapper接口实现了BaseMapper&#xff0c;没有编写Mapper对应的xml&#xff0c;大部分查询使用框架的接口进行查询基本属性返回都是正常&#xff0c;复杂对象在sql中会进行查询&#xff0c;但是返回对象中却未包含相关属性。问题原因 没有…