一 说明
使用全志(Allwinner )A20处理器,为其单独编译内核时,首次编译有时会遇到以下错误:
arch/arm/mach-sun7i/pm/standby.S:3: Error: file not found: arch/arm/mach-sun7i/pm/standby/standby.code
如下图所示:
其实不仅仅是该问题,还有以下几个错误:
arch/arm/mach-sun7i/pm/mem.S:3: Error: file not found: arch/arm/mach-sun7i/pm/standby/super/suspend/suspend.code
arch/arm/mach-sun7i/pm/mem.S:9: Error: file not found: arch/arm/mach-sun7i/pm/standby/super/resume/resume0.code
这两个问题其实和第一个问题是一个问题,第一个问题解决了这两个问题也会同时解决。
二 错误造成原因
该问题是在linux内核3.3版本中遇到的,并且是在全志官方提供的SDK(A20_SDK_20130319.tar.gz)中遇到的,用SDK中的脚本编译时有该问题,单独编译其中的内核(不使用SDK中的脚本,直接使用make编译内核源码)时也会遇到该问题,该问题只在第一次编译时出现,之后编译不会有该问题,如果distclean后编译可能会再遇到(未测试),遇到后的处理方法是一样的。
造成该问题的原因是arch/arm/mach-sun7i/pm/standby目录下的文件没有编译,至于为什么没有编译和之前怎么没有该问题等,在此处不讨论(关键是本人没有深入研究,也不知道原因),此处只说明遇到该问题后的解决办法。
三 解决办法
解决办法很简单,就是手动编译standby就好了。
此处需要注意的是,如果编译内核时的输出文件并非内核目录而是其他目录(make时使用了O参数,如make uImage O=/tmp/build),需要多做一些处理,这种情况在后边介绍。
打开standby目录下的Makefile,发现有两个变量KDIR和CROSS_COMPILE,由于该模块是单独手动编译,所以它不能从上层模块继承该变量,需要make时传进去。
#makefile for standby.bin
INCLUDE = -I. \
-I$(KDIR)/include \
-I$(KDIR)/arch/arm/mach-sun7i/include \
... ...
CC = $(CROSS_COMPILE)gcc
知道需要的参数后就开始编译该模块:
#进入内核目录
$cd /home/linux/ex/linux-3.3/
#进入standby模块目录
$cd arch/arm/mach-sun7i/pm/standby
#编译模块
$make KDIR=/home/linux/ex/linux-3.3 CROSS_COMPILE=arm-linux-gnueabi-
此时就开始编译,编译过程中会有恨到打印信息,其中会出现以下4个信息:
到此,模块编译完成,可以继续编译内核了。
上边提到编译内核时的输出文件并非内核目录而是其他目录,此时需要多两个操作:
- 修改该模块的Makefile
- 拷贝生成的.code文件到输出文件的对应目录
1)该模块编译时依赖内核配置时产生的include/generated下的头文件,所以需要将输出文件下的include路径添加到Makefile的INCLUDE变量中,添加后的Makefile如下:
#makefile for standby.bin
INCLUDE = -I. \
-I$(KDIR)/include \
-I$(KDIR)/arch/arm/mach-sun7i/include \
-I/tmp/build/include \
在Makefile中添加了-I/tmp/build/include \,其中/tmp/build是编译内核时的文件输出路径(make时的参数O的值)。
2)编译后要将生成的standby.code、suspend.code、resume0.code及resume1.code分别拷贝到编译目录(如/tmp/build)下的对应位置:
/tmp/build/arch/arm/mach-sun7i/pm/standby/
/tmp/build/arch/arm/mach-sun7i/pm/standby/suspend/
/tmp/build/arch/arm/mach-sun7i/pm/standby/resume/
到此,该问题解决。