发现gcc编译的过程中导致莫名bug无法运行
自制OS中,第一本参考书用的是作者自(过)己(时)的工具链,强迫症不能忍受他那命令行参数的格式…
于是自然而然想到gcc,那么ld顺带着出来了,试试呗
首先,可以自行bd NASK跟NASM的区别(就那个times和RESB),把"ipl"和"func"包括"asmhead"改成nasm的语法
然后,着手改Makefile
:
1.nasm
来替代nask
2.正常的cc1
(mingw有个子目录下有,自己搜索)替代z_tools
的cc1(注意不是gcc -S)
3.加个步骤,as --32 $*.s -o $*.o
链接和加载不需要改,这个还在研究
现在来说下为什么不直接gcc -c -m32
来做个小实验,如果用gcc -c -m32 生成会是什么效果:
把配色给我改没了()
正常情况下,如果cc1(mingw的,不是ztools),会是这样:
这什么神仙操作…
如果换成gcc -S,就会有这种:
同时偶然我发现一点,如果主程序使用gcc -S
&&as --32
组合或者gcc -c -m32
(下文不强调32位了,默认)直接不能运行
这玩意的原因?先来看看汇编代码吧.
前者使用cc1 -m32 -std=c99 graphic.c -o cc1_comp.s
后者gcc -m32 -std=c99 graphic.c -o gcc_comp.s
先打开看下:
好像没啥毛病就这里不同(左边gcc右边cc1)
那么主文件出毛病是为啥呢…
这个暂时没查出来,所有全部一毛一样,连汇编出来的目标文件的md5都是一样的.
总而言之在底层开发中,不能太过于相信gcc的默认处理,那是位windows准备的,具体原因不明但是总会有一些刺激和惊喜,老老实实用cc1吧…