编译运行linux0.12,linux0.12 编译过程

感谢这篇文章的作者:    http://www.cnblogs.com/strugglesometimes/p/4231359.html

编译是个很蛋疼的事情,本想把linux0.12在bochs上跑起来然后就可以各模块的学习,没想各种问题。

问题1:

1 gas -c -o boot/head.o boot/head.s

2 make: gas: Command not found

gas已过时,将所有Makfile里gas -> as

具体解决方法

msed 是个简单的shell 函数,具体定义见下面的传送门。

问题2:

69c5a8ac3fa60e0848d784a6dd461da6.png

1 boot/head.s:43: Error: unsupported instruction `mov‘

2 boot/head.s:47: Error: unsupported instruction `mov‘

3 boot/head.s:59: Error: unsupported instruction `mov‘

4 boot/head.s:61: Error: unsupported instruction `mov‘

5 boot/head.s:136: Error: invalid instruction suffix for `push‘

6 boot/head.s:137: Error: invalid instruction suffix for `push‘

7 boot/head.s:138: Error: invalid instruction suffix for `push‘

8 boot/head.s:139: Error: invalid instruction suffix for `push‘

9 boot/head.s:140: Error: invalid instruction suffix for `push‘

10 boot/head.s:151: Error: invalid instruction suffix for `push‘

11 boot/head.s:152: Error: invalid instruction suffix for `push‘

12 boot/head.s:153: Error: invalid instruction suffix for `push‘

13 boot/head.s:154: Error: operand type mismatch for `push‘

14 boot/head.s:155: Error: operand type mismatch for `push‘

15 boot/head.s:161: Error: invalid instruction suffix for `push‘

16 boot/head.s:163: Error: invalid instruction suffix for `pop‘

17 boot/head.s:165: Error: operand type mismatch for `pop‘

18 boot/head.s:166: Error: operand type mismatch for `pop‘

19 boot/head.s:167: Error: invalid instruction suffix for `pop‘

20 boot/head.s:168: Error: invalid instruction suffix for `pop‘

21 boot/head.s:169: Error: invalid instruction suffix for `pop‘

22 boot/head.s:214: Error: unsupported instruction `mov‘

23 boot/head.s:215: Error: unsupported instruction `mov‘

24 boot/head.s:217: Error: unsupported instruction `mov‘

69c5a8ac3fa60e0848d784a6dd461da6.png

这是由于在64位机器上编译的原因,需要告诉编译器,我们要编译32位的code,在所有Makefile的AS后面添加 --32,CFLAGS中加-m32

具体解决方法

msed as$ as\ --32

msed -O -O\ -m32

问题3:

boot/head.s: Assembler messages:

boot/head.s:231: Error: alignment not a power of 2

make: *** [boot/head.o] Error 1

把align n -> align 2^n

具体解决方法

sed -i ‘s/align 2/align 4/g‘ boot/head.s

sed -i ‘s/align 3/align 8/g‘ boot/head.s

问题4:

gcc: error: unrecognized command line option ‘-fcombine-regs’

gcc: error: unrecognized command line option ‘-mstring-insns’

把这两个删掉即可,现在GCC已经不支持了

具体解决方法

msed -fcombine-regs \

msed -mstring-insns \

问题5:

额。。。。为了更快的找到Error的地方,我把所有的warning 都关掉了即在CFLAGS 中加-w

具体解决方法

msed -Wall -w

问题6:

69c5a8ac3fa60e0848d784a6dd461da6.png

In file included from init/main.c:8:0:

init/main.c:23:29: error: static declaration of ‘fork’ follows non-static declaration

static inline _syscall0(int,fork)

^include/unistd.h:151:6: note: indefinition of macro ‘_syscall0’

type name(void) ^init/main.c:24:29: error: static declaration of ‘pause’ follows non-static declaration

static inline _syscall0(int,pause)

^include/unistd.h:151:6: note: indefinition of macro ‘_syscall0’

type name(void) ^include/unistd.h:241:5: note: previous declaration of ‘pause’ was here

intpause(void);

^init/main.c:26:29: error: static declaration of ‘sync’ follows non-static declaration

static inline _syscall0(int,sync)

^include/unistd.h:151:6: note: indefinition of macro ‘_syscall0’

type name(void) ^include/unistd.h:252:5: note: previous declaration of ‘sync’ was here

int sync(void);

69c5a8ac3fa60e0848d784a6dd461da6.png

这里是由于include/unistd.h 中声明了一次pause() sync() fork(), 而在main.c 中通过宏又定义了这三个函数,但定义时多了static 限定,与声明不同,所以出错。所以直接把unistd.h中的声明去掉。

问题7:

init/main.c:179:12: error: static declaration of ‘printf’ follows non-static declaration

static int printf(const char *fmt, ...)

