【Linux 系統調試】Linux 調試工具strip使用方法

?

目錄

?

一.?strip?工具的定義與核心作用?

?1.?strip?是什么??

2.?strip?工具調試符號的作用?

3. strip?工具調試符號的重要性?

二. 如何確認文件是否被?strip?處理??

1. 通過?file?命令檢查文件狀態

2.?strip?的典型用法?

?基礎命令格式?

?常用選項?

?實戰示例?

3. 開發與發布場景的最佳實踐?

4. 編譯時避免意外?strip?的要點?

?三.?構建系統配置?示例

?1.?CMake 禁用 strip?

?2. Makefile 禁用 strip?

?3. 自動化流程驗證?

?4. 安全與防篡改?

?5.1 文件權限控制?

?5.2 哈希校驗?

?5. 常見問題與解決方案?

6. 附錄:命令速查表?

7.關鍵操作總結?


一.?strip?工具的定義與核心作用?

?1.?strip?是什么??

strip?是 ?GNU Binutils 工具集?中的關鍵組件,專門用于?移除可執行文件、動態庫(.so)和靜態庫(.a)中的符號表(symbol table)和調試信息(debug info)?。其核心作用包括:

  • ?減小文件體積?:移除調試符號后,可執行文件大小可減少 20%~50%

  • ?提升安全性?:避免通過符號表逆向分析程序邏輯

  • ?優化發布版本?:適用于最終產品發布,但會破壞調試能力

2.?strip?工具調試符號的作用?

調試符號(Debug Symbols)是編譯時嵌入到可執行文件中的元數據,包含以下信息:

  • 變量名、函數名、源碼行號

  • 代碼與內存地址的映射關系

  • 動態鏈接庫(DLL/SO)的依賴關系

3. strip?工具調試符號的重要性?

  • ?調試能力?:支持 GDB、LLDB 等工具進行源碼級調試。

  • ?問題定位?:通過崩潰地址(如?0x7f1c8d8d6a56)快速定位源碼位置。

  • ?性能分析?:結合 Profiler(如 perf)分析代碼熱點。

二. 如何確認文件是否被?strip?處理??

1. 通過?file?命令檢查文件狀態

file demo # 若輸出包含 "not stripped",表示保留調試信息

示例輸出:

demo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, ‌**not stripped**‌

若顯示 ?stripped?,則說明文件已被處理,無法通過?gdb?或?addr2line?調試。

2.?strip?的典型用法?

?基礎命令格式?

strip [選項] <文件>

?常用選項?
選項作用
-s移除所有符號表(包括調試信息)68
-g僅移除調試信息,保留其他符號(適用于部分場景的調試)67
--strip-debug等同于?-g,移除?.debug?段(調試信息專用選項)6
--strip-unneeded移除非運行時必需的符號(平衡體積與基本調試能力)68
?實戰示例?
  • ?移除調試信息但保留符號表?:

    strip --strip-debug demo # 保留函數名,但無法通過行號調試
  • ?完全剝離符號信息?(適用于發布):

    strip -s demo # 文件體積最小化,但徹底失去調試能力

3. 開發與發布場景的最佳實踐?

場景操作建議
?開發調試階段?編譯時添加?-g,且?禁止任何形式的?strip?處理?
?正式發布階段?編譯后執行?strip -s?或?strip --strip-all?優化體積
?嵌入式部署?使用交叉編譯版?strip(如?arm-linux-gnueabihf-strip)處理目標文件

4. 編譯時避免意外?strip?的要點?

  • ?禁用?gcc?的自動?strip?:
    確保編譯命令?不含?-s?,?-Wl,--strip-all?選項?

  • ?檢查構建腳本?:
    某些構建系統(如 CMake)默認啟用?Release?模式優化,需顯式關閉?-DCMAKE_BUILD_TYPE=Debug,set(CMAKE_BUILD_TYPE Debug) # Debug模式默認保留符號 set(CMAKE_STRIP "") # 強制禁用strip

  • 自動化流程集成驗證:在 CI/CD 流程中嵌入檢查腳本,檢查所有可執行文件是否被處理
    find ./bin -type f -exec file {} \; | grep -v "not stripped" && exit 1

    若發現?stripped?文件,立即終止流程并報錯

  • 文件防篡改保護:若需防止他人意外執行?strip,可結合防篡改機制

  • 設置文件只讀權限:chmod a-w demo

  • ?哈希校驗:生成并存儲文件的哈希值(如 SHA256),運行時校驗完整性

    ha256sum demo > demo.sha256 # 生成哈希 sha256sum -c demo.sha256 # 運行前校驗

    若哈希不匹配,提示文件已被篡改

?三.?構建系統配置?示例

?1.?CMake 禁用 strip?

set(CMAKE_BUILD_TYPE Debug) set(CMAKE_STRIP "") # 禁用 strip

?2. Makefile 禁用 strip?

demo: main.c gcc -g -o $@ $^ # release: demo # 注釋掉 strip 操作 # strip demo

