linux程序分析命令(一)

linux程序分析命令(一)

  • **ldd:**用于打印共享庫依賴。這個命令會顯示出一個可執行文件所依賴的所有共享庫(動態鏈接庫),這對于解決運行時庫依賴問題非常有用。
  • **nm:**用于列出對象文件的符號表。這個命令可以顯示出定義和引用的符號,對于理解程序結構和調試非常有幫助。
  • objdump:顯示二進制文件的信息。這個命令可以用來顯示程序的匯編代碼、段信息等,對于底層分析和調試很有用。
  • strace:跟蹤系統調用。通過這個命令,你可以看到一個程序執行時所有的系統調用,這對于理解程序如何與操作系統交互非常重要。
  • ltrace:跟蹤庫函數調用。與strace類似,但是ltrace專注于跟蹤程序調用庫函數的情況。
  • gdb:GNU調試器。這是一個功能強大的調試工具,可以讓你看到程序執行時的內部情況,比如變量的值、程序的執行流程等。
  • valgrind:內存調試工具。這個工具主要用于檢測內存泄漏、內存損壞等問題,對于提高程序穩定性非常有幫助。
  • readelf:顯示ELF格式文件的信息。這個命令可以顯示出ELF格式的二進制文件(如Linux下的可執行文件和共享庫)的詳細信息,包括段、節、符號等。
  • file:確定文件類型。這個命令可以幫助你識別一個文件是二進制可執行文件、文本文件還是其他類型的文件。
  • size:顯示二進制文件的段大小。這個命令會列出二進制文件各個段(如文本段、數據段)的大小,對于評估程序占用空間有一定幫助。

ldd命令

ldd命令是Linux下一個非常實用的工具,它用于顯示一個可執行文件或共享庫文件的依賴關系。基本上,它會列出程序運行所需要的所有共享庫。

下面是ldd的基本用法和一些常見的使用場景。

基本用法

#命令格式:
ldd [選項] 文件...
#文件...:指定要檢查的可執行文件或共享庫文件。

最簡單的用法是直接跟上你想要檢查的文件名:

ldd /path/to/your/program
#這條命令會列出/path/to/your/program這個程序所依賴的所有共享庫。

常見用法
檢查可執行文件的依賴庫:

ldd /usr/bin/ls
#這會顯示ls命令所依賴的所有共享庫。

檢查動態庫的依賴:

#如果你有一個共享庫文件(例如,libexample.so),你可以使用ldd來查看它依賴哪些其他庫:
ldd libexample.so

過濾輸出:

#如果你只對特定的依賴感興趣,可以使用管道和grep命令來過濾輸出。例如,如果你只想看看是否依賴于libc.so.6:
ldd /path/to/your/program | grep libc.so.6

解決“不是動態可執行文件”錯誤:

如果你嘗試對靜態鏈接的可執行文件使用ldd,你可能會收到一個錯誤消息說“不是動態可執行文件”。這意味著該文件沒有使用動態鏈接。在這種情況下,沒有依賴關系可以顯示。

使用ldd調試加載問題:

當你的程序因為缺少某個共享庫而不能啟動時,ldd可以幫助你快速識別缺少了哪個庫。然后,你可以安裝缺少的庫或調整環境變量來解決問題。

高級用法

  1. 使用LD_TRACE_LOADED_OBJECTS環境變量
    ldd實際上是通過設置LD_TRACE_LOADED_OBJECTS=1環境變量來工作的。你可以直接使用這個環境變量來獲取相同的輸出,這在某些特殊情況下可能會有用:
LD_TRACE_LOADED_OBJECTS=1 /path/to/your/program
  1. 檢查程序如何使用特定的共享庫
    如果你想要檢查一個程序是如何使用特定的共享庫的,可以結合使用ldd和nm命令。首先使用ldd找出依賴,然后用nm檢查符號信息:
ldd /path/to/your/program | grep libexample.so
nm -D /path/to/libexample.so
  1. 使用ldd進行安全檢查
    雖然ldd主要用于依賴檢查,但它也可以幫助識別潛在的安全風險。例如,通過檢查程序依賴的庫是否都來自可信路徑,可以幫助識別可能的庫劫持或路徑注入問題。
ldd /path/to/your/program | grep -v "^/"
  1. 解決依賴問題
    當你遇到因缺少共享庫而導致的程序啟動問題時,ldd可以幫助你快速定位缺少哪個庫。通過比較不同環境(例如,開發和生產)下的ldd輸出,你可以找出缺失的依賴。

  2. 結合使用strace
    雖然不是ldd的直接用法,但結合使用strace可以幫助你深入了解程序在運行時的行為,包括它如何加載共享庫。通過觀察程序啟動過程中的系統調用

    strace /path/to/your/program 2>&1 | grep openat  
    

nm 命令

nm命令在Linux中是一個非常有用的工具,它用于列出目標文件的符號表內容。符號表主要包含了程序中各種變量、函數的名稱、類型、地址等信息。

下面是nm命令的一些基本用法:

