Gcc 在ubuntu 18.04上重新编译古老的linux-0.12时,例程地址错误
试图在Ubuntu 18.04上重新编译linux-0.12(听起来很傻?) 在修改了linux-0.12的一些原始代码之后(太多了,无法在此列出更改的内容)。最后,昨天可以成功地编译和链接整个内容。现在的问题是进入保护模式后,例程Gcc 在ubuntu 18.04上重新编译古老的linux-0.12时,例程地址错误,gcc,assembly,linux-kernel,ld,Gcc,Assembly,Linux Kernel,Ld,试图在Ubuntu 18.04上重新编译linux-0.12(听起来很傻?) 在修改了linux-0.12的一些原始代码之后(太多了,无法在此列出更改的内容)。最后,昨天可以成功地编译和链接整个内容。现在的问题是进入保护模式后,例程setupidt的地址似乎出错了! 下图:(使用Bochs进行调试时) 下面是代码片段:在调用setupidt 我想原因是gcc选项还是链接器选项?谢谢 startup_32: movl $0x10,%eax mov %ax,%ds mov %
setupidt
的地址似乎出错了!
下图:(使用Bochs进行调试时)
下面是代码片段:在调用setupidt
我想原因是gcc选项还是链接器选项?谢谢
startup_32:
movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
lss stack_start,%esp
call setupidt
call setupgdt
movl $0x10,%eax # reload all the segment registers
Ubuntu 18.04,gcc 7.4.0 ld 2.3
生成文件的一部分:
AS =as --32
LD =ld
CFLAGS = -m32 -Wall -fstrength-reduce -fomit-frame-pointer \
-g3 -gdwarf-4 -O0 -fno-stack-protector -fno-builtin #-g3 -gdwarf-2 -m32
# -fno-defer-pop for fs
# -finline-functions for kernel and 3 sub folder, and lib and mm
LDFLAGS = -m elf_i386 -Ttext 0 -e startup_32#-s -x -M
有关整个Makefile和所有内容,请参见
程序正确进入保护模式。链接器或gcc选项?这里的
-fno pie-no pie
重要吗?编写代码和构建脚本时,当前默认的-fpie-pie
不存在,因此它们可能不会对此进行解释。谢谢你,彼得。在将-fno饼图添加到CC、将-no饼图添加到LD后,此问题已修复。最后我进入了主通道()。我今天遇到的下一个寻址错误(:>)是调用printk()时,它是在printk.c中的文件夹内核下定义的。我会努力解决自己的问题。如果我不能,我会向你们求助。谢谢。-fno pie-no pie
在这里重要吗?编写代码和构建脚本时,当前默认的-fpie-pie
不存在,因此它们可能不会对此进行解释。谢谢你,彼得。在将-fno饼图添加到CC、将-no饼图添加到LD后,此问题已修复。最后我进入了主通道()。我今天遇到的下一个寻址错误(:>)是调用printk()时,它是在printk.c中的文件夹内核下定义的。我会努力解决自己的问题。如果我不能,我会向你们求助。谢谢