2013-03-14 46 views
3

我們注意到,一些死函數不會從生成的共享對象文件(.so)中刪除,該文件構建爲版本(通過「ndk-build」而不帶任何參數)。從Android NDK構建的共享對象中不刪除死函數

爲了證明我們引入了一個絕對不會在任何地方調用的虛擬函數(並且由於默認可見性已經被設置爲隱藏於整個.so中,所以也不會導出)。不知何故,虛擬函數的符號仍然存在,我們可以通過使用「nm」反映生成的.so來看到它。

我們在Linux 11.10上使用NDK r8d。

是否有任何我們需要應用於Android.mk的特定編譯器/鏈接器標誌,以便移除死代碼?

謝謝!

回答

2

刪除死功能也可以大大減少二進制大小。爲此,請更改Android.mk中的C和C++編譯標誌和鏈接器標誌。

LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections 
LOCAL_CFLAGS += -ffunction-sections -fdata-sections 
LOCAL_LDFLAGS += -Wl,--gc-sections 

此外,GCC中的visibility功能可以幫助。 http://gcc.gnu.org/wiki/Visibility

+0

謝謝!但是「ndk-build」返回以下錯誤:arm-linux-androideabi-g ++:error:無法識別的選項'--gc-sections' – SSong 2013-03-14 06:09:58

+0

檢查您的ARM GCC工具鏈版本。如有必要,更新它。 – 2013-03-14 06:45:13

+0

對不起,我錯過了-Wl和--gc-sections之間的逗號,現在它工作正常。謝謝! – SSong 2013-03-16 00:07:53

相關問題