0

シミュレートするために、mipsの逆アセンブリを生成しています。作業するにはビッグデータが必要ですが、大きなアセンブリファイルは必要ないので、初期化されていない大きな配列で作業したいと思いました(そして、シミュレーターで初期化する可能性があります...)。したがって、この配列はグローバルである必要があります。また、グローバル変数は、ページが実際にアクセスされたときに初期化される.bssセクションに配置されているようです。問題は私のバイナリにあり、配列は.bssセクションにありますが、明示的にゼロで埋められています...これは、インターネットで見つけたものを正しく理解した場合に期待される動作ではありません...と言う方法はありますかコンパイラ(またはリンカ、またはローダー...どちらがそのために何をするのかよくわかりません)は、この配列に実際にゼロを入れないのですか?または、コンパイル中にオプションを選択したり、C命令を実行して、コンパイルしないようにすることもできます。この配列を0で初期化する必要がありますか?(配列セクションを次のように変更しようとしました属性ですが、まだ0で初期化されています)。

ちなみに、私はobjdumpを使用して逆アセンブリファイルを生成しており、通常はゼロのブロックをスキップしますが、他のゼロのブロックを逆アセンブルする必要があるため、「-z」オプションを使用します。

私が本当に理解していないのは、どこを見ても、.bssセクションはバイナリファイルに実際にはゼロを入れていないと言われたことです...

4

2 に答える 2

9

.bss セクションのデータは、コンパイルされたオブジェクト ファイルに保存されません。データがないためです。コンパイラは、ゼロで初期化する必要があるため、正確にそのセグメントに変数を配置します。

OS が実行可能ファイルをロードすると、.bss セグメントのサイズが調べられ、その量のメモリが割り当てられ、ゼロで初期化されます。そのデータを実行可能ファイルに保存しないことで、ロード時間が短縮されます。

データを特定のデータで初期化する場合は、コードで初期化子を指定します。コンパイラは、それを .bss (初期化されていないデータ) ではなく .data セグメント (初期化されたデータ) に入れます。OS が実行可能ファイルをロードすると、データにメモリが割り当てられ、実行可能ファイルからコピーされます。これには追加の I/O が必要ですが、データは希望どおりに明示的に初期化されます。

または、データを .bss セグメントに残しておき、実行時に自分で初期化することもできます。実行時にデータをすばやく簡単に生成できる場合は、ディスクから読み取るよりも、起動時にデータを再計算する方が高速である可能性があります。しかし、そのような状況はおそらくまれです。

于 2012-07-11T03:20:20.087 に答える
0

-zオプションを使用すると、実際にはバイナリにゼロが含まれていなくても、 のゼロがobjdump表示されると思われます。を使用して、実際にバイナリにあるものの単純な 16 進ダンプを取得して.bssみてください。ゼロのブロックが表示される場合、それらは実際にはバイナリにありますod -t x4od

于 2012-07-12T17:54:40.330 に答える