2011-12-15 55 views
3

即時嘗試編譯一個儘可能小的dll,我減少了部分alignmnent,它節省了一些大小,並且我還用(-nostdlib)和所有優化刪除了stdlib。現在我有一些問題在MinGW中構建最小DLL?

  1. 「輪候冊,-exclude-所有符號」刪除所有符號,但保留出口目錄下有服用大量的空間
  2. ,如果我使用LD-腳本綁定兩個.data和.text部分放在一起,是否會使.reloc部分無用?據我所知.reloc用於從.text到.data的絕對地址,如果它們都在同一節中,所有的地址都是相對的?

謝謝。

回答

2

不要亂用部分,只需使用-fPIC標誌來減少重定位(否則引用在x86上始終是絕對的)。您仍然會有一個.reloc,因爲它用於鏈接。此外,請始終使用-Os和進行編譯。

順便說一句,你不應該有一個.data部分。如果你這樣做是因爲某些事情是錯誤的:查找並修復你的數據引用;一切都應該是不變的。如果你需要混淆數據,首先將它複製到調用者提供的緩衝區,或類似的東西。

如果您可以花一些時間學習GCC屬性擴展,您會發現幾個增強GCC對代碼理解的屬性,從而實現更好的優化(例如pureconst函數)。這可以減少很多字節。

更重要的是,試着讓GCC提供關於如何使用代碼的基本提示,例如,適當時使用static函數。

GCC仍然會添加一些虛擬部分,您可以使用strip實用程序來消除這些部分。它不會在默認情況下刪除所有內容,您需要指定-s標誌來刪除所有符號,並且-R name可以刪除一個節。你可以用objcopy -S -R name ...做一些類似的事情(只是提到它,因爲如果你打算做一些其他的事情,你可以一次完成)。