当前位置: 技术问答>linux和unix
弱弱的问:如何用-O0优化级别编译Linux内核?
来源: 互联网 发布时间:2016-10-14
本文导语: 我想调试嵌入式Linux内核源码,版本为montavista pro 4.0.1,目标平台为TI的DM355,主机是Fedora12,编译器arm_v5t_le-gcc。 现在我通过 OpenJTAG + OpenOCD0.4.0 + arm_v5t_le-gdb + Emacs 已经可以单步调试zImage解压代码,以及内核源...
我想调试嵌入式Linux内核源码,版本为montavista pro 4.0.1,目标平台为TI的DM355,主机是Fedora12,编译器arm_v5t_le-gcc。
现在我通过 OpenJTAG + OpenOCD0.4.0 + arm_v5t_le-gdb + Emacs 已经可以单步调试zImage解压代码,以及内核源代码(虽然还有一些问题,不过也算能源码级调试了)。
我发现内核代码执行顺序与源码不太一致,根据经验,应该是编译器优化的结果,于是我想关闭优化编译Linux内核,在内核源代码顶层目录Makefile中发现优化级别是在525行开始的几行代码中设置的:
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
CFLAGS += -Os
else
CFLAGS += -O2
endif
于是我将上面的 -Os 与 -O2 都改成 -O0 来禁止编译器优化,接着重新编译内核,出现如下错误:
[hugeice@rdserver ti-davinci]$ make ARCH=arm CROSS_COMPILE=arm_v5t_le- uImage
CHK include/linux/version.h
SPLIT include/linux/autoconf.h -> include/config/*
SYMLINK include/asm-arm/arch -> include/asm-arm/arch-davinci
make[1]: `arch/arm/kernel/asm-offsets.s' is up to date.
make[1]: `include/asm-arm/mach-types.h' is up to date.
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
CHK usr/initramfs_list
GEN .version
CHK include/linux/compile.h
dnsdomainname: 未知的主机
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
init/built-in.o(.init.text+0x1e8c): In function `identify_ramdisk_image':
init/do_mounts_rd.c:92: undefined reference to `ntohl'
arch/arm/mm/built-in.o(.text+0x1624): In function `adjust_pte':
arch/arm/mm/fault-armv.c:77: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.text+0x2360): In function `do_translation_fault':
arch/arm/mm/fault.c:363: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.text+0x3c44): In function `free_pgd_slow':
arch/arm/mm/mm-armv.c:249: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.text+0x3de4): In function `setup_mm_for_reboot':
arch/arm/mm/mm-armv.c:590: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.init.text+0x1414): In function `paging_init':
arch/arm/mm/init.c:519: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.init.text+0x2734):arch/arm/mm/mm-armv.c:559: more undefined references to `cpu_tlb' follow
……
我试过 -O1、-O2、-Os 优化都是可以编译通过的,唯独 -O0 编译会报告这些错误,错误大概是说一些标号(变量和函数)没有定义,难道修改编译选项的优化级别还会影响到源代码的编译吗 ?? 实在不解呀!
现在我通过 OpenJTAG + OpenOCD0.4.0 + arm_v5t_le-gdb + Emacs 已经可以单步调试zImage解压代码,以及内核源代码(虽然还有一些问题,不过也算能源码级调试了)。
我发现内核代码执行顺序与源码不太一致,根据经验,应该是编译器优化的结果,于是我想关闭优化编译Linux内核,在内核源代码顶层目录Makefile中发现优化级别是在525行开始的几行代码中设置的:
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
CFLAGS += -Os
else
CFLAGS += -O2
endif
于是我将上面的 -Os 与 -O2 都改成 -O0 来禁止编译器优化,接着重新编译内核,出现如下错误:
[hugeice@rdserver ti-davinci]$ make ARCH=arm CROSS_COMPILE=arm_v5t_le- uImage
CHK include/linux/version.h
SPLIT include/linux/autoconf.h -> include/config/*
SYMLINK include/asm-arm/arch -> include/asm-arm/arch-davinci
make[1]: `arch/arm/kernel/asm-offsets.s' is up to date.
make[1]: `include/asm-arm/mach-types.h' is up to date.
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
CHK usr/initramfs_list
GEN .version
CHK include/linux/compile.h
dnsdomainname: 未知的主机
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
init/built-in.o(.init.text+0x1e8c): In function `identify_ramdisk_image':
init/do_mounts_rd.c:92: undefined reference to `ntohl'
arch/arm/mm/built-in.o(.text+0x1624): In function `adjust_pte':
arch/arm/mm/fault-armv.c:77: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.text+0x2360): In function `do_translation_fault':
arch/arm/mm/fault.c:363: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.text+0x3c44): In function `free_pgd_slow':
arch/arm/mm/mm-armv.c:249: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.text+0x3de4): In function `setup_mm_for_reboot':
arch/arm/mm/mm-armv.c:590: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.init.text+0x1414): In function `paging_init':
arch/arm/mm/init.c:519: undefined reference to `cpu_tlb'
arch/arm/mm/built-in.o(.init.text+0x2734):arch/arm/mm/mm-armv.c:559: more undefined references to `cpu_tlb' follow
……
我试过 -O1、-O2、-Os 优化都是可以编译通过的,唯独 -O0 编译会报告这些错误,错误大概是说一些标号(变量和函数)没有定义,难道修改编译选项的优化级别还会影响到源代码的编译吗 ?? 实在不解呀!
|
-O0和不加-O参数是一样的,你试下不加-O参数能否通过.
注意,-O0后面那个数值零,不是字母O,你的看起来两个都写成字母O了
注意,-O0后面那个数值零,不是字母O,你的看起来两个都写成字母O了
|
CSDN的编辑控件还真分不出大写字母O和0。用notepad非常好区分。
|
make clean一下
|
同意 make clean一下