1. 程式人生 > 其它 >檢視SO KO 執行程式相關資訊命令

檢視SO KO 執行程式相關資訊命令

1 檢視SO

檢視so庫的方法__臣本布衣_新浪部落格 (sina.com.cn)

1、nm -D libxxx.so 打印出符號資訊。

一般這樣用:nm -D libxxx.so |grep T

$ nm -D /lib/libstdc++.so | grep T
0000000000000618 T _fini
00000000000004e0 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable

2、ldd libxxx.so 檢視依賴關係

$ ldd /lib/libstdc++.so    
ldd: warning: you do not have execution permission for `/lib/libstdc++.so'
        linux-vdso.so.1 =>  (0x00007fff029fc000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6523e82000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6524452000)

3、readelf -a libxxxx.so 用來讀取elf資訊

一般這樣用:readelf libxxx.so |grep NEEDED 這樣也可以讀取依賴關係

$ readelf -a /lib/libstdc++.so | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

5、objdump -d libxxxx.so

6、file libxxx.so 這樣可以檢視so庫的屬性

$ file  /lib/libstdc++.so         
/lib/libstdc++.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=d098ee7c7e519e2c4311869633523aae4f805c17, not stripped

2 檢視可執行程式

參考部落格:linux下檢視so或可執行程式的依賴庫_Linux_指令碼之家 (jb51.net)

1、檢視可執行程式依賴的庫

$ readelf -a test | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

2、檢視各個段大小

$ size test 
   text    data     bss     dec     hex filename
  49052    1500     320   50872    c6b8 test 

3 檢視程式碼分割槽

參考部落格:.bss,.data,.text,.rodata - 水中有淚 - 部落格園 (cnblogs.com)

系統根據檔案生成區塊(section)會區分儲存特性:

檢視命令:objdump -h xx.o

(1)特性種類:

種類 說明
SHT_NULL 無效的區塊
SHT_PROGBITS 帶有資料(機械語和初始值等)的區塊
SHT_NOBITS 不帶有資料
SHT_RELA 帶有可再分配的資料(不依賴與記憶體的程式碼)的區塊
SHT_REL
SHT_SYMTAB 帶有符號表的區塊

(2)屬性

屬性 說明
SHF_ALLOC 應該放在記憶體上的區塊
SHF_WRITE 應該放在可讀寫區域的區塊
SHF_EXECINSTR 應該放在可執行區域的區塊

(3)歸類

檔案 種類 屬性
.bbs SHT_NOBITS SHF_ALLOC + SHF_WRITE
.data SHT_PROGBITS SHF_ALLOC + SHF_WRITE
.text SHT_PROGBITS SHF_ALLOC + SHF_EXECINSTR
.rodata SHT_PROGBITS SHF_ALLOC

BSS :主要存放0或者無初始值的全域性變數和0或者無初始值的靜態區域性變數

Data:主要存放初始值是0以外的全域性變數和初始值為0以外的靜態區域性變數

Text:機械語跟程式碼

Rodata:字串,或者定數(const)

4 核心列印

參考部落格:https://www.cnblogs.com/Caden-liu8888/p/5652168.html

1、檢視當前控制檯的列印級別

$ cat /proc/sys/kernel/printk 
4       4       1       7

其中第一個“4”表示核心列印函式printk的列印級別,只有級別比他高的資訊才能在控制檯上打印出來,既 0-3級別的資訊

2、修改列印等級

echo "新的列印級別 4 1 7" >/proc/sys/kernel/printk

printk的列印級別

列印等級 說明
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */

不夠列印級別的資訊會被寫到日誌中可通過dmesg 命令來檢視

3、printk函式的使用

printk(列印級別 “要列印的資訊”)

列印級別 既上面定義的幾個巨集

4、列印日誌會存放在/proc/kmsg中,這是一個程序,可以一直讀取它來進行實時列印。

tail -n 10 -f /proc/kmsg

5 KO除錯

參考部落格:(19條訊息) linux除錯ko - CSDN

(1)去除符號表

strip --strip-debug [需要處理的檔案]

$ strip --strip-debug test

(2)把debug資訊加回去

objcopy --add-gnu-debuglink=[debug檔案] [需要新增debug資訊的檔案]

(3)將test的除錯資訊儲存到 test.debug檔案中,需要的時候裝入就可。

$ objcopy --only-keep-debug test test.debug
$ gdb ./test
(gdb) l
No symbol table is loaded.  Use the "file" command.
(gdb) file diag_shell.debug 
(gdb) l
16     int32_t main(int argc, char *argv[])