CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 6571|回复: 0

一次由于编译优化参数引起的内核编译错误

[复制链接]
发表于 2014-11-9 15:03:26 | 显示全部楼层 |阅读模式
我在编译cubietruck的内核时,出现如下错误,然后编译就停止了
  1. LD      arch/arm/mach-sun7i/pm/standby/standby.elf
  2. arch/arm/mach-sun7i/pm/standby/mem_printk.o: In function `itoa':
  3. /mnt/build/cubie-kernel-source/arch/arm/mach-sun7i/pm/standby/mem_printk.c:168: undefined reference to `memcpy'
  4. arch/arm/mach-sun7i/pm/standby/mem_printk.o: In function `utoa':
  5. /mnt/build/cubie-kernel-source/arch/arm/mach-sun7i/pm/standby/mem_printk.c:214: undefined reference to `memcpy'
  6. arch/arm/mach-sun7i/pm/standby/mem_printk.o: In function `print_align':
  7. /mnt/build/cubie-kernel-source/arch/arm/mach-sun7i/pm/standby/mem_printk.c:369: undefined reference to `memcpy'
  8. make[3]: *** [arch/arm/mach-sun7i/pm/standby/standby.elf] Error 1
  9. make[2]: *** [arch/arm/mach-sun7i/pm/standby/standby.bin] Error 2
  10. make[1]: *** [arch/arm/mach-sun7i/pm] Error 2
  11. make: *** [arch/arm/mach-sun7i] Error 2
  12. make: *** Waiting for unfinished jobs....
复制代码
定位到arch/arm/mach-sun7i/pm/standby/mem_printk.c的168行,却发现并没有调用到”memcpy“函数。
  1. 162 char *itoa(int value, char *string, int radix)                                                                                                            
  2. 163 {                                                                                                                                                         
  3. 164     char stack[16];                                                                                                                                       
  4. 165     int  negative = 0;          //defualt is positive value                                                                                               
  5. 166     int  i;                                                                                                                                               
  6. 167     int  j;                                                                                                                                               
  7. 168     char digit_string[] = "0123456789ABCDEF";                                                                                                            
  8. 169      
复制代码
那么问题出在哪里呢?很可能就是编译器优化出的问题。我是在arm环境下编译的,gcc是debian7 arm源里面安装的。
  1. sing built-in specs.
  2. COLLECT_GCC=gcc
  3. COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
  4. Target: arm-linux-gnueabihf
  5. Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
  6. Thread model: posix
  7. gcc version 4.6.3 (Debian 4.6.3-14)
复制代码
那么好吧!我们就看下优化参数。一般每个模块都有自己的编译参数,所以我们要打开
arch/arm/mach-sun7i/pm/standby/Makefile
  1. 15 KBUILD_CFLAGS := $(LINUXINCLUDE) -I$(srctree)/arch/arm/mach-sun7i/pm -Os -g -c                                                                           
  2. 16 KBUILD_CFLAGS += -nostdlib -march=armv7-a -marm -mlittle-endian -D__STANDBY_MODULE__                                                                     
  3. 17 KBUILD_CFLAGS += -fno-unwind-tables -fno-asynchronous-unwind-tables                                                                                       
  4. 18 KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
复制代码
看到了第15行的编译优化参数-Os,这个是介于O2和O3之间的优化选项,把-Os改为-O2,编译。没有出错。
所以以后编译内核的时候遇到莫名其妙的问题,很可能就是编译参数出错了。之前大家说的某某版本的gcc编译不了内核,很可能就是因为不同版本的编译优化方式不一样。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-22 19:12 , Processed in 0.018562 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部