BusyBoxのメモリ削減の工夫

Denis君によると、新しいBusyBoxは、メモリ利用の削減の試みをしているそうだ。
http://www.busybox.net/cgi-bin/viewcvs.cgi/trunk/busybox/docs/keep_data_small.txt?rev=18792&view=markup
アプレットが、勝手にglobal変数を定義すると、これらは、bssセクションというところに確保されるらしい。
で、BusyBoxを実行すると、それらglobal変数用の領域がガサッと確保されてしまう。
#ということだと思う
実際は、一つのアプレットしか走らないというのに、その他全部のアプレット用のグローバル変数領域が確保されてしまう。
これでは、無駄が多い。

そこで、busyboxには、
アプレットで共通して使えるグローバル変数用のバッファが用意された。
bb_common_bufsiz1というバッファが用意されている。
使いかたは、ちょっとトリッキー。
アプレット
struct global {
hoge
foo
}
というglobal構造体を作る。
ここでは、「hoge,foo」をグローバル変数としたいとする。

で、各アプレットのファイル内で、
#define G (*(struct globals*)&bb_common_bufsiz1)
#define hoge (G.hoge)
#define foo (G.foo)
とする。

こうすれば、
hoge」をあたかも普通のグローバル変数hoge」かのように使えてしまう。

で、selinux向けのアプレットも、この仕組みを使ってよ、とのこと。