[description]
記憶體踩壞一般都很難排查問題,需要借助各種除錯方法找出問題點。不同的記憶體踩壞有不同的除錯方法,這裡介紹下記憶體踩壞中的一種:棧幀溢位。
棧幀溢位是指:在某個函式內踩壞了不屬於該函式的棧幀。舉例:
[c/c++]
hide
12
3
4
5
6
7
8
9
10
11
12
13
14
15
void
a(
void
)
}
這裡b只有3個int長度,但是卻迴圈4次,將不屬於b的記憶體踩壞,而b在a函式的棧幀裡,這種情形叫棧幀溢位。
針對這種的除錯方法需要借助gcc編譯器的功能:stack-protector。原理是在函式棧幀前埋乙個守衛,在函式退出時檢查該守衛是否被踩壞,如果有則發生了棧幀溢位。
守衛的值會從
__stack_chk_guard裡獲取,檢查失敗會呼叫
__stack_chk_fail()函式。詳情請搜尋gcc說明文件。
這種方法雖然無法100%抓到問題點,但絕對是非常有效的防護措施,以下介紹開啟方法。
[solution]
arm32 aosp版本:
1. 在alps/kernel-3.10/arch/arm/configs/$proj_defconfig或alps/kernel-3.10/arch/arm/configs/$proj_debug_defconfig
將:# config_cc_stackprotector is not set
修改為:
config_cc_stackprotector=y
2. 在alps/kernel-3.10/arch/arm/makefile將
ifeq ($(config_cc_stackprotector),y)
kbuild_cflags+=-fstack-protector
endif
修改為:
ifeq ($(config_cc_stackprotector),y)
kbuild_cflags+=-fstack-protector-all
endif
3. 在alps/kernel-3.10/arch/arm/boot/compressed/makefile新增:
ifeq ($(config_cc_stackprotector),y)
orig_cflags := $(kbuild_cflags)
kbuild_cflags = $(subst -fstack-protector-all, , $(orig_cflags))
endif
arm64 aosp版本:
arm64版本暫不支援該功能,因此需要自己新增**:
1. 在alps/kernel-3.10/kernel/panic.c 將
#ifdef config_cc_stackprotector
修改為#if 1
const unsigned long __stack_chk_guard __read_mostly = 0xa5a5a5a5a5a5a5a5;
export_symbol(__stack_chk_guard);
2. 在kernel-3.10/makefile 將
ifndef config_cc_stackprotector
kbuild_cflags += $(call cc-option, -fno-stack-protector)
endif
修改為:
kbuild_cflags += -fstack-protector-all
FAQ 如何在 中獲得 的指標 MFC
問 請問如何在乙個全域性函式中,獲得它檢視類,文件類得指標啊?問 如何在乙個對話方塊中,獲得它檢視類,文件類得指標啊?舉例來說,如果檢視的成員函式需要建立乙個對話方塊,而對話方塊需要訪問文件,那麼可以在對話方塊類中宣告乙個文件指標,檢視的成員函式建立對話方塊之後把對話方塊中的文件指標變數的值設定為和...
如何在Spring Boot開啟事務
今天給大家介紹如何在spring boot中開啟事務,希望大家喜歡。說到事務,那什麼是事務呢?事務 transaction 一般是指要做的或所做的事情。那麼如何在spring boot中使用呢?其實只需要兩步即可 在service實現類的方法上新增 transactional註解。具體實現 pack...
如何在BIOS中開啟虛擬化
本文介紹了如何在主機板bios中啟用虛擬化技術 vt 要執行一些作業系統,虛擬化軟體和虛擬機器,硬體虛擬化就需要啟用。大多數情況下,不需要虛擬化技術的作業系統可以正常執行在啟用了虛擬化技術的系統,但有些需要這種技術的作業系統,必須啟用虛擬化技術才能執行。所有最新的處理器和主機板都支援虛擬化技術,檢查...