查看目標文件的符號表:

nm 目標文件名

這將列出目標文件中所有符號的名稱、類型和地址。

只顯示未定義的符號:

nm -u 目標文件名

這個選項 (-u) 只會列出那些未定義的符號,這對于找出缺失的鏈接非常有用。

按大小排序顯示符號:

nm --size-sort 目標文件名

使用 --size-sort 選項可以按照符號大小進行排序顯示,這有助于分析哪些符號占用了較多空間。

只顯示特定類型的符號:

nm --defined-only 目標文件名

通過 --defined-only 選項,可以只列出已定義的符號,忽略未定義的符號。

查看動態鏈接庫中的符號:

 nm -D 動態鏈接庫文件名

-D 或 --dynamic 選項用于查看動態鏈接庫(.so 文件)中的符號。

過濾輸出結果:

nm 目標文件名 | grep 符號名稱

使用管道 (|) 和 grep 命令可以過濾輸出結果,僅顯示與特定符號名稱相關的行。

查看C++程序的符號:

nm -C 目標文件名

-C 或 --demangle 選項用于顯示C++程序中更易讀的符號名稱,因為C++編譯器通常會改變函數名(名字修飾)以支持重載等特性。

解析C++的符號名:

C++程序中的符號名經過編譯器處理后會變得難以閱讀。使用c++filt工具可以將這些符號名解析成更易于理解的形式。

nm 目標文件名 | c++filt

這樣可以使C++的復雜符號名變得可讀。

使用正則表達式過濾符號:

nm命令支持使用正則表達式來過濾顯示的符號,這在你想要查找符合特定模式的符號時非常有用。

nm 目標文件名 | grep '正則表達式'

例如,使用grep '^T’可以過濾出所有類型為T(即在文本段中的符號)的符號。

比較不同版本的二進制文件:
通過比較不同版本的二進制文件中的符號表,可以快速了解兩個版本之間增加或刪除了哪些功能。

nm -an 舊版本文件名 > old_symbols.txt
nm -an 新版本文件名 > new_symbols.txt
diff old_symbols.txt new_symbols.txt

這里,-a選項表示列出所有符號,包括調試符號;-n選項表示按照地址排序。

查看符號的大小:

#使用--print-size選項可以打印每個符號的大小,這對于分析程序占用空間非常有幫助。
nm --print-size 目標文件名

輸出格式化的信息:

#nm命令允許通過--format或者-f選項指定輸出格式,支持的格式包括bsd、sysv、posix等,這有助于根據需求調整輸出信息的格式。
nm --format=sysv 目標文件名

查找靜態庫中未使用的函數:

#創建一個包含所有符號的列表,然后使用nm檢查靜態庫(.a文件)中哪些函數未被使用。
nm --undefined-only 靜態庫文件名

這將列出所有未定義的符號,即可能未被使用的函數。

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

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

相關文章

什么事防抖和節流,有什么區別,如何實現

防抖和節流,本質上是優化高頻率執行代碼的一種手段,比如:resize、scroll、keypress、mousemove這些事件在觸發的時候,會不斷調用綁定在事件上的回調函數,這樣極大浪費資源,降低前端性能。 為了優化體驗&am…

ipa 分區算法分析,圖解

參考 Room Segmentation: Survey, Implementation, and Analysis. 分區算法調查,實現以及評估對比 相關論文 分區算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形態分割 Interactive SLAM using …

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)在C和C等編程語言中扮演著不同的角色,但它們有時在概念上可能會有些重疊。下面是它們之間的主要…

NOR FLASH介紹

參考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH簡介 XIP技術:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特點和應用舉例: NOR Flash: 特點: 支持隨機訪問,可以直接…

QT作業4

1、思維導圖 2、使用定時器完成鬧鐘 頭文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

收集郵票C++題目【概率期望DP+數學推導】

題意 Description 有 n n n 種不同的郵票&#xff0c;皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那里購買&#xff0c;每次只能買一張&#xff0c;并且 買到的郵票究竟是 n n n 種郵票中的哪一種是等概率的&#xff0c;概率均為 1 n \frac{1}{n} n1?。但是由…

【elasticsearch】慢查詢替代查詢審計的嘗試

【elasticsearch】慢查詢替代查詢審計的嘗試 使用了es有兩年了&#xff0c;突然發現一個&#xff0c;es沒有查詢審計日志&#xff0c;某個用戶查詢了某個索引的審計。 找了官方文檔和社區的回復都是說使用slow log替代慢查詢。 嘗試一下。 參考鏈接1&#xff1a;https://discus…

Py深度學習基礎|關于Batch Normalization

1. 為什么需要Batch Normalization 通常我們會在輸入層進行數據的標準化處理&#xff0c;這是為了讓模型學習到更好的特征。同樣&#xff0c;在模型的中間層我們也可以進行normalize。在神經網絡中, 數據分布對訓練會產生影響。 比如我們使用tanh作為激活函數&#xff0c;當輸入…

Baidu Comate智能編碼助手:AI編程時代提升效率的好幫手

