日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux环境特性的文件夹,在Linux环境下如何消减可执行文件或者动态库的大小

發布時間:2024/7/23 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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环境下如何消减可执行文件或者动态库的大小的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。