nm小節

12622 ワード

nmは、指定されたプログラムのシンボルテーブルに関する内容を表示するためのツールです.たとえば、グローバル変数や関数です.このツールをどのように使用するかについてmannmで見ることができます.第1列:現在のシンボルのアドレス第2列:現在のシンボルのタイプ第3列:現在のシンボルの名前
#include 
using namespace std;

int globalValue = 0;
void myfun()
{
    int i=0;
}

int main()
{
    int shuzi = 0;
    cout << shuzi << endl;
    return 0;
}
0000000000601068 B __bss_start
0000000000601190 b completed.6973
                 U __cxa_atexit@@GLIBC_2.2.5
0000000000601058 D __data_start
0000000000601058 W data_start
0000000000400770 t deregister_tm_clones
00000000004007e0 t __do_global_dtors_aux
0000000000600e08 t __do_global_dtors_aux_fini_array_entry
0000000000601060 D __dso_handle
0000000000600e18 d _DYNAMIC
0000000000601068 D _edata
00000000006011a0 B _end
0000000000400934 T _fini
0000000000400800 t frame_dummy
0000000000600df8 t __frame_dummy_init_array_entry
0000000000400ae0 r __FRAME_END__
0000000000601000 d _GLOBAL_OFFSET_TABLE_
00000000004008a9 t _GLOBAL__sub_I_globalValue
0000000000601194 B globalValue
                 w __gmon_start__
0000000000400688 T _init
0000000000600e08 t __init_array_end
0000000000600df8 t __init_array_start
0000000000400940 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000600e10 d __JCR_END__
0000000000600e10 d __JCR_LIST__
                 w _Jv_RegisterClasses
0000000000400930 T __libc_csu_fini
00000000004008c0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
000000000040083a T main
00000000004007a0 t register_tm_clones
0000000000400740 T _start
0000000000601068 D __TMC_END__
000000000040086c t _Z41__static_initialization_and_destruction_0ii
000000000040082d T _Z5myfunv
                 U _ZNSolsEi@@GLIBCXX_3.4
                 U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
                 U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
                 U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
0000000000601080 B _ZSt4cout@@GLIBCXX_3.4
                 U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
0000000000601198 b _ZStL8__ioinit
young@young-Lenovo:~/Cplusplus$ nm -C ./a.out
0000000000601068 B __bss_start
0000000000601190 b completed.6973
                 U __cxa_atexit@@GLIBC_2.2.5
0000000000601058 D __data_start
0000000000601058 W data_start
0000000000400770 t deregister_tm_clones
00000000004007e0 t __do_global_dtors_aux
0000000000600e08 t __do_global_dtors_aux_fini_array_entry
0000000000601060 D __dso_handle
0000000000600e18 d _DYNAMIC
0000000000601068 D _edata
00000000006011a0 B _end
0000000000400934 T _fini
0000000000400800 t frame_dummy
0000000000600df8 t __frame_dummy_init_array_entry
0000000000400ae0 r __FRAME_END__
0000000000601000 d _GLOBAL_OFFSET_TABLE_
00000000004008a9 t _GLOBAL__sub_I_globalValue
0000000000601194 B globalValue
                 w __gmon_start__
0000000000400688 T _init
0000000000600e08 t __init_array_end
0000000000600df8 t __init_array_start
0000000000400940 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000600e10 d __JCR_END__
0000000000600e10 d __JCR_LIST__
                 w _Jv_RegisterClasses
0000000000400930 T __libc_csu_fini
00000000004008c0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
000000000040083a T main
00000000004007a0 t register_tm_clones
0000000000400740 T _start
0000000000601068 D __TMC_END__
000000000040086c t __static_initialization_and_destruction_0(int, int)
000000000040082d T myfun()
                 U std::ostream::operator<<(int)@@GLIBCXX_3.4
                 U std::ostream::operator<<(std::ostream& (*)(std::ostream&))@@GLIBCXX_3.4
                 U std::ios_base::Init::Init()@@GLIBCXX_3.4
                 U std::ios_base::Init::~Init()@@GLIBCXX_3.4
0000000000601080 B std::cout@@GLIBCXX_3.4
                 U std::basic_ostream, std::char_traits >& std::endl, std::char_traits >(std::basic_ostream, std::char_traits >&)@@GLIBCXX_3.4
0000000000601198 b std::__ioinit

nm-c./を用いるa.outは、どの記号を使用するかを知ることができます.参照先:http://www.wuzesheng.com/?p=1595共通の目的:-指定プログラムに指定された記号が定義されているかどうかを判断する(比較的一般的な方法:nm-C proc|grep symbol)-プログラムコンパイル時のundefined referenceのエラーを解決し、mutiple definitionのエラーを解決する-ある記号のアドレスを表示します.およびプロセス空間の概略位置(bss,data,text領域,具体的には第2列のタイプで判断できる)