linux环境特性的文件夹,在Linux环境下如何消减可执行文件或者动态库的大小
為了簡化描述,下文提到目標時,如無特殊說明,均指代目標可執行文件或者目標動態庫。
操作步驟如下:
選型時,在同等功能時,盡量選擇代碼量少、占用空間小的開源的軟件。
控制C++特性的使用,如無必要,則不使用C++的高級特性。
屏蔽RTTI特性,增加編譯選項-fno-rtti。
屏蔽異常我,增加編譯選項-fno-exceptions。
對性能影響不大時,避免使用C++的inline特性。
增加編譯選項-fno-inline。
在不影響使用時,控制對STL的組件的使用。
避免使用STL的iostream的相關模板類。
構建目標動態庫時,控制符號的可見性。
增加編譯選項-fvisibility=hidden。
增加編譯選項-fvisibility-inlines-hidden。
定義符號導出宏,如下代碼。
#ifndef __has_attribute
#define __has_attribute(x) 0
#endif
#if (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ > 2))) || __has_attribute(visibility)
#define MY_EXPORT __attribute__((visibility("default")))
#define MY_IMPORT __attribute__((visibility("default")))
#else
#define MY_EXPORT
#define MY_IMPORT
#endif
// 在外部可見的符號上,使用上述宏修飾。
MY_EXPORT int foo(int a, int b);
對目標以及全部依賴,使用gc-sections特性。即:
編譯源碼時,增加選項-ffunction-sections -fdata-sections。
鏈接目標時,增加選項-Wl,--gc-sections。
鏈接目標時,增加選項-Wl,--icf=safe。
對目標以及全部依賴,使用LTO特性。
編譯源碼時,增加選項-flto=full。
鏈接目標時,增加選項-flto=full。
構建目標時的外部依賴,均使用靜態鏈接。比如:
靜態鏈接STL庫。
靜態鏈接使用前述要求編譯的依賴庫。
構建目標時,要求編譯器對目標占用的空間進行優化。
增加選項-Os。
假如鏈接失敗,則修改為-O2。
鏈接時,對于Release版本,刪除不必要的調試符號。
增加選項-s。
如下使用CMake的請求,描述選項。
# 關閉C++特性
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-inline")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
# 控制符號的可見性
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fvisibility=hidden")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility=hidden")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fvisibility-inlines-hidden")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility-inlines-hidden")
# 刪除調試符號
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
# 開啟空間優化
if (APPLE)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Oz")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Oz")
else ()
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
endif ()
# 使用gc-section優化
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffunction-sections -fdata-sections")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffunction-sections -fdata-sections")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--gc-sections")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
# 使用icf優化
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--icf=safe")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--icf=safe")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--icf=safe")
# 使用LTO
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto=full")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto=full")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto=full")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -flto=full")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto=full")
參考資料
總結
以上是生活随笔為你收集整理的linux环境特性的文件夹,在Linux环境下如何消减可执行文件或者动态库的大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python程序发布 ubuntu_在u
- 下一篇: linux内核err实现,Linux中I