如何禁止Linux内核的-O2编译选项【转】
转自:http://blog.csdn.net/larryliuqing/article/details/8674274
http://lenky.info/2013/03/10/%E5%A6%82%E4%BD%95%E7%A6%81%E6%AD%A2linux%E5%86%85%E6%A0%B8%E7%9A%84-o2%E7%BC%96%E8%AF%91%E9%80%89%E9%A1%B9/
已有各种工具可以帮助我们调试内核,比如UML、kgdb、qemu等,但比较麻烦的是gdb经常给我一个“value optimized out”的提示,而且执行的路径与gdb的显示也不对应,最近我在利用UML调试ext3文件系统的逻辑时就为此而感到非常麻烦(2.6.30.8的内核):
|
1
2
3
4
5
|
Breakpoint 1, journal_invalidatepage (journal=0x6c4bd800, page=0x61918b28, offset=0) at fs/jbd/transaction.c:20362036 {(gdb) p bh$2 = <value optimized out>(gdb) |
这应该是因为Linux内核打开gcc的-O2选项优化导致,于是我尝试修改内核Makefile文件(/usr/src/uml/linux-2.6.30.8/Makefile):
将
|
1
2
3
4
5
|
ifdefKBUILD_CFLAGS elseKBUILD_CFLAGS endif |
改为这样(CONFIG_CC_OPTIMIZE_FOR_SIZE可以通过内核选项:General setup —> [ ] Optimize for size,进行开启/关闭,这里不管该选项而也就统一改了):
|
1
2
3
4
5
|
ifdefKBUILD_CFLAGS elseKBUILD_CFLAGS endif |
执行编译,gcc给了我一个华丽的错误:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@lenky...mm/built-in.o:/usr/src/uml/linux-2.6.30.8/mm/slab.c:341:/usr/src/uml/linux-2.6.30.8/mm/slab.c:341:/usr/src/uml/linux-2.6.30.8/mm/slab.c:341:/usr/src/uml/linux-2.6.30.8/mm/slab.c:341:/usr/src/uml/linux-2.6.30.8/mm/slab.c:341:mm/built-in.o:/usr/src/uml/linux-2.6.30.8/mm/slab.c:341:collect2:exit KSYM nm:'.tmp_vmlinux1':Nomake: |
根据上面的提示信息,我尝试把文件slab.c的编译选项调为-O2,即编辑mm/Makefile文件,在最后加上如下一行:
|
1
2
3
4
5
6
7
|
[root@lenky[root@lenkyendifobj-$(CONFIG_QUICKLIST)obj-$(CONFIG_CGROUP_MEM_RES_CTLR)CFLAGS_slab.o |
格式是:
CFLAGS_对应源文件[要去除通常意义上扩展名].o = gcc选项
所以上面加的是:
CFLAGS_slab.o = -O2
重新编译:
|
1
|
[root@lenky |
选项-B:以强制所有内核源文件全部重新编译(因为我前面编译过一次了,为了保险起见,就让目标文件全部重新生成吧)
选项V=1:显示详细的编译信息,而不再是简单的“CC init/main.o”。
编译出来的可执行程序linux比-O2的情况还小几M,一启动UML没多久,果然奔溃。
看来内核里有大量的底层代码在书写时只兼容了-O2选项,所以如果以-O0的形式强制编译会导致出错,这即便不在编译时报错,也有极大可能会在实际执行时候出错,完全关闭所有内核源文件的-O2编译选项的风险太大。
退而求次,我是为了调试journal_invalidatepage()函数,那么可以仅把对应源文件transaction.c的优化选项关闭即可,这个源文件的实现在比较高的层次,关闭优化选项应该不会出错。
编辑文件fs/jbd/Makefile,再其最后加上一行:
CFLAGS_transaction.o = -O0
重新编译(之前的其它改动需回滚)后启动UML,一切OK。
试试最开始的示例,用gdb绑定到UML主进程,调试函数journal_invalidatepage(),打印变量bh:
|
1
2
3
4
5
6
7
8
9
|
Breakpoint2038 int(gdb)$1struct(gdb)$2"", b_bdev next(gdb) |
嗯,效果不错。
另外Google到由teawater提供了对应的补丁对整个内核进行关闭-O2优化,有没有问题不知道,我暂没有测试:
http://sourceware.org/ml/gdb/2010-12/msg00009.html
PS:
错误:
arch/um/os-Linux/mem.c: In function ‘create_tmp_file’:
arch/um/os-Linux/mem.c:216: error: implicit declaration of function ‘fchmod’
make[1]: *** [arch/um/os-Linux/mem.o] Error 1
make: *** [arch/um/os-Linux] Error 2
编辑文件arch/um/os-Linux/mem.c,加入头文件:
|
1
|
#include |
即可。
转载请保留地址:http://lenky.info/2013/03/10/%e5%a6%82%e4%bd%95%e7%a6%81%e6%ad%a2linux%e5%86%85%e6%a0%b8%e7%9a%84-o2%e7%bc%96%e8%af%91%e9%80%89%e9%a1%b9/ 或 http://lenky.info/?p=2238
如何禁止Linux内核的-O2编译选项【转】的更多相关文章
- Linux内核RCU(Read Copy Update)锁简析
在非常早曾经,大概是2009年的时候.写过一篇关于Linux RCU锁的文章<RCU锁在linux内核的演变>,如今我承认.那个时候我尽管懂了RCU锁,可是我没有能力用一种非常easy的描 ...
- 用于阻止缓冲区溢出攻击的 Linux 内核参数与 gcc 编译选项
先来看看基于 Red Hat 与 Fedora 衍生版(例如 CentOS)系统用于阻止栈溢出攻击的内核参数,主要包含两项: kernel.exec-shield 可执行栈保护,字面含义比较“绕”, ...
- Linux内核卸载和禁止更新
注意:对于可以用好几条命令实现的,第一条命令已经验证,其他的命令参考自网上,没有进行验证. 查看Linux系统内核的命令有下面几条 dpkg --get-selections | grep linux ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- linux内核调试指南
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- 【转】Linux内核调试方法总结
目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_sta ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
随机推荐
- C 数据类型——Day02
C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 ...
- 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- CF1083C Max Mex 线段树
题面 CF1083C Max Mex 题解 首先我们考虑,如果一个数x是某条路径上的mex,那么这个数要满足什么条件? 1 ~ x - 1的数都必须出现过. x必须没出现过. 现在我们要最大化x,那么 ...
- 注册系统所有的dll文件.bat
@echo off echo 运行后,能重新注册系统所有的dll文件, echo 能解决内存读写错误的问题 pause echo on for %%1 in (%windir%/system32/*. ...
- 【省选水题集Day1】一起来AK水题吧! 题目(更新到B)
题解:http://www.cnblogs.com/ljc20020730/p/6937954.html 水题A: [AHOI2001]质数和分解 题目网址: https://www.luogu.or ...
- Android系统权限和root权限
Android系统权限和root权限http://www.verydemo.com/demo_c189_i277.html
- NOIP2015D2总结
今天居然考了一套题.NOIP2015D2. 这是当年的战绩: 360的一等奖线.好强啊! 之前做过2015的D1,但我确实不会做landlord……今天曾祥瑞学长和林可学姐都来了,他们说,朱昶宇AK, ...
- CDOJ--1056
原题链接:http://acm.uestc.edu.cn/problem.php?pid=1056 题目:大小写切换 分析:以前这种问题我都是用dp写的,最近学到了一种更简洁的方法,特此记录下来! # ...
- 彻底理解 Python 生成器
1. 生成器定义 在Python中,一边循环一边计算的机制,称为生成器:generator. 2. 为什么要有生成器 列表所有数据都在内存中,如果有海量数据的话将会非常耗内存. 如:仅仅需要访问前面几 ...
- Tomcat权威指南-读书摘要系列1
1. Tomcat的开幕式 1.1. Tomcat是以Java编写的 1.2. 以catalina命令启动和停止Tomcat .\catalina.bat start // 启动 .\catalina ...