这个问题困扰了好久,网上的解决方案都是把static去掉,但是这样做,后面在链接的时候会出现另一个错误undefined reference to ‘_put‘. 新的问题是由于GCC会对printf进行优化,把无参的printf优化成put,而linux0.12的libc中又没有实现put才会导致新的问题。那么现在回到这个问题上,猜测应该也是由于GCC本身对printf这个函数名有特别的关照所致,所以把printf稍微改下名,printf -> printw。发现果然就编译通过了。

具体解决方案:

sed -i ‘s/ printf/ printw/g‘ init/main.c

问题8:

init/main.c: In function‘main’:

init/main.c:176:3: error: ‘asm’ operand has impossible constraints

__asm__("int $0x80"::"a" (__NR_pause):"ax");

类似的问题在后面编译中出现好多,C内嵌汇编的格式__asm__(汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉。

具体解决方法

find -type f -exec sed -i ‘s/:\"\w\{2\}\"\(,\"\w\{2\}\"\)*)/:) /g‘ {} \;

问题9:

make[1]: gld: Command not found

同gas, 把gld -> ld

具体解决方法

msed gld ld

问题10:

ld -r -o kernel.o sched.o sys_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

同问题2,告诉ld以32位链接,在ld命令后面加 -m elf_i386

具体解决方法

msed ld$ ld\ -m\ elf_i386

问题11:

../include/asm/segment.h: Assembler messages:

../include/asm/segment.h:27: Error: bad register name `%sil‘

去segment.h 的第27行找,没找到sil相关的东西,根据网上的方法,把=r或r 改成=q或q,果然就好了,这里应该是编译器造成的,r表示任意寄存器,在编译的时候就用了sil这个寄存器,可为什么无效还会被用到呢。q表示使用eax,ebx,ecx,edx中任意一个。

具体解决方法

sed -i s‘/r"/q"/g‘ include/asm/segment.h

问题12:

exec.c: In function‘copy_strings’:

exec.c:162:44: error: lvalue required as left operand of assignment

!(pag = (char *) page[p/PAGE_SIZE] =

if (!(pag = (char *) page[p/PAGE_SIZE]) &&

!(pag = (char *) page[p/PAGE_SIZE] =(unsigned long *) get_free_page()))

return 0;

以上是原始code,以下是OK的code

69c5a8ac3fa60e0848d784a6dd461da6.png

if ((!page[p/PAGE_SIZE]) &&

!(page[p/PAGE_SIZE] =(unsigned long *) get_free_page()))

return 0;

elsepag = (char *) page[p/PAGE_SIZE];

69c5a8ac3fa60e0848d784a6dd461da6.png

问题13:

In file included from floppy.c:42:0:

blk.h:90:6: error: #elif with no expression

#elif

这里把第90行的#elif -> #else

问题14:

make[1]: gar: Command not found

老问题了,gar -> ar

msed gar ar

问题15:

malloc.c: In function‘malloc’:

malloc.c:156:46: error: lvalue required as left operand of assignment

bdesc->page = bdesc->freeptr = (void *) cp = get_free_page();

和问题12一样

bdesc->page = bdesc->freeptr = (void *) cp = get_free_page();

上面是原始的,下面是OK的,把代码拆分下就好

cp =get_free_page();

bdesc->page = bdesc->freeptr = (void *) cp;

原文:http://www.cnblogs.com/welhzh/p/4521196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译linux tq2440,QT4.8.2在TQ2440开发板上的移植(一)--编译和安装

主机版本:Ubuntu 11.04交叉编译器版本:4.3.3移植的主要工作就是编译在ARM板上运行的qt库,并且把这些库做到根目录中。需要的文件tslib-1.4.tar.gz qt-everywhere-opensource-src-4.8.2.tar.gz具体步骤如下:1、首先编译安装触摸屏驱…

图书管理系统_目前图书管理系统存在的问题

作者:新风学术网(一) 不能准确直观地指明图书所在的空间位置目前所使用的管理系统在索书的过程中是读者先在图书馆查询系统上查询到所要借的图书并记录下这本书的索书号和馆藏地, 再根据索书号到书的馆藏地所在位置查找书。有些读者对索书号是怎么排架的并不了解, 也…

(dp)数字三角形

题目方案1:递归方案二:递推 题目 数字三角形问题。有一个由非负整数组成的三角形,第一行只有一个数,除了最下行 之外每个数的左下方和右下方各有一个数 从第一行的数开始,每次可以往左下或右下走一格,直…

mfc tabcontrol 修改白色背景_初级会计报名准备工作如何使用美图秀秀PC版修改照片尺寸、格式、大小...

点击上方蓝字关注我们证件照是我们生活中常用的东西,大学考证需要证件照,制作简历也需要用到证件照,工作有时也需要用到,然而最让我们头疼的是每次报名证件照的要求都不一样,其中底色和尺寸是经常需要修改的&#xff0…

分步表单_表单设计-掌握表单设计方法(表单体验篇)

全篇阅读大概需要15min,对表单设计不熟悉的同学看完后肯定会有不少的收获~~~说到表单其实在生活中可以接触到各种各样的表单,比如:驾照申请表、体检表、银行开户需要填写的表等等,这些都是表单,主要目的就是让用户填写…

4)lsof linux命令,***Linux命令实时监测系统(top,htop,iotop,lsof,tcpdump,netstat,vmstat,iostat)...

摘要:本文总结了8个非常实用的Linux命令行性能监测工具,这些命令支持所有的Linux系统,不仅可以用于监控系统,还可以发现导致性能问题的原因所在。对每个系统/网络管理员来说,每天监测Linux系统性能是一项非常艰巨的任务…

算法竞赛入门经典 第七章 总结

目录: 7.1 简单枚举7.2 枚举排列7.3 子集生成 7.1 简单枚举 例题7-1 除法(Division, UVa 725) 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij n的表达式,其中a~j恰好 为数字0&#xff5e…

线性表总结

线性表及其实现多项式的表示什么是线性表线性表的抽象数据类型描述线性表的顺序存储实现线性表的链式存储实现 线性表及其实现 多项式的表示 [例] 一元多项式及其运算 一元多项式 : 主要运算:多项式相加、相减、相乘等 【分析】如何表示多项式?…

mix2s android p功能,已升安卓P!网友:MIX2S才是亲儿子

原标题:已升安卓P!网友:MIX2S才是亲儿子一直以来,小米在手机系统更新上都有着非常明显的优势,MIUI经过了多年的更新迭代,如今已经达到了非常不错的易用性,而且流畅度方面的表现更是优秀。如今小…

堆栈总结

堆栈什么是堆栈堆栈的抽象数据类型描述栈的顺序存储实现 堆栈 什么是堆栈 计算机如何进行表达式求值? 算术表达式56/2-3*4。 正确理解: 56/2-3*4 53-3*4 8-3*4 8-12 -4 由两类对象构成的: 运算数,如2、3、4 运算符号…

harmonyos公测招募,nova为主 HarmonyOS 2.0开发者Beta公测再招募

原标题:nova为主 HarmonyOS 2.0开发者Beta公测再招募HarmonyOS 2.0开发者Beta公测招募将开启第二期,本次公测活动主要针对的机型是华为nova系列。活动报名时间为5月9日-5月17日。【PChome手机频道资讯报道】华为方面在4月份开启了HarmonyOS 2.0开发者Bet…

队列总结

什么是队列 队列(Queue):具有一定操作约束的线性表 插入和删除操作:只能在一端插入,而在另一端删除 数据插入:入队列(AddQ) 数据删除:出队列(DeleteQ) 先来先服务 先…

D P- 免费馅饼

题目 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以ga…

一加桌面3.0 android8,一加手机XRemix6.0安卓8.1.0Beta2.0定制本地化增强适配归属农历等...

制作者:moonlight-roms基于版本:remix最新安卓8.1.0代码适合机型:一加手机X双网版/全网通版/E1001/E1003等/onyx注意事项:1.开机后语言设置:Settings-system-languageandinput-添加一个中文需要并拖动到第一行设置为默…

震惊!Fibonacci Again

题目 There are another kind of Fibonacci numbers: F(0) 7, F(1) 11, F(n) F(n-1) F(n-2) (n>2). Input Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Output Print the word “yes” if 3 divide evenly into …

华为鸿蒙手机和电视通话,鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大...

原标题&#xff1a;鸿蒙智慧屏首秀&#xff1a;逾10万人预定&#xff0c;电视视频通话功能强大上周五&#xff0c;大家期待已经的华为开发者大会正式召开&#xff0c;华为鸿蒙系统在这一天对外发布。历时数年&#xff0c;经过几千人的研发&#xff0c;终于正式落地。曾经&#…

两文本一图片android,Android富文本编辑器(二):图文混排以及图片上传处理

对于一个富文本编辑器来说&#xff0c;图文混排是最基本的功能。而从上一篇文章中我们知道图文混排需要使用ImageSpan。下面这段代码摘自我的RichEditText源码&#xff1a;/*** 添加图片* param filePath 图片文件路径*/public void addImage(String filePath) {SpannableStrin…

震惊! Rightmost Digit 快速幂解决

题目 Given a positive integer N, you should output the most right digit of N^N. Input The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case conta…

android handler同步,android解决:使用多线程和Handler同步更新UI

如果运行时&#xff0c;可以看到滚动条由条慢慢变短&#xff0c;则说明程序成功了。截图如下&#xff0c;建议选择大点的文件做测试。main.xmlxmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"wrap_content" android:id&…

html玫瑰花效果代码,html5渲染3D玫瑰花情人节礼物js特效代码

情人节马上就要到来了&#xff0c;这里给程序员前端设计师们献上一个&#xff0c;html5渲染而成的3D玫瑰花js效果&#xff0c;可以作为虚拟的情人节礼物送给自己的爱人。支持html5的浏览器查看。查看演示下载资源&#xff1a;16次 下载资源下载积分&#xff1a;20积分情人节玫瑰…