使用環(huán)境
- 系統(tǒng): Ubuntu16.04.1
- 編譯器: gcc version 5.4.0 as86 version: 0.16.17 ld86 version: 0.16.17
- 源碼: Linux 0.11 source code
錯誤列表
現(xiàn)象1: 提示gas gld 比識別
措施: gnu編譯器發(fā)展到后來,越來越流行,更多使用別名為 as ld gcc等.
現(xiàn)象2: 提示字節(jié)對齊需要是 2的倍數(shù)
措施: 具體解決方法: 利用命令 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
現(xiàn)象3: -fcombine-regs -mstring-insns選項不識別
措施: 此兩個選項已經(jīng)過時,直接去掉即可
現(xiàn)象4: warning 特別多
措施: 將-Wall 替換為 -w
現(xiàn)象5: __stack_chk_fail 未定義
措施: 去網(wǎng)上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要棧保護(hù)
現(xiàn)象6: main.c 中_syscall0重復(fù)定義
措施: main.c static inline _syscall0(int, fork) 去掉static即可
現(xiàn)象7: 提示內(nèi)嵌匯編不符合語法限制
措施: 類似的問題在后面編譯中出現(xiàn)好多,C內(nèi)嵌匯編的格式asm(匯編語句:輸入寄存器:輸出寄存器:可能被修改的寄存器),最新的GCC規(guī)定 輸入或輸出寄存器不能出現(xiàn)在可能被修改的寄存器中,目前看到網(wǎng)上的方法是把所有類似問題的可能被修改的寄存器全部刪掉 解決方案:find -type f -exec sed -i 's/:"\w{2}"(,"\w{2}"))/:) /g' {} ; 其中's/:"\w{2}"(,"\w{2}")/:/g'
現(xiàn)象8: 在 control.c 中清楚定義了 static unsigned char attr = 0x70,而在鏈接 control.o 時,卻爆出 attr未定義。
措施:用 nm -C control.o 查看其符號,發(fā)現(xiàn)attr確實處于未定義狀態(tài)。故單獨編譯一個小程序定義靜態(tài)變量,查看其 .o 文件中,發(fā)現(xiàn)靜態(tài)變量定義正常。故考慮為編譯選項差異導(dǎo)致,最終發(fā)現(xiàn)因為 -O 編譯優(yōu)化選項導(dǎo)致,目前處理方式是去掉該選項。
現(xiàn)象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通過分析編譯打印信息,發(fā)現(xiàn)編譯時沒有加入頭文件路徑 -Iinclude
現(xiàn)象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference toinvalidate_buffers'
措施: 查找發(fā)現(xiàn)此函數(shù)定義在buffer.c 中,且為內(nèi)聯(lián)函數(shù), 故嘗試將其更改為普通函數(shù), 然后編譯通過.
現(xiàn)象11: 編譯 build.c 時報錯:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’
措施: 分析發(fā)現(xiàn)時此系列錯誤均由 -Iinclude 選項導(dǎo)致, 而該選項在想象9中加入, 故考慮去掉該選項, 直接在build.c 中加入 MAJOR 宏定義.