新世界loongarch从gcc-12开始支持
gcc-8.5.0和gcc-9.5.0补丁在下面,基于官方旧世界gcc-8.3.0的补丁移植微调,gcc-8和gcc-9的架构差异不大,因此改吧改吧gcc-9也ok。gcc-7/gcc-10简单尝试了下没成功。
https://github.com/jackyjkchen/legacy-gcc/blob/master/sys-devel/gcc/files/8.5.0/loong/00_support-loongarch.patch
https://github.com/jackyjkchen/legacy-gcc/blob/master/sys-devel/gcc/files/9.5.0/loong/00_support-loongarch.patch
gitee上有同名mirror
推荐用gentoo安装,除了只测试了gentoo外(上述项目就是gentoo的overlay),还对glibc有限制,gentoo重编glibc最方便
glibc补丁不大,在
https://github.com/jackyjkchen/legacy-gcc/blob/master/etc/portage/patches/sys-libs/glibc/03_workaround-loong-gcc89.patch
或者你限制编译glibc的gcc不超过gcc-12.x也行,gcc-13+就会激活上面删掉的那段代码,从而让gcc-8/gcc-9的编译产物hang,打了补丁就不限制gcc版本了
binutils的情况要更hack,存在一个矛盾,最新的binutils的汇编器和gcc-8/gcc-9不兼容,而旧版本的链接器不认识loongarch新加的那一堆reloc type,我曾尝试干脆跳过这些判断,但发现在静态链接场景下有问题(入口地址没有字长对齐)。因此对原生binutils修改最小的方案就是混合binutils-2.39的汇编器和binutils-latest的链接器使用。这在gentoo overlay中是全自动的依赖关系,其他发行版就需要自己折腾了。

完整gcc的testsuite跑过
https://github.com/jackyjkchen/legacy-gcc/blob/master/example/test_summary/loongarch64-unknown-linux-gnu/gcc-8.5.0.txt
https://github.com/jackyjkchen/legacy-gcc/blob/master/example/test_summary/loongarch64-unknown-linux-gnu/gcc-9.5.0.txt
看起来基本是收敛的,当然不推荐用于新世界生产环境
这个移植其实2023年就做出来了(见git log),中间旧世界的gcc-8的官方patch还有过大幅更新,我这边同步追上。以及glibc + gcc-13/gcc-14编译后,gcc-8/gcc-9编译产物hang的问题,以及刚遇到的升级glibc-2.42后的静态链接对齐问题。我一度想放弃这个移植(其实本来就是玩具性质,初始移植他也就花两三天),不过现在这些问题都解决了,那就放出来。
对于有经常切换gcc版本测试需求的,也顺手推荐我这个https://github.com/jackyjkchen/legacy-gcc,从gcc-1.42到gcc-15,全系native支持(当然只有x86能支持到gcc-1.42/gcc-2.x这样的老版本),同时支持cygwin/mingw/djgpp的交叉工具链。
