0

ご存じのとおり、「-ffunction-sections -fdata-sections」および「-Wl, --gc-sections」を使用して、未使用のコードとデータを削除できます。しかし、未使用の bss シンボルを削除する方法は?

4

1 に答える 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 に答える