檢視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[])