C コード ベースがあり、使用されているすべてのグローバル変数をプログラムで識別する必要があります。gcc でメモリ マップ ファイルを作成できると思いますが、その方法がわかりません。これにより、どの変数がグローバルであるかがわかりますか? どんな助けでも大歓迎です。
乾杯
を使用して、オブジェクト ファイルからそのような情報を抽出できますnm
。
nm *.o | grep OBJT | grep GLOB
上記の編集
コマンドは、Solaris の nm (SUNWbtool パッケージ) 用です。移植性のためnm
に、出力形式を選択するパラメーターがあります。
nm -f [posix|bsd|sysv] *.o
メモリ マップを出力するオプションはリンカで -M であるため、gcc から取得するには を使用する必要がありますgcc .... -Xlinker -M
。
これらを取得する別の方法は、ctags
プログラムを使用することです。利用可能な関数にタグを付けるだけでなく、利用可能なグローバル変数にもタグを付けることができます (また、静的を収集しません。これはメモリ マップとは異なります)。すべてをコンパイルするわけではないため、これは gcc アプローチよりも高速である必要があります (コンパイルする必要がある場合は、もちろん無料で入手できます)。
なぜこれを知る必要があるのですか?多くの目的で、静的データ (ファイルまたは関数のスコープに関係なく) はグローバルとグループ化する必要があります。
一般に、グローバルはリンカー マップ内のコードではなく、データとして表示されます。スタック変数とヒープ割り当て変数にはありません。(もちろん、ヒープに割り当てられたデータへのポインターはグローバルにすることができます。これは、ポインターとポインターが指すものとの間の C における通常の区別です。)
これを行うには、gdb の「情報変数」が気に入りました。
ここにリストされています: Cコードベースでのグローバル変数の識別