Linux 0.11内核编译错误记录

 我来答
世纪网络17
2022-06-29 · TA获得超过5949个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:142万
展开全部

现象1: 提示gas gld 比识别
措施: gnu编译器发展到后来,越来越流行,更多使用别名为 as ld gcc等.

现象2: 提示字节对齐需要是 2的倍数
措施: 具体解决方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替换align 2 为 align 4(align 3 替换为 align 8)
sed -i 's/align 2/align 4/g' boot/head.s
sed -i 's/align 3/align 8/g' boot/head.s

现象3: -fcombine-regs -mstring-insns选项不识别
措施: 此两个选项已经过时,直接去掉即可

现象4: warning 特别多
措施: 将-Wall 替换为 -w

现象5: __stack_chk_fail 未定义
措施: 去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护

现象6: main.c 中_syscall0重复定义
措施: main.c static inline _syscall0(int, fork) 去掉static即可

现象7: 提示内嵌汇编不符合语法限制
措施: 类似的问题在后面编译中出现好多,C内嵌汇编的格式 asm (汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定 输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉 解决方案:find -type f -exec sed -i 's/:"\w{2}"(,"\w{2}") )/:) /g' {} ; 其中's/:"\w{2}"(,"\w{2}") /:/g'

现象8: 在 control.c 中清楚定义了 static unsigned char attr = 0x70 ,而在链接 control.o 时,却爆出 attr未定义。
措施: nm -C control.o 查看其符号,发现attr确实处于未定义状态。故单独编译一个小程序定义静态变量,查看其 .o 文件中,发现静态变量定义正常。故考虑为编译选项差异导致,最终发现因为 -O 编译优化选项导致,目前处理方式是去掉该选项。

现象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通过分析编译打印信息,发现编译时没有加入头文件路径 -Iinclude

现象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'
措施: 查找发现此函数定义在buffer.c 中,且为内联函数, 故尝试将其更改为普通函数, 然后编译通过.

现象11: 编译 build.c 时报错:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’
措施: 分析发现时此系列错误均由 -Iinclude 选项导致, 而该选项在 想象9 中加入, 故考虑去掉该选项, 直接在build.c 中加入 MAJOR 宏定义.

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式