去掉编译内核的优化选项

    在使用gdb或者其他工具调试默认优化选项的内核时,内核的反汇编代码与原来的C语言代码对应很乱。如果切换到C语言模式,使用单步调试时会看到执行顺序在C语言源代码里面跳来跳去,甚是紊乱。

    这一切都是GCC对代码进行了优化造成的,优化后的代码执行顺序与源代码的顺序就有出入了。GCC优化代码,提高运行效率与代码紧凑度,但对于调试学习内核就不友好了。

    通过下面的方法去掉内核编译时的优化。

1,优化级别从-O2改为-O1

修改内核源代码根目录下的Makefile

all: vmlinux

ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS    += -Os
else
KBUILD_CFLAGS    += -O1
endif

CONFIG_CC_OPTIMIZE_FOR_SIZE默认是不定义的,所以修改红色部分为-O1,优化级别为1级,只做基本的优化。


2,不要将只有一个地方调用的函数自动变为inline函数

变为inline函数之后,对于调试代码极为不便。原来在里面定义的局部变量都没有了,要查看一些局部变量的值时需要从寄存器里面去推导,并且需要手动的做强制类型转换才能看到数据结构的值。

禁止inline后会是一次真正的函数调用,对于通过调试理解代码功能作用很大。

# We trigger additional mismatches with less inlining
ifdef CONFIG_DEBUG_SECTION_MISMATCH
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
endif

CONFIG_DEBUG_SECTION_MISMATCH这个宏本来是检测代码/数据段类型属性不匹配的,定义后同时有个功能是禁止将只有一个地方调用的函数变为inline函数。




附:

编译qemu的ARM vexpress平台的内核命令:

linux-3.4.70$ make O=/home/dazhi/vexpress/build/kernel ARCH=arm CROSS_COMPILE=arm-linux- vexpress_defconfig menuconfig

linux-3.4.70$ make O=/home/dazhi/vexpress/build/kernel ARCH=arm CROSS_COMPILE=arm-linux-


采用Android工具链编译:

 make -C SourceCode/linux-3.4.70/ O=/home/dazhi/linuxbuild/ ARCH=arm CROSS_COMPILE=/home/dazhi/AndroidL/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi- versatile_defconfig menuconfig
 make -C SourceCode/linux-3.4.70/ O=/home/dazhi/linuxbuild/ ARCH=arm CROSS_COMPILE=/home/dazhi/AndroidL/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi- 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值