一直用gcc4.9编译pmon, 这几天尝试在新版本的gcc编译pmon, 到gcc7都是没有问题的, 到gcc8开始, 默认使用硬浮点,编译出来的pmon 不能启动, 估计是因为硬浮点没有进行初始化, 在CFLAGS增加一项 -msoft-float解决,
新版本的gcc默认不再合并重复定义的变量, 比如在某个.h中定义了一个变量, 然后有几个.c, include包含了这个.h, 于是就出现了重复变量,在合并这些.o的时候, 早期的gcc是会自动合并这些变量, 新版本的gcc会报变量重复错误,停止编译, 在CFLAGS增加一项 -fcommon, 让它跟以前一样合并重复定义的变量,就ok了。
到gcc11的,出现编译成功, 但是不能启动,对gcc10与gcc13之间的8000个patch, 用2分法进行定位,17次编译测试后, 找到了问出在commit 5879ab5fafedc
1 bad
4040 bad 5b884e940074156 2019-10-21
6059 bad 2fdc20b65c2f340
7069 bad 536b4592a148f50
7321 bad ed383d79ee753208f0df0cdad
7447 bad aa992ce717568eb88b324 EPC=81002b0c
7455 bad 5fa3b3cb4605
7459 bad 16f8992e7fec7b8d4 EPC=81002b0c
7460 bad 5879ab5fafedc
7461 ok 32d941139e814
7463 ok 832ece8
7478 ok b7c28a47c2d57bc
7510 ok 66b54d88e9d33
7574 ok 0ec537f3500924
8079 ok
原本-O3的一个优化项OPT_ftree_loop_distribute_patterns 被错误的放到了-O2:
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -550,7 +550,7 @@ static const struct default_options default_options_table[] =
{ OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
- { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
+ { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
这个优化项, 是用gcc自带的memcpy/memset 代替用户的memcpy/memset, 造成pmon出错,
所有的补丁, 已经放到 https://github.com/lshw/loongosn1-pmon
使用debian12的交叉编译工具, 就可以完成编译。
apt-get install gcc-12-mipsel-linux-gnu gcc-mipsel-linux-gnu
启动过程:
Configuration [FCR,EL,NET]
Git:git@github.com:lshw/loongson1-pmon.git
Commit Id: abf3d89
Commit Date: 2023-12-27 12:12:26 +0000
MakeTime: 2023-12-27 12:25:33 +0000.
Supported loaders [txt, srec, elf, bin]
Supported filesystems [sdcard, mtd, net, fs/yaffs2, fat,]
This software may be redistributed under the BSD copyrig.
Copyright 2000-2002, Opsycon AB, Sweden.
Copyright 2005, ICT CAS.
CPU Loongson 1C300 OpenLoongson @ 252.00 MHz / Bus @ 126z
Memory size 64 MB ( 64 MB Low memory, 0 MB High memor.
Primary Instruction cache size 16kb (32 line, 4 way)
Primary Data cache size 16kb (32 line, 4 way)
BEV in SR set to zero.
Press <Enter> to execute loading image:mtd0
Press any other key to abort.
PMON> vers
PMON: Git:git@github.com:lshw/loongson1-pmon.git
Commit Id: abf3d89
Commit Date: 2023-12-27 12:12:26 +0000
MakeTime: 2023-12-27 12:25:33 +0000
GCC: 12.0
PMON>