目錄 寫在前面一、如何安裝二、如何使用場景需求體驗步驟 三、AI 編程實戰指令功能插件功能知識庫功能 四、問題建議五、體驗總結&#x1f680;寫在最后 寫在前面 Baidu Comate 是基于文心大模型的 AI編程工具&#xff0c;它結合百度積累多年的編程現場大數據和外部優秀開源數據…

MySQL中的多表查詢

數據庫設計范式(范例) 好的數據庫設計&#xff0c;事倍功半&#xff0c;不會有歧義 第一范式&#xff1a;列保證原子性&#xff08;列不可再分解&#xff09; 聯系方式&#xff1a;電話&#xff0c;微信&#xff0c;QQ&#xff0c;郵箱 這些都不可分解 第二范式&#xff1a;要…

annaconda詳細解讀換源文件

annaconda換源詳細解讀文件 annaconda換源詳細解讀文件 annaconda換源詳細解讀文件 #踩坑/annaconda換源詳細解讀通道問題 如何準確使用國內源高效安裝GPU版本的Pytorch - 知乎 文件中的custom通道&#xff0c;需要自己手動添加到默認通道里面&#xff0c;記得后面更上/包名…

在xAnyLabeling中加載自己訓練的yolov8s-obb模型進行半自動化標注

任務思路&#xff1a; 先使用xAnyLabeling標注一部分樣本&#xff0c;訓練出v1版本的yolov8-obb模型&#xff0c;然后加載yolov8-obb模型到xAnyLabeling中對其余樣本進行半自動化標注。節省工作量。 任務流程&#xff1a; 1.準備xAnyLabeling標注工具 下載代碼&#xff0c;…

Redis系列-3 Redis緩存問題

1.緩存的作用 數據庫(如Mysql)的持久化特點帶來了較低的性能&#xff0c;高并發的場景下&#xff0c;連接池很快被耗盡而出現宕機或DOS&#xff0c;無法繼續對外提供服務。相對于數據庫的硬盤IO&#xff0c;緩存中間件基于內存進行讀寫&#xff0c;從而具備較大的吞吐量和高并…

SpringBoot:注解詳解

RequestMapping 注解在類上:表示該類中所有響應請求的方法都以此地址為父路徑 value&#xff08;path&#xff09; 指定請求的實際訪問地址&#xff0c;默認RequestMapping(“url”)的值url即為value的值。指定的地址可以是 URI Template 模式。 method 指定請求的method類型…

數據結構(四)——二叉樹和堆(下)

制作不易&#xff0c;三連支持一下唄&#xff01;&#xff01;&#xff01; 文章目錄 前言一、二叉樹鏈式結構的實現總結 前言 這篇博客我們將來了解普通二叉樹的實現和應用&#xff0c;對大家之前分治和遞歸的理解有所挑戰。 一、二叉樹鏈式結構的實現 1.前置說明 在學習二叉…

Java入門——繼承和多態(上)

包 包是組織類的一種方式. 使用包的主要目的是保證類的唯一性. 例如, 你在代碼中寫了一個 Test 類. 然后你的舍友也可能寫一個 Test 類. 如果出現兩個同名的類, 就會沖突, 導致 代碼不能編譯通過. 導入包中的類 Java 中已經提供了很多現成的類供我們使用. 例如 public cla…

服裝店會員管理系統結合小程序商城幫你挖掘出潛在客戶

在現代社會&#xff0c;隨著科技的不斷進步和人們消費習慣的變化&#xff0c;傳統的服裝店已經不再能夠滿足消費者的需求。為了更好地服務客戶&#xff0c;提升銷售業績&#xff0c;許多服裝店開始引入會員管理系統&#xff0c;并結合小程序商城&#xff0c;實現線上線下的無縫…

LeetCode-2079. 給植物澆水【數組 模擬】

LeetCode-2079. 給植物澆水【數組 模擬】 題目描述&#xff1a;解題思路一&#xff1a;簡單的模擬題&#xff0c;初始化為0&#xff0c;考慮先不澆灌每一個植物解題思路二&#xff1a;初始化為n&#xff0c;考慮每一個植物需要澆灌解題思路三&#xff1a;0 題目描述&#xff1a…

在ubuntu安裝Docker容器

1、進入root用戶模式 sudo -i 回車后&#xff0c;輸入root的密碼即可進入root模式2、在ubuntu上安裝docker &#xff08;1&#xff09;直接使用 apt 安裝&#xff0c;一般這樣也自動啟動好了 apt install docker.io3、驗證安裝成功&#xff0c;以及啟動與校驗 &#xff08;…

C++11:常用語法匯總

目錄 &#x1f341;統一的列表初始化 { }initializer_list &#x1f341;decltype 推導表達式類型&#x1f341;可變參數模板解析可變參數包方法一方法二 &#x1f341;lambda 表達式捕捉列表的使用運用場景舉例lambda表達式 與 函數對象 &#x1f341;統一的列表初始化 { } 在…