日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux中的nm命令

發布時間:2025/4/5 linux 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中的nm命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼在git

是names的縮寫, nm命令主要是用來列出某些文件中的符號(說白了就是一些函數和全局變量等)。 下面, 我們一起來看看。
linux中的nm命令簡介

nm * nm: main.c: 不可識別的文件格式 nm: test.c: 不可識別的文件格式 nm: test.h: 不可識別的文件格式

這說明nm對這類文件無用
繼續看nm能否讀取目標文件和可執行文件:

ls gcc -c test.c main.c gcc test.o main.o ./a.out nm * a.out: 0000000000201010 B __bss_start 0000000000201010 b completed.7698w __cxa_finalize@@GLIBC_2.2.5 0000000000201000 D __data_start 0000000000201000 W data_start 0000000000000560 t deregister_tm_clones 00000000000005f0 t __do_global_dtors_aux 0000000000200dc0 t __do_global_dtors_aux_fini_array_entry 0000000000201008 D __dso_handle 0000000000200dc8 d _DYNAMIC 0000000000201010 D _edata 0000000000201018 B _end 00000000000006e4 T _fini 0000000000000630 t frame_dummy 0000000000200db8 t __frame_dummy_init_array_entry 000000000000086c r __FRAME_END__ 0000000000200fb8 d _GLOBAL_OFFSET_TABLE_w __gmon_start__ 0000000000000700 r __GNU_EH_FRAME_HDR 00000000000004e8 T _init 0000000000200dc0 t __init_array_end 0000000000200db8 t __init_array_start 00000000000006f0 R _IO_stdin_usedw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable 00000000000006e0 T __libc_csu_fini 0000000000000670 T __libc_csu_initU __libc_start_main@@GLIBC_2.2.5 000000000000064d T main 000000000000063a T printU puts@@GLIBC_2.2.5 00000000000005a0 t register_tm_clones 0000000000000530 T _start 0000000000201010 D __TMC_END__ nm: main.c: 不可識別的文件格式main.o:U _GLOBAL_OFFSET_TABLE_ 0000000000000000 T mainU print nm: test.c: 不可識別的文件格式 nm: test.h: 不可識別的文件格式test.o:U _GLOBAL_OFFSET_TABLE_ 0000000000000000 T printU puts

可以看到, 對于目標文件和可執行文件而言, 均可以獲得其中的函數, 如print函數。

我們繼續看靜態庫和動態庫, 如下:

gcc -c test.car rcs libtest.a test.ogcc -shared -fPIC -o libtest.so test.onm lib* libtest.a:test.o:U _GLOBAL_OFFSET_TABLE_ 0000000000000000 T printU putslibtest.so: 0000000000201028 B __bss_start 0000000000201028 b completed.7698w __cxa_finalize@@GLIBC_2.2.5 0000000000000530 t deregister_tm_clones 00000000000005c0 t __do_global_dtors_aux 0000000000200e18 t __do_global_dtors_aux_fini_array_entry 0000000000201020 d __dso_handle 0000000000200e20 d _DYNAMIC 0000000000201028 D _edata 0000000000201030 B _end 0000000000000620 T _fini 0000000000000600 t frame_dummy 0000000000200e10 t __frame_dummy_init_array_entry 00000000000006d0 r __FRAME_END__ 0000000000201000 d _GLOBAL_OFFSET_TABLE_w __gmon_start__ 0000000000000634 r __GNU_EH_FRAME_HDR 00000000000004e8 T _initw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable 000000000000060a T printU puts@@GLIBC_2.2.5 0000000000000570 t register_tm_clones 0000000000201028 d __TMC_END__

可以看到, 我們可以從靜態庫和動態庫中獲取到函數名稱, 如print函數。

好, 我們再來看看全局變量的情形, 我們把main.c改為:

cd 2 gcc main.c nm * a.out: 0000000000201020 B aaa 00000000000005fa T add 0000000000201010 D bbb 0000000000201019 B __bss_start 000000000020101c b completed.7698w __cxa_finalize@@GLIBC_2.2.5 0000000000201000 D __data_start 0000000000201000 W data_start 0000000000000520 t deregister_tm_clones 00000000000005b0 t __do_global_dtors_aux 0000000000200df8 t __do_global_dtors_aux_fini_array_entry 0000000000201008 D __dso_handle 0000000000200e00 d _DYNAMIC 0000000000201019 D _edata 0000000000201028 B _end 0000000000000694 T _fini 00000000000005f0 t frame_dummy 0000000000200df0 t __frame_dummy_init_array_entry 000000000000080c r __FRAME_END__ 0000000000200fc0 d _GLOBAL_OFFSET_TABLE_w __gmon_start__ 00000000000006a4 r __GNU_EH_FRAME_HDR 00000000000004b8 T _init 0000000000200df8 t __init_array_end 0000000000200df0 t __init_array_start 00000000000006a0 R _IO_stdin_usedw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable 0000000000000690 T __libc_csu_fini 0000000000000620 T __libc_csu_initU __libc_start_main@@GLIBC_2.2.5 000000000000060e T main 0000000000000560 t register_tm_clones 00000000000004f0 T _start 0000000000201014 D szTest 0000000000201020 D __TMC_END__ nm: main.c: 不可識別的文件格式

可以看到, 不僅有add函數, 還有全局變量aaa, bbb和szTest, 要注意, aaa是未初始化的, 所以在Bss段, 而bbb、szTest是初始化了的, 所以在Data段。 值得注意的是, 并沒有ccc, 因為ccc是局部變量, nm看不到的。

我們還應該注意到, 在上面看不到"good", 為啥呢? 因為nm是用來看szTest而非"good"的。 別忘了, 我們之前介紹過的strings命令可干這事, 如下:

strings a.out /lib64/ld-linux-x86-64.so.2 nd8B //}Q libc.so.6 __cxa_finalize __libc_start_main GLIBC_2.2.5 _ITM_deregisterTMCloneTable __gmon_start__ _ITM_registerTMCloneTable AWAVI AUATL []A\A]A^A_ ;*3$" good

總結

以上是生活随笔為你收集整理的linux中的nm命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。