linux 内核裁剪不当 死机,Linux編譯x86架構內核出現_stack_chk_guard未定義錯誤

背景

android模擬器運行於virtualbox中,而virtualbox運行於x86架構的pc端,所以android及其Linux內核都編譯成x86架構。當virtualbox的vt未開啟的情況下android系統會出現各種問題,如arm庫游戲不能運行,桌面平凡掛死重啟。通過查看日志,都奔潰在了#00 pc 000183c6 /system/lib/libc.so (__get_thread+6)這個點。關於此點的日志分析過程請查看本人的另一篇文章的分析: Linux系統調用__get_thread獲取TLS失敗導致應用程序奔潰.

問題

在android內核為3.10時選擇CONFIG_CC_STACKPROTECTOR=y(開啟內核棧保護功能),在x86架構下能正常編譯解決vt下桌面重復掛死、arm庫游戲不能玩的問題。但是如果升級android內核為3.18,內核開啟棧保護功能時,交叉編譯x86架構下的linux內核就會出現編譯錯誤。具體看如下開啟內核配置和出錯日志:

開啟3.18棧保護的內核配置選項如下:@@ -41,7 +41,6 @@ CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y

CONFIG_HAVE_INTEL_TXT=y

CONFIG_X86_32_SMP=y

CONFIG_X86_HT=y

-CONFIG_X86_32_LAZY_GS=y

CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx"

CONFIG_ARCH_SUPPORTS_UPROBES=y

CONFIG_FIX_EARLYCON_MEM=y

@@ -249,10 +248,10 @@ CONFIG_HAVE_CMPXCHG_DOUBLE=y

CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y

CONFIG_HAVE_ARCH_SECCOMP_FILTER=y

CONFIG_HAVE_CC_STACKPROTECTOR=y

-# CONFIG_CC_STACKPROTECTOR is not set

-CONFIG_CC_STACKPROTECTOR_NONE=y

+CONFIG_CC_STACKPROTECTOR=y

+# CONFIG_CC_STACKPROTECTOR_NONE is not set

# CONFIG_CC_STACKPROTECTOR_REGULAR is not set

-# CONFIG_CC_STACKPROTECTOR_STRONG is not set

+CONFIG_CC_STACKPROTECTOR_STRONG=y

CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y

CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y

CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y

開啟3.18內核棧保護配置后內核編譯x86架構錯誤如下:CHK include/generated/compile.h

UPD include/generated/compile.h

CC init/version.o

LD init/built-in.o

android-4.4.4/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/i686-linux-android-ld: init/built-in.o: in function do_one_initcall:init_task.c(.text+0x7f): error: undefined reference to '__stack_chk_guard'

android-4.4.4/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/i686-linux-android-ld: init/built-in.o: in function do_one_initcall:init_task.c(.text+0x1c6): error: undefined reference to '__stack_chk_guard'

android-4.4.4/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/i686-linux-android-ld: init/built-in.o: in function name_to_dev_t:init_task.c(.text+0x261): error: undefined reference to '__stack_chk_guard'

android-4.4.4/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/i686-linux-android-ld: init/built-in.o: in function name_to_dev_t:init_task.c(.text+0x517): error: undefined reference to '__stack_chk_guard'

make: *** [vmlinux] Error 1

arch/x86/Makefile:116: stack-protector enabled but compiler support broken

分析解決

上述error: undefined reference to '__stack_chk_guard'錯誤通過各種google也沒有找到正解,有的說是gcc需要4.9及以上,然而用交叉編譯工具4.9也不行。還查看了android源碼關於stack protector的相關修復,都沒有啥卵用。最后通過查看__stack_chk_guard字段發現,x86架構沒有定義此字段,而sh,arm,mips等架構確定義了。在窮途末路時只能自己動手依葫蘆畫瓢,期待有所進展。如下patch為本人添加,不僅能解決編譯錯誤,還確實解決了vt未開啟時,virtualbox下運行android鏡像出現的各種問題。

Linux編譯x86架構時__stack_chk_guard未定義錯誤的修復patchdiff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h

index 6a99859..3e2d812 100644

--- a/arch/x86/include/asm/stackprotector.h

+++ b/arch/x86/include/asm/stackprotector.h

@@ -41,6 +41,10 @@

#include

#include

+#if (defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP))

+extern unsigned long __stack_chk_guard;

+#endif

+

/*

* 24 byte read-only segment initializer for stack canary. Linker

* can't handle the address bit shifting. Address will be set in

@@ -79,6 +83,10 @@ static __always_inline void boot_init_stack_canary(void)

#else

this_cpu_write(stack_canary.canary, canary);

#endif

+

+#if (defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP))

+ __stack_chk_guard = current->stack_canary;

+#endif

}

static inline void setup_stack_canary_segment(int cpu)

diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c

index 4eb204c..5ad8ab2 100644

--- a/arch/x86/kernel/process.c

+++ b/arch/x86/kernel/process.c

@@ -29,6 +29,12 @@

#include

#include

+

+#if (defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP))

+ unsigned long __stack_chk_guard __read_mostly;

+/* 配置打開SMP時,會出現此__stack_chk_guard變量重復定義問題,所有只能在無SMP下生效 */

