首页 > 代码库 > 编译Linux-2.6.23内核中遇见的错误

编译Linux-2.6.23内核中遇见的错误

编译linux-2.6.23


错误[1]: elf_x86_64: 没有那个文件或目录

原因是 gcc 4.6 不再支持 linker-style 架构。在 arch/x86/vdso/Makefile 中,
将以 VDSO_LDFLAGS_vdso.lds 开头所在行的 “-m elf_x86_64” 替换为 “-m64”。
将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 “-m elf_x86” 替换为 “-m32”。


错误[2]: .size expression for copy_user_generic_c does not evaluate to a constant

找到arch / x86 / lib / copy_user_64.S,在文件中将END(copy_user_generic_c)更改为END(copy_user_generic_string),以在ENTRY(copy_user_generic_string)中保留相同的变量。


编译出现 undefined reference to __mutex_unlock_slowpath

在这句话里面,那你可以发现,你的函数mutex_lock很有可能在kernel某个函数文件里面,我们现在试着进去kernel/去找找看有没有

关于mutex_lock的函数文件

branches@ubuntu:/usr/src/linux-2.6.23$ ls kernel/mutex*
kernel/mutex.ckernel/mutex-debug.h  kernel/mutex.o
kernel/mutex-debug.c  kernel/mutex.h

你会看到在kernel目下确实有几个关于muxtex的文件,这个时候我们只需要打开一个相关的文件分别查看一下,就知道了

很显然我们会打开mutex.c,用Vim打开,你会看到有关的编译错误出现的函数
技术分享

你在编译出错时,当你打开此文件时,是没有这个__used的,在这个文件里面,一共有三处地方要改动,那就你自己去改吧,当你看到 __mutex_unlock_slowpath();这个函数是,同样也要在这个函数前面加上__used

注意!网上有另一个解法是在 .config文件里加宏定义CONFIG_DEBUG_MUTEXES=y经验证是不可行的


arch/i386/boot/boot.h: Assembler messages:

arch/i386/boot/boot.h:110: Error: bad register name `%dil‘[/size]

make[1]: *** [arch/i386/boot/video.o] 错误 1

make: *** [bzImage] 错误 2

其实这个问题的出现,是因为我的系统里面有gcc 和gcc 4.4,前者版本为4.1,后来我修改了把gcc 4.4重命名为默认的gcc了,才会出这个问题,修改回去就好了。

如果一定要使用gcc 4.4也可以参考网上的修改方式:

arch/i386/boot/boot.h下,asm volatile(“movw %%fs:%1,%0” : “=r” (v) : “m” ((u16 )addr));这句;

这里没有寄存器dil… 准确来说这里是没有显式使用寄存器dil, 但是, 根据http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html的介绍, 这里的r表示从esi和edi中动态选择, 这里的dil就是从这里来的了. 解决方案, edi不好使, 咱就换一组, 换q就是了, q是在eax, ebx, ecx, edx中间挑一个, 改完搞定, 重新编译通过.


branches@ubuntu:/usr/src/linux-2.6.23$ sudo make menuconfig
Makefile:416: *** mixed implicit and normal rules: deprecated syntax
Makefile:1466: *** mixed implicit and normal rules: deprecated syntax
make: *** No rule to make target ‘menuconfig‘。 停止。
branches@ubuntu:/usr/src/linux-2.6.23$ 

今天在编译uImage的时候,执行make命令,报错,错误信息:416 “mixed implicit and normal rules”,翻译为中文:混合的和隐含普通规则。起初以为是内核包的问题,从官网上下载了低版本,报同样的错误,google后发 现,是由于我的系统的make工具太新,make的旧版规则已经无法兼容新版。按照以下方式,问题得到解决:
1在makefile中将416行代码

config %config: scripts_basic outputmakefile FORCE

改为

%config: scripts_basic outputmakefile FORCE

2在makefile中将1466行代码

/ %/: prepare scripts FORCE

改为

%/: prepare scripts FORCE

编译Linux-2.6.23内核中遇见的错误