Linuxのnmコマンドの概要

一般的に言えば、Linux開発に携わっている人はnmコマンドを使用しますが、開発者以外は使用しないでください。nmは単純ですが、いくつかの単語を書き、心について話す必要があります。

  

        nmはni maの省略形ではありません。もちろん、それはni meiの省略形ではなく、名前の省略形です。nmコマンドは主に、特定のファイル(つまり、いくつかの関数やグローバル変数など)内のシンボルをリストするために使用されます。以下、見てみましょう。

       test.hは:

void print();
      test.cは次のとおりです。

#include <stdio.h>
#include "test.h"
 
void print()
{
    printf( "rainy days \ n");
}
       main.c:

#include "test.h"
 
int main()
{
    print();
    return 0;
}
      さて、次のようにnmコマンドの効果を見てみましょう:
[taoge @ localhost learn_nm] $ nm *
nm:main.c:ファイル形式認識されない
nm:test.c:ファイル形式が認識されない
nm:test.h:ファイル形式が認識されない
[taoge @ localhost learn_nm] $ 
      ni ma、何もない、それはnmがそのようなファイルに役に立たないことを意味する。


       nmがターゲットファイルと実行可能ファイルを読み取れるかどうかを確認します。

[taoge @ localhost learn_nm] $ ls
main.c test.c test.h
[taoge @ localhost learn_nm] $ gcc -c test.c main.c 
[taoge @ localhost learn_nm] $ gcc test.o main.o
[taoge @ localhost learn_nm] $ ./a.out 
雨の日
[taoge @ localhost learn_nm] $ nm *

a.outの:
08049564 D _DYNAMIC
08049630 D _GLOBAL_OFFSET_TABLE_
0804849c R _IO_stdin_used
         W _Jv_RegisterClasses
08049554 D __CTOR_END__
08049550 D __CTOR_LIST__
0804955c D __DTOR_END__
08049558 D __DTOR_LIST__
0804854c R __FRAME_END__
08049560 D __JCR_END__
08049560 D __JCR_LIST__
0804964c A __bss_start
08049648 D __data_start
08048450トン__do_global_ctors_aux
08048330トン__do_global_dtors_aux
080484a0 R __dso_handle
         w __gmon_start__
0804844a T __i686.get_pc_thunk.bx
08049550 d __init_array_end
08049550 d __init_array_start
080483e0 T __libc_csu_fini
080483f0 T __libc_csu_init
         U __libc_start_main @@ GLIBC_2.0
0804964c A _edata
08049654 A _end
0804847c T _fini
08048498 R _fp_hw
08048290 T _init
08048300 T _start
0804964c B completed.5963
08049648 W data_start
08049650 B dtor_idx.5965
08048390トンframe_dummy
080483c8 T主
080483b4 Tプリント
         U puts @@ GLIBC_2.0
nm:main.c:ファイル形式が認識されません

main.o:
00000000 Tメイン
         U印刷
nm:test.c:ファイル形式が認識されません
nm:test.h:ファイル形式が認識されません

test.o:
00000000 T print
         U puts
[taoge @ localhost learn_nm] $
        ご覧のとおり  、ターゲットファイルと実行可能ファイルの両方が、print関数などの関数を取得できます。


        次のように、スタティックライブラリとダイナミックライブラリを引き続き調べます。

[taoge @ localhost learn_nm] $ ls
main.c test.c test.h
[taoge @ localhost learn_nm] $ gcc -c test.c
[taoge @ localhost learn_nm] $ ar rcs libtest.a test.o
[taoge @ localhost learn_nm ] $ gcc -shared -fPIC -o libtest.so test.o
[taoge @ localhost learn_nm] $ ls
libtest.a libtest.so main.c test.c test.h test.o
[taoge @ localhost learn_nm] $ nm lib *

libtest.a:

test.o:
00000000 T print
         U puts

libtest.so:
000014bc A _DYNAMIC
00001590 A _GLOBAL_OFFSET_TABLE_
         W _Jv_RegisterClasses