+//static DEFINE_PER_CPU(unsigned long,__stack_chk_guard) __read_mostly;

+EXPORT_SYMBOL(__stack_chk_guard);

+#endif

+

/*

* per-CPU TSS segments. Threads are completely 'soft' on Linux,

* no more per-task TSS's. The TSS size is kept cacheline-aligned

diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c

index 8f3ebfe..f027d25 100644

--- a/arch/x86/kernel/process_32.c

+++ b/arch/x86/kernel/process_32.c

@@ -39,6 +39,11 @@

#include

#include

#include

+

+#if (defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP))

+#include

+#endif

+

#include

#include

#include

@@ -249,6 +254,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)

*next = &next_p->thread;

int cpu = smp_processor_id();

struct tss_struct *tss = &per_cpu(init_tss, cpu);

+

+ #if (defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP))

+ __stack_chk_guard = next_p->stack_canary;

+ #endif

+

fpu_switch_t fpu;

/* never put a printk in __switch_to... printk() calls wake_up*() indirectly */

為啥內核能正常選擇打開棧保護功能但卻無法編譯通過呢,后面想了想,可能有如下原因:

一是godlfish內核主要對移動手機設備使用的內核,手機一般使用的是arm芯片,對於x86架構官方關注的也許並不多。

二是默認此棧保護功能是關閉的,只有對運行穩定性有特殊需求的產品,如航天,太空類高穩定產品才需要考慮打開,打開后會稍微降低性能。

此patch應該是可以作為官網的patch來提交修復,福澤大眾的,但本人從來沒有提交過,限於水平有限,暫且記錄,以備后忘。

感謝

2017 …… ,卷起褲管跑,擼起袖子干!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

a*算法流程图_光伏逆变器MPPT基本算法介绍李星硕

欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 905723370高可靠新能源行业顶尖自媒体在这里有电力电子、新能源干货、行业发展趋势分析、最新产品介绍、众多技术达人与您分享经验,欢迎关注我们,搜索微信公众号:电力电子技术…

JAVA入门级教学之(接口)

目录 JAVA入门级教学之(接口) 接口也是一种引用类型,可以等同看做类 1.如何定义接口,语法: 2.接口中只能出现: 3.接口其实是一个特殊的抽象类,特殊在接口是完全抽象的 4.接口中没有构造方…

java 线程状态_浅析Java中的线程状态

一、线程的5种状态众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该线程对象的sta…

Linux7添加syslog,请教linux下安装syslog的方法.是安装,不是配置

、安装JDK从sun网站上直接下载JDK:http://java.sun.com/j2se/1.4.2/download.html 提供了两个下载:1、RPM in self-extracting file (j2sdk-1_4_2_04-linux-i586.bin, 32.77 MB) 这个是自解压的文件,在linux上安装如下:# chmod ux…

如何在jieba分词中加自定义词典_Pyspark Word2Vec + jieba 训练词向量流程

摘要:用商品描述为语料库训练商品词向量为例,分享一下用pyspark自带word2vecjieba分词训练词向量的流程.工具:python,pyspark,jieba,pandas,numpy数据格式:自定义词典,语料库均为pyspark dataframe,停用辞典不大,直接使用txt.1 create spark我的pyspark参数设置如下:def create…

linux底行模式显示信息,14天linux命令加强

linux命令加强linux命令加强.jpg复习cd./ 当前目录../ 上级目录/ 代表根目录 or 代表目录和文件之间的分隔符 ..pwd 查看当前路径LS 查看当前目录下的文件ls ./a/ 查看目标路径下的文件tab 自动补全grep 文件外部根据关键字搜索文件内容 grep -n 关键字 *(文件名)more 以分页的…

字节和位 B和b的区别

“B”不是最小的单位,“B”是Byte的意思,一个Byte等于8个bit(位),bit是最小的单位。 就好像你用宽带上网,1M、2M、10M、100M都是用bit来作为单位的,实际上以上的速度换算到B是都要除上8。 bit一…

AndroidManifest.xml详解

我们在进行APP开发的时候都会遇到一个文件:AndroidManifest.xml。从刚开始进行Android开发,到现在已经过去了几个月,还是对这个文件一知半解,只知道它是配置用的。但是这文件里的东西具体有什么用,该怎么用一直都没有理…

a标签传值到另一个页面_vue-router页面传值及接收值

前端写页面&#xff0c;我们经常需要从A页面传值给B页面&#xff0c;比如下面的场景点击“充值中”跳转到下一个页面&#xff0c;使tabbar中的页面与其对应需要上个页面传值下面来实现下&#xff1a;A页面——My.vue在去“order”页面的方法中通过params传值current1<B页面—…

