GCC安全編譯選項(xiàng)
以CMake為例,給出安全編譯選項(xiàng)的定義。
-
關(guān)閉RPATH特性。
set(CMAKE_SKIP_RPATH TRUE) -
開(kāi)啟棧保護(hù)。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong")或者
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all") -
開(kāi)啟GOT表保護(hù)。
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro,-z,now") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,relro,-z,now") -
開(kāi)啟棧不可執(zhí)行。
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,noexecstack") -
開(kāi)啟地址無(wú)關(guān)。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")或者
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") -
隨機(jī)化。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpie") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pie") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -pie")或者
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pie") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -pie") -
隱藏暴露的符號(hào)。
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility=hidden") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility=hidden") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility-inlines-hidden") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility-inlines-hidden") -
刪除調(diào)試符號(hào)。
對(duì)于Linux環(huán)境下部署應(yīng)用,建議不使用本選項(xiàng),否則會(huì)對(duì)測(cè)試、生產(chǎn)環(huán)境的問(wèn)題定位產(chǎn)生影響。
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s") set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -s") -
開(kāi)啟整數(shù)溢出檢查。
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -ftrapv") -
開(kāi)啟棧檢查。
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -fstack-check") -
其它
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORTIFY_SOURCE=2 -O2")
注意
上述選項(xiàng)對(duì)于Clang一樣可用。
推薦使用最新版本的GCC或者Clang,或者在CMakeLists.txt中增加檢查編譯器是否支持上述選項(xiàng)的代碼。
此外,推薦閱讀安卓NDK提供的android.toolchain.cmake文件,上述選項(xiàng)基本均有提及。
本文來(lái)自博客園,作者:jackieathome,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/jackieathome/p/18416021

浙公網(wǎng)安備 33010602011771號(hào)