1

良い一日!私は長い間決定を見つけようとしています。

私の問題は次のとおりです。

たとえば、2 つの .cpp ファイルがあり、そのうちの 1 つに

const std::string DICTIONARY_DEFAULT = "blah";
const std::string ADDTODICTIONARY_DEFAULT = "blah";
const std::string BUTTONS = "blah";

そして2番目のもの

static int  x1;
static int  NewY1, NewY2, NewX1, NewX2;

どちらのフラグメントもグローバル変数セクションにあります。グローバル静的変数 (たとえば) を出力する必要がありますが、定数は無視します。nm出力では、それらは完全に同一に見えます(すべてのケースでbタイプ、つまり初期化されていないローカルスコープシンボルを意味します)。Linux ユーティリティのみを使用して、このケースを自動的に分離する方法はありますか (grep、regexps などは完全に問題ありません)。

理解を深めるための私の課題:

C++ のプログラムがあります。主なタスクは、グローバル変数のリストを見つけて撤回することです。入力データは、多数の .cpp ファイルを含むアーカイブのように見えます。すべての .cpp ファイルは、C++ で構文的に正しいプログラムです (コンパイラ GNU C++ および Microsoft Visual C++ を使用して正常にコンパイルする必要があります)。アーカイブのすべてのファイルについて、例のように、ファイルの名前とグローバル変数のリストを個別の文字列で出力する必要があります。

出力データ:

000000.cpp ancestor ansv cost graph M N p qr query u
000001.cpp
000002.cpp
000003.cpp
000004.cpp
000005.cpp
000006.cpp
000007.cpp edge tree
4

2 に答える 2

1

グローバル変数を見つけることは、このclangチュートリアルの「主題」です-このチュートリアルの著者は「ただの楽しみのために」それを行いましたが、必要なことを正確に行うためにいくつかのコードを追加することができます...(ところで、それはそれほど難しくありません推測できるかもしれません:))

于 2012-12-03T14:50:24.050 に答える
0

簡単な答え:実際には、すべての場合にそれを行う方法はありません

長い答え:「objdump-xfile.o」を使用してシンボルテーブルを見てください。staticとconstの両方のすべてのグローバル変数が、.bssというセクションに割り当てられていることがわかります。.rodataと呼ばれるセクションも存在し、一般的に、constデータを格納するために使用されます。残念ながら、あなたの場合、2つのconst std::stringオブジェクトを宣言しています。これらのオブジェクトは、「main」関数が実行される前にコンストラクターを呼び出すことによって初期化されます。それでも、フィールドの初期化は実行時に行われるため、「論理的に」定数であり、実際には定数ではありません。

コンパイラは、他のすべてのグローバルとともにそれらを.bssセクションに割り当てる以外に選択肢はありません。次の行を追加すると

const int willBeInRoData = 42;

そのシンボルは.rodataセクションにあるため、他のグローバル整数と区別できます。

于 2012-12-03T16:16:59.040 に答える