ubutu14 下编译linux0.11内核错误记录及解决方法

下载 linux-0.11-gdb-rh9-050619.tar.gz 代码,以它为蓝本编译。

别编了,github上有现成的可编译版本,不要浪费这个时间了!!!

1. boot/head.s:45: Error: unsupported instruction `mov'

原因: 这是因为本机系统为64位,
因此需要给所有Makefile中的as命令加上 --32 选项。
需给所有Makefile中的CFLAGS加上 -m32 选项。

2.
gcc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ instead
修改:
 -mcpu=i386 改为-march=i386

3.
init/main.c:23: error: static declaration of 'fork' follows non-static declaration

修改, 把static 全去掉。
inline _syscall0(int,fork)
inline _syscall0(int,pause)
inline _syscall1(int,setup,void *,BIOS)
inline _syscall0(int,sync)


4.
 warning: function definition has qualified void return type [enabled by default]
 static inline volatile void oom(void)

解决办法: 把volatile void 中的volatile 统统去掉

5
as -o system_call.o system_call.s
system_call.s: Assembler messages:
system_call.s:77: Error: invalid instruction suffix for `push'

解决办法:
32位代码要用--32 选项

$as --32 -o system_call.o system_call.s
system_call.s: Assembler messages:
system_call.s:94: Warning: indirect call without `*'

修改94行代码,加上一个*
$ as --32 -o system_call.o system_call.s
$

6. 链接错误
ld -r -o kernel.o sched.o system_call.o traps.o asm.o fork.o panic.o printk.o vsprintf.o sys.o exit.o signal.o mktime.o
ld: Relocatable linking with relocations from format elf32-i386 (sched.o) to format elf64-x86-64 (kernel.o) is not supported
make[1]: *** [kernel.o] Error 1
解决办法,在x86-64上链接出x86 文件,添加 -m elf_i386 选项
ld -m  elf_i386 -r -o kernel.o sched.o system_call.o traps.o asm.o fork.o panic.o printk.o vsprintf.o sys.o exit.o signal.o mktime.o


7. 与内建冲突
gcc -march=i386 -Wall -O -g -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include -m32 \
    -c -o traps.o traps.c
In file included from traps.c:13:0:
../include/string.h:128:22: warning: conflicting types for built-in function ‘strchr’ [enabled by default]
 static inline char * strchr(const char * s,char c)

解决办法: 添加 -fno-builtin
 gcc -march=i386 -Wall -O -g -fno-builtin -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include -m32 -c -o traps.o traps.c


8.
exec.c:139:44: error: lvalue required as left operand of assignment
         !(pag = (char *) page[p/PAGE_SIZE] =

解决办法: 代码逻辑不清晰,重新调整一下使符合规范

9.
blk.h:87:6: error: #elif with no expression
 #elif

简单:#elif 改为 #else

10.
In file included from string.c:14:0:
../include/string.h:38:22: warning: ‘strncpy’ defined but not used [-Wunused-function]
 static inline char * strncpy(char * dest,const char *src,int count)

定义了static 又未使用。
先让它shut-off, -Wno-unused-function

11. 连接错误
/home/hjj/linux0.11/linux-gdb-rh9/linux/kernel/vsprintf.c:92: undefined reference to `__stack_chk_fail'

解决办法:
gcc 把代码当成应用,来在函数尾部调用stack 检查错误,告诉它这是os, 不用检查了。
或者你自己添加一个stack_chk_fail. 简单禁止掉即可
-fno-stack-protector

12.
/linux/tools/build.c:72: undefined reference to `MAJOR'
/linux/tools/build.c:73: undefined reference to `MINOR'

解决办法。 它使用的是系统头文件。
把linux/fs.h 中的定义copy 到代码里即可

13.
tools/build.c:97:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
  if (((long *) buf)[0]!=0x04100301)

解决办法:
它不希望左侧 buf(char *) 强制转换为long*, 令它shut-off
-Wno-strict-aliasing


14.
warning: array subscript has type ‘char’ [-Wchar-subscripts]

char 类型是有正负值的,容易出错,所以给出警告。
解决办法。 可以改为unsigned char

这样,ubuntu 14 上编译通过了linux0.11, 也没有了warning 信息

不过别高兴太早,运行还有些问题。

让它运行起来,是下一步任务。

你可能感兴趣的:(kernel)