2011-12-15 12 views
3

私は可能な限り小さなDLLをコンパイルしようとしましたが、私はセクションの整列を減らしてサイズを節約し、(-nostdlib)とすべての最適化を使用してstdlibも削除しました。今私はいくつかの質問を持っているMinGWでの最小DLLの構築?

  1. 「-Wlは、-exclude-すべてのシンボルは、」すべてのシンボルを削除しますが、私は両方をバインドするために、LD-スクリプトを使用した場合、輸出ディレクトリが存在した空間
  2. をたくさん取って残し.dataと.textセクションを一緒に使用すると、.relocセクションは無駄になりますか?私が知っている限り、.relocは.textから.dataへの絶対アドレスに使用されます。両方が同じセクションにある場合、すべてのアドレスは相対的な権利になりますか?

ありがとう。

答えて

2

セクションを混乱させないで、-fPICフラグを使用して再配置を減らしてください(そうでない場合、参照は常にx86では絶対的です)。あなたはまだリンクのために使用されているので、.relocを持っています。また、常に-Osとでコンパイルしてください。

ところで、.dataセクションはありません。もし何かが間違っているからです:あなたのデータ参照を探して修正してください。すべてが一定でなければならない。データを混乱させる必要がある場合は、まずそれを呼び出し元によって提供されたバッファなどにコピーします。

GCC属性拡張の学習に時間を費やすことができれば、GCCのコードの理解度を高め、より良い最適化を実現するいくつかの属性を見つけることができます(例:pureおよびconst関数)。これにより、多くのバイトを削減できます。

さらに重要なことは、コードをどのように使用しているかについてのGCCの基本的なヒントを与えることです。適切な場合は常にstatic関数を使用してください。

GCCにはまだダミーセクションが追加されており、stripユーティリティで削除することができます。デフォルトですべてが削除されるわけではありません。すべてのシンボルを削除するには-sフラグを指定し、セクションを削除するには-R nameを指定する必要があります。 objcopy -S -R name ...と似たようなことをすることができます(それを言及するだけで、何か他のことをするならば、すべてを1回のパスで行うことができるからです)。