本机ping不通虚拟机linux,Windows本地Linux虚拟机ping不通的解决办法

安装linux操作系统安装双操作系统; 1 0. 介绍: 1 1 实验环境: 2 2. 实验准备: 2 3.开始安装: 2 1 制作U盘启动工具: 2 2.安装LinuxOS. 3 2.1在windowOS中划分60G空间 ...VS2008编译bat工程文件为AirCode,批处理文件为bulit.bat(与*.sln文件在同级目录). 以下是批处理的代码: ec…

如何实现文件互拖-VMware Tools (ubuntu系统)安装详细过程与使用

VMware Tools &#xff08;ubuntu系统&#xff09;安装详细过程与使用 1、打开虚拟机VMware Workstation&#xff0c;启动Ubuntu系统&#xff0c;菜单栏 - 虚拟机 - 安装VMware Tools&#xff0c;不启动Ubuntu系统是无法点击“安装VMware Tools”选项的&#xff0c;如下图&…

c++ 中文乱码_Visual Studio Code 中 CodeRunner 插件的输出窗口中文乱码

原来我一直用 Pycharm 写代码&#xff0c;Pycharm 写代码虽然很方便&#xff0c;但是Pycharm 有点重&#xff0c;我转到了Vscode了&#xff0c;真香。在 Visual Studio Code 中安装 CodeRunner 插件后&#xff0c;直接运行 Python 代码的时候&#xff0c;输出窗口中的中文出现了…

linux 下 java md5值,MD5值的简介和查看

MD5即Message-Digest Algorithm 5(信息-摘要算法第5版)&#xff0c;用于确保信息传输完整一致。每个文件都可以用MD5验证程序算出一个固定的MD5码来。MD5在论坛上、软件发布时经常用&#xff0c;是为了保证文件的正确性&#xff0c;防止一些人盗用程序&#xff0c;加些木马或者…

解决为什么导入了tomcat进入myeclipse却在server中找不到

有时候在servers中找不到刚刚在preferences搜索框中&#xff0c;输入tomcat等等等一系列的操作后却还是找不到在哪里 其实需要在servers窗口中右键new一个新的tomcat出来&#xff0c;这时候再在里面选择刚刚新建的tomcat即可

三菱modbusRTU通讯实例_实例 | 三菱PLC接线图干货,FX5U模块硬件

点击箭头处“工业之家”&#xff0c;选择“关注公众号”&#xff01;三菱PLC接线图干货此次主要描述的是关于三菱FX5U 模块硬件的接线实例&#xff0c;主要有以下几个方面&#xff1a;电源AC、DC接线、输入输出接线、模拟量接线。不同原理不同的接线方式&#xff0c;现在来给大…

linux共享文件系统sy,Linux使用Samba实现文件共享

Samba服务是现在Linux系统与Windows系统之间共享文件的最佳选择。[rootstudy ~]# yum install samba -y  #安装samba服务[rootstudy ~]# cat -n /etc/samba/smb.conf  #查看samba主配置文件Samba服务程序中的参数以及作用[global]参数作用workgroup MYGROUP#工作组名称ser…

recycleviewitem 列表加载动画_用vue实现一个虚拟列表

上次分享了超长列表分片加载的方式&#xff0c;这种方式现在一般不会使用&#xff0c;因为dom会变的无比庞大&#xff0c;页面会很卡&#xff0c;今天分享用vue实现一个虚拟列表的简易实现&#xff0c;本来是想用原生实现一个&#xff0c;后来觉得直接使用computed&#xff0c;…

解决为什么JDK要带着JRE一起下载

相信在安装的过程中会遇到这么一个疑问&#xff0c;明明我安装的的是JDK&#xff0c;为什么下载完成后路径里面多了一个jre呢&#xff1f; 带着这个疑问&#xff0c;我们探究一下JDK和JRE的区别 JDK&#xff1a;它是Java开发运行环境&#xff0c;在程序员的电脑上当然要安装J…

linux 安装jdk gz文件,Linux 安装jdk gz 安装方式

Linux安装JDK步骤1、先从网上下载jdk(jdk-7u1-linux-i586.rpm)&#xff0c;下载地址:http://www.Oracle.com/technetwork/Java/javase/downloads/jdk-7u1-download-513651.html&#xff0c;下载后放在/home目录中&#xff0c;当然其它地方也行。2、进入安装目录#cd /home#cp jd…

多元相关性分析_研究 | 精神分裂症症状与超氧化物歧化酶相关性的性别差异

精神分裂症是一种精神病综合征&#xff0c;主要症状包括阳性症状(如幻觉、妄想以及言语混乱)&#xff0c;阴性症状(如积极性降低、表达能力下降)&#xff0c;认知缺陷(如执行功能、记忆能力和心理处理速度受损)。氧化应激过度、抗氧化防御系统失调被认为是精神分裂症的重要危险…