3

C コード ベースがあり、使用されているすべてのグローバル変数をプログラムで識別する必要があります。gcc でメモリ マップ ファイルを作成できると思いますが、その方法がわかりません。これにより、どの変数がグローバルであるかがわかりますか? どんな助けでも大歓迎です。

乾杯

4

5 に答える 5

6

を使用して、オブジェクト ファイルからそのような情報を抽出できますnm

nm *.o | grep OBJT | grep GLOB

上記の編集 コマンドは、Solaris の nm (SUNWbtool パッケージ) 用です。移植性のためnmに、出力形式を選択するパラメーターがあります。

nm -f [posix|bsd|sysv] *.o
于 2009-01-12T10:32:17.157 に答える
1

メモリ マップを出力するオプションはリンカで -M であるため、gcc から取得するには を使用する必要がありますgcc .... -Xlinker -M

これらを取得する別の方法は、ctagsプログラムを使用することです。利用可能な関数にタグを付けるだけでなく、利用可能なグローバル変数にもタグを付けることができます (また、静的を収集しません。これはメモリ マップとは異なります)。すべてをコンパイルするわけではないため、これは gcc アプローチよりも高速である必要があります (コンパイルする必要がある場合は、もちろん無料で入手できます)。

于 2009-01-12T10:18:42.613 に答える
0

なぜこれを知る必要があるのですか?多くの目的で、静的データ (ファイルまたは関数のスコープに関係なく) はグローバルとグループ化する必要があります。

一般に、グローバルはリンカー マップ内のコードではなく、データとして表示されます。スタック変数とヒープ割り当て変数にはありません。(もちろん、ヒープに割り当てられたデータへのポインターはグローバルにすることができます。これは、ポインターとポインターが指すものとの間の C における通常の区別です。)

于 2009-01-12T10:05:12.937 に答える
0

これを行うには、gdb の「情報変数」が気に入りました。

ここにリストされています: Cコードベースでのグローバル変数の識別

于 2012-06-29T18:32:47.663 に答える