2

だから、私はここで本当に奇妙なことをしています。

たとえば、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 などは完全に問題ありません)。

4

1 に答える 1

1

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

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

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

const int willBeInRoData = 42;

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

注:コンパイルされたファイルからグローバル変数を検索してみてください。プログラムは定数とグローバル変数を区別できません。質問はまったく同じなので。

于 2012-12-03T17:39:52.997 に答える