?3. 自動化流程驗證?

  • ?CI/CD 集成檢查?:

    find ./bin -type f -exec file {} \; | grep -v "not stripped" && exit 1

?4. 安全與防篡改?

  • ?5.1 文件權限控制?

chmod a-w demo # 禁止寫入,防止意外修改

  • ?5.2 哈希校驗?

sha256sum demo > demo.sha256 # 生成哈希 sha256sum -c demo.sha256 # 運行前校驗

?5. 常見問題與解決方案?

?問題??解決方案?
addr2line?無法解析地址確認編譯時添加了?-g?且未執行?strip
ASan 報告地址偏移設置?ASAN_OPTIONS=symbolize=1
動態庫地址解析失敗安裝帶調試符號的庫(如?libasan5-dbg

6. 附錄:命令速查表?

?操作??命令?
檢查是否保留調試符號file demo
編譯保留調試符號gcc -g -o demo main.c
解析地址addr2line -e demo 0x7f1c8d8d6a56
啟用 ASangcc -fsanitize=address -o demo main.c

7.關鍵操作總結?

步驟工具/方法作用
文件狀態檢查file?命令快速判斷是否保留符號表27
編譯配置優化禁用?-s?選項確保生成未處理的可執行文件23
構建系統適配CMake/Makefile 配置調整防止自動化流程觸發?strip37
自動化驗證CI/CD 腳本集成攔截被篡改或誤處理的文件46
防篡改增強權限控制 + 哈希校驗雙重保障文件完整性4

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904506.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多模態大模型輕量化探索-開源SmolVLM模型架構、數據策略及其衍生物PDF解析模型SmolDocling

在《多模態大模型輕量化探索-視覺大模型SAM的視覺編碼器》介紹到&#xff0c;縮小視覺編碼器的尺寸&#xff0c;能夠有效的降低多模態大模型的參數量。再來看一個整體的工作&#xff0c;從視覺側和語言模型側綜合考量模型參數量的平衡模式&#xff0c;進一步降低參數量&#xf…

代碼隨想錄第36天:動態規劃9(序列問題)

一、最長遞增子序列&#xff08;Leetcode 300&#xff09; 1.dp數組定義&#xff1a; dp[i] 為以 nums[i] 結尾的最長遞增子序列長度。 2.狀態轉移&#xff1a; dp[i] max(dp[i], dp[j] 1) for all j < i and nums[j] < nums[i] 2.dp數組初始化&#xff1a; 所有 …

【Spring Boot 注解】@SpringBootApplication

文章目錄 SpringBootApplication注解一、簡介二、使用1.指定要掃描的包 SpringBootApplication注解 一、簡介 SpringBootApplication 是 Spring Boot 提供的一個注解&#xff0c;通常用于啟動類&#xff08;主類&#xff09;上&#xff0c;它是三個注解的組合&#xff1a; 1.…

openstack虛擬機狀態異常處理

1、openstack虛擬機task_state狀態異常處理 問題描述&#xff1a; 正常狀態&#xff1a; 異常狀態&#xff1a; 任務狀態應為 無&#xff0c;但該虛擬機為None。無法執行開機、關機等操作。 當前異常狀態下通過命令行關閉虛擬機會報錯&#xff0c;報錯信息如下&#xff1a; […

【數據結構】手撕二叉搜索樹

目錄 二叉搜索樹的概念二叉搜索樹的實現節點類構造函數拷貝構造函數賦值運算符重載析構函數插入函數查找函數刪除函數中序遍歷 二叉搜索樹的應用(k和k/v模型 ) 二叉搜索樹的概念 ?叉搜索樹?稱?叉排序樹&#xff0c;它或者是?棵空樹&#xff0c;或者是具有以下性質的?叉樹…

藍橋杯 20. 倍數問題

倍數問題 原題目鏈接 題目描述 眾所周知&#xff0c;小蔥同學擅長計算&#xff0c;尤其擅長判斷一個數是否是另一個數的倍數。但當面對多個數時&#xff0c;他就比較苦惱了。 現在小蔥給了你 n 個數&#xff0c;希望你從中找出三個數&#xff0c;使得這三個數的 和是 K 的倍…

SpirngAI框架 Advisor API詳解

SpringAI提供了Advisors API來實現請求和響應的攔截&#xff0c;修改&#xff0c;增強Spring應用程序和AI模型的互動。 可以使用ChatClient API來配置現有的advisor&#xff0c;例如&#xff1a; var chatClient ChatClient.builder(chatModel) .defaultAdvisors( new Message…

用go從零構建寫一個RPC(仿gRPC,tRPC)--- 版本1(Client端)

這里我們來實現這個RPC的client端 為了實現RPC的效果&#xff0c;我們調用的Hello方法&#xff0c;即server端的方法&#xff0c;應該是由代理來調用&#xff0c;讓proxy里面封裝網絡請求&#xff0c;消息的發送和接受處理。而上一篇文章提到的服務端的代理已經在.rpc.go文件中…

bpftrace 中使用 bpf_trace_printk

bpf_trace_printk bcc 中可以通過 bpf_trace_printk 來打印輸出 , 同時有個非常有用的功能, 同時輸出到 /sys/kernel/tracing/trace 文件中 比如bcc代碼 // read_trace.c&#xff08;eBPF 內核態代碼&#xff09; #include <vmlinux.h> #include <bpf/bpf_helpers.h…

解決 Chrome 與 Chromedriver 版本不一致問題的方法

目錄 常見錯誤處理 處理方案&#xff1a; 1. 自動版本匹配方法 使用 webdriver-manager 庫&#xff08;推薦&#xff09; 2. 手動版本管理方法 檢查并匹配版本 3. 版本兼容性解決方案 使用兼容性表 4. 自動更新策略 定期檢查更新腳本 5. Docker 容器化方案 最佳實踐建…

【強化學習】強化學習算法 - 多臂老虎機問題

1、環境/問題介紹 概述&#xff1a;多臂老虎機問題是指&#xff1a;智能體在有限的試驗回合 &#x1d447; 內&#xff0c;從 &#x1d43e; 臺具有未知獎賞分布的“老虎機”中反復選擇一個臂&#xff08;即拉桿&#xff09;&#xff0c;每次拉桿后獲得隨機獎勵&#xff0c;目…

pcie協議復位

pcie協議復位共有4中情況&#xff1b;cold reset&#xff1b;warm reset&#xff1b;hot reset&#xff1b;function level reset&#xff1b; 分類&#xff1a; 依據spec 6.6&#xff1a; Conventional reset&#xff08;傳統復位&#xff09;&#xff1a;cold&#xff0c;…

Redis--哈希類型

目錄 一、Hash 哈希 1.2 常用命令 1.2.1 HSET 1.2.2 HGET 1.2.3 HEXISTS 1.2.4 HDEL 1.2.5 HKEYS 1.2.6 HVALS 1.2.7 HGETALL 1.2.8 HMGET 1.2.9 HLEN 1.2.10 HSETNX 1.2.11 HINCRBY 1.2.12 HINCRBYFLOAT 1.3 內部編碼 一、Hash 哈希 幾乎所有的主流編程語言都提…

華為安全認證好還是數通認證好?

在華為認證體系中&#xff0c;安全認證 與數通認證 &#xff08;數據通信&#xff09;是兩個熱門方向&#xff0c;分別面向網絡安全與網絡架構領域。 安全和數通的技術難度對比 市場需求 安全認證&#xff1a;隨著網絡安全形勢日益嚴峻&#xff0c;企業對網絡安全的重視程度不…

Nacos源碼—5.Nacos配置中心實現分析二

大綱 1.關于Nacos配置中心的幾個問題 2.Nacos如何整合SpringBoot讀取遠程配置 3.Nacos加載讀取遠程配置數據的源碼分析 4.客戶端如何感知遠程配置數據的變更 5.集群架構下節點間如何同步配置數據 4.客戶端如何感知遠程配置數據的變更 (1)ConfigService對象使用介紹 (2)客…

電力MOSFET的專用集成驅動電路IR2233

IR2233是IR2133/IR2233/IR2235 系列驅動芯片中的一種,是專為高電壓、高速度的電力MOSFET和IGBT驅動而設計的。該系列驅動芯片內部集成了互相獨立的三組板橋驅動電路,可對上下橋臂提供死區時間,特別適合于三相電源變換等方面的應用。其內部集成了獨立的運算放大器可通過外部橋…

六級閱讀———2024.12卷一 仔細閱讀2

文章 An awakening has been taking place in the physical world against the beauty model that has been dictated to us for years.But in the digital arena,social media determines what is considered beautiful.(51) The two opposing struggles are taking place i…

【C/C++】errno/strerror 和 GetLastError()/FormatMessage 的區別

strerror 和 errno 詳解 printf("Error: %s\n", strerror(errno));這行代碼用于在 C 語言中輸出系統錯誤信息&#xff0c;但它與 Windows 的 GetLastError() 有重要區別。下面我將詳細解釋每個部分及其工作原理。 1. 組件解析 errno 定義&#xff1a;errno 是一個…

Unicode和UTF - 8主要有以下區別

Unicode和UTF - 8主要有以下區別 概念范疇 Unicode:是字符集 。它為世界上幾乎所有的字符(包括各國文字、標點符號、特殊符號等)分配了唯一的編號,這個編號也叫碼位、碼點,比如“中”字的Unicode碼點是U+4E2D 。它規定了字符的抽象表示,只關注字符與數字編號的對應關系,…

企業數字化轉型第二課:接受不完美(1/2)

一.引言 先看一組中國企業數字化轉型相關的數據&#xff1a; 戰略認知層面&#xff1a;92%中國企業將數字化納入戰略核心&#xff08;麥肯錫2023&#xff09;執行困境層面&#xff1a;63%企業轉型首年遭遇重大挫折&#xff08;BCG 2024追蹤&#xff09;價值釋放周期&#xff1…