编译linux-2.6.32的时候出现的错误以及解决办法

时间:2022-05-05 16:15:55
编译linux-2.6.32的时候居然报错: .size expression for do_hypervisor_callback does not evaluate to a constant 这里加"居然"是因为之前对这个内核编译过很多次,于是根据报错的提示,找到文件arch/x86/kernel/entry_64.S的do_hypervisor_callback函数,发现这个函数的代码显然有语法错误:
  1. > ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs)
  2. > [..]
  3. > END(do_hypervisor_callback)
于是将其改为END(xen_do_hypervisor_callback),编译通过。\



make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] 错误 1
make[1]: *** [arch/x86/vdso] 错误 2
make: *** [arch/x86] 错误 2

方法
在 arch/x86/vdso/Makefile 中,将以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"。


使用gcc4.6.3编译linux2.6.32.12内核出现错误如下:

         In file included from drivers/net/igbvf/ethtool.c:36:0:

         drivers/net/igbvf/igbvf.h: 在文件作用域:

         drivers/net/igbvf/igbvf.h:128:15: 错误: 重复的成员‘page’

         make[4]: *** [drivers/net/igbvf/ethtool.o] 错误 1

         make[3]: *** [drivers/net/igbvf] 错误 2

         make[2]: *** [drivers/net] 错误 2

         make[1]: *** [drivers] 错误 2

         make[1]:正在离开目录 `/usr/src/linux-2.6.32.2'

         make: *** [debian/stamp/build/kernel] 错误 2

 

解决方法:

1. 根据linux社区的建议,此错误是由于gcc版本与内核版本的冲突导致的。他们的建议是更换新版本的内核,但是某些特殊条件下,我们不能更换内核版本,于是我们修改内核代码适应当前的编译器。

2. 按照错误的指示,错误的代码是在drivers/net/igbvf/igbvf.h文件的第128行。

3. 打开文件,看128行,代码为:struct page *page;再往上看,第123行,也有struct page *page这行代码,这个结构定义在内部的一个结构体中。就是他的名字与128行的重复了,而4.6.3的编译器对不支持这种方式的定义,我们修改128行的代码为struct page *pagep;保存退出;