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
英文地址,請注明出處:http://en.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;但是返回對象中卻未包含相關屬性。問題原因 沒有…