ご存じのとおり、「-ffunction-sections -fdata-sections」および「-Wl, --gc-sections」を使用して、未使用のコードとデータを削除できます。しかし、未使用の bss シンボルを削除する方法は?
質問する
959 次
1 に答える
1
0 で初期化されたグローバル変数が bss にあるというとき、実際にはその変数はバイナリに存在しません。
プログラムが実行を開始すると、RAM にセクションが確保され、このセクションにゼロが埋められます。bss 内の変数にアクセスするプログラム内の場所は、このセクションを指します。
bss の変数は、バイナリ イメージのスペースを占有しません。
bss とデータの違いは、一部の値が最初はゼロであることがわかっているため、それらをバイナリ イメージに格納する必要がないため、実行可能ファイルのサイズが縮小されることです。
RAM(またはプログラムが実行される仮想メモリ)では、言及したフラグを使用して、bssの変数も削除されます。
これは簡単なプログラムで確認できます。Linux を使用している場合は、/tmp に移動して hello.c を記述します。
#include<stdio.h>
int var1 = 0;
int var2 = 2;
int main()
{
printf("Hello\n");
return 0;
}
次に、次のように入力します。
make hello
objdump --sym hello | less
var1 と var2 があることがわかります。
今タイプ:
rm hello && make hello CFLAGS="-fdata-sections -ffunction-sections -Wl,--gc-sections"
objdump --sym hello | less
もうそれらを見つけることはできません。
于 2013-07-05T09:30:12.383 に答える