用icc编译Linux内核完美教程[图文]

本文将介绍用icc(Intel? C++ Compiler)版本 10.1.x 来编译Linux的内核(支持2.6.22以上的版本)
2.6.23以上包含2.6.23的内核它的解压和引导内核代码改变了如果用icc去直接编译内核,将会造成部分代码无法用icc编译,或者编译出来的代码无法正常引导内核,所有本文的方法是用gcc编译引导部分的代码,而其它部分的代码交由icc编译.

=========>>>>>>>作者 Power_By_RTL 转载请注明作者<<<<<<<<<<<<<<====
=========>>>>>>>  本文 以 BSD协议 发佈 <<<<<<<<<<<================

下载内核代码并解包.
修改 include/linux/compiler-intel.h
加一行 #undef __compiler_offsetof
即   echo "#undef __compiler_offsetof" >> include/linux/compiler-intel.h

否则就出现

compilation aborted for kernel/pid.c (code 2)
make[1]: *** [kernel/pid.o] Error 2
make: *** [kernel] Error 2

修改代码目录的  Makefile

--start-group $(vmlinux-main) \

加入

--start-group $(vmlinux-main) /opt/intel/cc/10.1.021/lib/libirc_s.a --end-group \
修改  ./scripts/Makefile.build
quiet_cmd_link_multi-y = LD $@
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
2.6.23以前是

quiet_cmd_link_multi-y = LD $@
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)

在后面加个 /opt/intel/cc/10.1.021/lib/libirc_s.a 即

quiet_cmd_link_multi-y = LD $@
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis) /opt/intel/cc/10.1.021/lib/libirc_s.a

用icc编译Linux内核完美教程[图文]


/opt/intel/cc/10.1.021/lib/libirc_s.a 是icc的一个静态库在编译内核的过程中如果出现
undefined reference to '__intel_new_proc_init' 之类的把 libirc_s.a 联接进去即可,如果你用10.1.018 版的在 /opt/intel/cc/10.1.018/lib/libirc_s.a