如何在 User space 確保全數啟用 PIE CFLAG ?
文章目录
- 什麼是 PIC/PIE FLAG
- 如何在 User space 確保全數啟用 PIE CFLAG
- 自有 soucr code 的情況下
- common.mk 定義 apply_pie_flags 函數
- 要求 application Makefile include common.mk
- 第三方 Open Source 工具: buildroot 舉例
CheckSec 掃描 ELF,除了要求 Linux 開啟 ALSR ,各個 ELF (Binary/Library) 需要自行使用 PIC, PIE flag 編譯
什麼是 PIC/PIE FLAG
-fPIC 跟 -fPIE
項目 | -fPIC | -fPIE |
---|---|---|
主要用途 | 產生共享函式庫 | 產生執行檔(主程式) |
可重定位性 | 任意位置載入供多程序共用 | 任意位置載入,供單一程序使用 |
搭配連結選項 | -shared | -pie |
是否能替代彼此 | -fPIC 不可產生主程式 | -fPIE 不可產生共享函式庫 |
如何在 User space 確保全數啟用 PIE CFLAG
自有 soucr code 的情況下
實作必須符合下列要求:
- 根據使用者提供的參數,自動決定是否加上
-fPIE -pie
- 同時避免與不相容參數(例如
-static -r -shared
)同時存在: 檢查是否已經存在 -fPIE 或 -fPIC,如果沒加過,就自動補上 -fPIE 和 -pie
common.mk 定義 apply_pie_flags 函數
define apply_pie_flagsifeq ($(CONFIG_APP_ENABLE_PIE),y)DISABLE_PIE_FLAGS := -static -fno-pie -fno-PIE -no-pie -r -Wl,-rFOUND_DISABLE_PIE := $(filter $(DISABLE_PIE_FLAGS), $(CFLAGS) $(LDFLAGS) $(CXXFLAGS))FOUND_PIC_FLAGS := $(filter -fPIE -fpie -fPIC -fpic, $(CFLAGS) $(CXXFLAGS))FOUND_SHARED := $(findstring -shared, $(LDFLAGS))ifeq ($(strip $(FOUND_DISABLE_PIE)),)ifneq ($(strip $(FOUND_SHARED)),) # ── Shared Library# shared library: add -fPIC if not already setifeq ($(strip $(FOUND_PIC_FLAGS)),)CFLAGS += -fPICCXXFLAGS += -fPICendifelse # ── Binary# Remove -fPIC / -fpic(if have)CFLAGS := $(filter-out -fPIC -fpic, $(CFLAGS))CXXFLAGS := $(filter-out -fPIC -fpic, $(CXXFLAGS))# Add -fPIEifeq ($(strip $(FOUND_PIC_FLAGS)),)CFLAGS += -fPIECXXFLAGS += -fPIEendif# Add -pie to LDFLAGSLDFLAGS += -pieendifendifendif
endef
要求 application Makefile include common.mk
include $(APP_PATH)/common.mk
第三方 Open Source 工具: buildroot 舉例
透過 buildroot defconfig
啟用下列設定,確保所有來自 buildroot 的安裝檔都帶有 PIE CFLAG
BR2_PIC_PIE=y