000014a8 D __CTOR_END__
000014a4 D __CTOR_LIST__
000014b0 D __DTOR_END__
000014ac D __DTOR_LIST__
000004a0 R __FRAME_END__
000014b4 D __JCR_END__
000014b4 D __JCR_LIST__
000015a4 A __bss_start
         W __cxa_finalize @@ GLIBC_2.1.3
00000440トン__do_global_ctors_aux
00000350トン__do_global_dtors_aux
000014b8 d __dso_handle
         w __gmon_start__
00000419 t __i686.get_pc_thunk.bx
000015a4 A _edata
000015ac A _end
00000478 T _fini
000002ec T _init
000015a4 bが完了しました
。5963000015a8 b dtor_idx.5965
000003e0 t frame_dummy
00000420 T print
         U puts @@ GLIBC_2.0
[taoge @ localhost learn_nm] $
        ご覧のとおり  、printなどの静的ライブラリと動的ライブラリから関数名を取得できます機能。

        では、グローバル変数の状況を見てみましょう。main.cを次のように変更しました。

#include <stdio.h>
 
int add(int x、int y)
{
    return x + y;
}
 
int aaa;
int bbb = 1;
char szTest [] = "good";
 
int main()
{
    int ccc = 2;
    0リターン;
}
       その後、nmのa.outを分析した(なお、もしデフォルトのa.outファイルを処理すべきのみコマンドnmの):
[taoge @ localhostのlearn_nm] $ LSの
main.cの
[taoge @ localhostのlearn_nm] $ gcc main.c 
[taoge @ localhost learn_nm] $ 
./a.out [taoge @ localhost learn_nm] $ nm a.out 
08049538 d _DYNAMIC
08049604 d _GLOBAL_OFFSET_TABLE_
0804847c R _IO_stdin_used
         w _Jv_RegisterClasses
08049528_
__CTOR_
08049530 D __DTOR_END__
0804952c D __DTOR_LIST__
08048520 R __FRAME_END__
08049534 D __JCR_END__
08049534 D __JCR_LIST__
08049628 A __bss_start
08049618 D __data_start
08048430トン__do_global_ctors_aux
08048310トン__do_global_dtors_aux
08048480 R __dso_handle
         W __gmon_start__
0804842a T __i686.get_pc_thunk.bx
08049524 D __init_array_end
08049524 D __init_array_start
080483c0 T __libc_csu_fini
080483d0 T __libc_csu_init
         U __libc_start_main @@ GLIBC_2.0
08049628 A _edata
08049634 A _end
0804845c T _fini
08048478 R _fp_hw
08048274 T _init
080482e0 T _start
08049630 B aaa
08048394 T add
0804961c D bbb
08049628 bが完了しました
。596308049618 W data_start
0804962c b dtor_idx.5965
08048370 t frame_dummy
080483a2 T main
08049620 D szTest
[taoge @ localhost
        add関数はありません、それはlocalhost  のみ参照できます。グローバル変数aaa、bbb、およびszTestもあります。aaaは初期化されていないため、Bssセクションにあり、bbbとszTestは初期化されているため、Dataセクションにあります。cccはローカル変数であり、nmはそれを認識できないため、cccがないことに注意する必要があります。 
        「良い」が表示されていないことにも注意してください。なぜですか?nmは「良い」ではなくszTestを調べるために使用されるためです。次のように、前に紹介したstringsコマンドでこれを実行できます。

[taoge @ localhost learn_nm] $ ls
a.out main.c
[taoge @ localhost learn_nm] $ strings a.out 
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
__libc_start_main
GLIBC_2.0
PTRh
[^ _ ]
良い
[taoge @ localhost learn_nm] $ 


        nmコマンドは、主に特性ファイル内のシンボル情報をリストします。より詳細な使用法については、manに尋ねてください。あまり紹介しません。

————————————————
著作権に関する声明:この記事はCSDNブロガー「stpeace」によるオリジナルの記事であり、CC 4.0 BY-SAの著作権契約に従っています。元のソースリンクとこの声明を添付して転載してください。
元のリンク:https://blog.csdn.net/stpeace/article/details/47089585

13件の元の記事を公開 Likes6 訪問者10,000以上

おすすめ

転載: blog.csdn.net/majianting/article/details/104970217