即時嘗試編譯一個儘可能小的dll,我減少了部分alignmnent,它節省了一些大小,並且我還用(-nostdlib)和所有優化刪除了stdlib。現在我有一些問題在MinGW中構建最小DLL?
- 「輪候冊,-exclude-所有符號」刪除所有符號,但保留出口目錄下有服用大量的空間
- ,如果我使用LD-腳本綁定兩個.data和.text部分放在一起,是否會使.reloc部分無用?據我所知.reloc用於從.text到.data的絕對地址,如果它們都在同一節中,所有的地址都是相對的?
謝謝。
即時嘗試編譯一個儘可能小的dll,我減少了部分alignmnent,它節省了一些大小,並且我還用(-nostdlib)和所有優化刪除了stdlib。現在我有一些問題在MinGW中構建最小DLL?
謝謝。
不要亂用部分,只需使用-fPIC
標誌來減少重定位(否則引用在x86上始終是絕對的)。您仍然會有一個.reloc
,因爲它用於鏈接。此外,請始終使用-Os
和進行編譯。
順便說一句,你不應該有一個.data
部分。如果你這樣做是因爲某些事情是錯誤的:查找並修復你的數據引用;一切都應該是不變的。如果你需要混淆數據,首先將它複製到調用者提供的緩衝區,或類似的東西。
如果您可以花一些時間學習GCC屬性擴展,您會發現幾個增強GCC對代碼理解的屬性,從而實現更好的優化(例如pure
和const
函數)。這可以減少很多字節。
更重要的是,試着讓GCC提供關於如何使用代碼的基本提示,例如,適當時使用static
函數。
GCC仍然會添加一些虛擬部分,您可以使用strip
實用程序來消除這些部分。它不會在默認情況下刪除所有內容,您需要指定-s
標誌來刪除所有符號,並且-R name
可以刪除一個節。你可以用objcopy -S -R name ...
做一些類似的事情(只是提到它,因爲如果你打算做一些其他的事情,你可以一次完成)。