linux中的nm命令
生活随笔
收集整理的這篇文章主要介紹了
linux中的nm命令
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼在git
是names的縮寫, nm命令主要是用來列出某些文件中的符號(說白了就是一些函數(shù)和全局變量等)。 下面, 我們一起來看看。
linux中的nm命令簡介
這說明nm對這類文件無用
繼續(xù)看nm能否讀取目標(biāo)文件和可執(zhí)行文件:
可以看到, 對于目標(biāo)文件和可執(zhí)行文件而言, 均可以獲得其中的函數(shù), 如print函數(shù)。
我們繼續(xù)看靜態(tài)庫和動態(tài)庫, 如下:
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__可以看到, 我們可以從靜態(tài)庫和動態(tài)庫中獲取到函數(shù)名稱, 如print函數(shù)。
好, 我們再來看看全局變量的情形, 我們把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函數(shù), 還有全局變量aaa, bbb和szTest, 要注意, aaa是未初始化的, 所以在Bss段, 而bbb、szTest是初始化了的, 所以在Data段。 值得注意的是, 并沒有ccc, 因為ccc是局部變量, nm看不到的。
我們還應(yīng)該注意到, 在上面看不到"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總結(jié)
以上是生活随笔為你收集整理的linux中的nm命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你构建 C 语言编译器
- 下一篇: 谈谈程序链接及分段那些事