LFS on MIPS64 全过程笔录
Update 20191222: 咕咕咕!关于 MIPS 我 2019 年什么都没有做,而且短时间内可能也不会做。以下关于发行版配置的内容已经过时,现在我的想法又不同了,所以就当个 LFS 踩坑记录参考吧。先做些备注以免误导大众。
明年年初,社区合作的 MIPS Port 即将(第二次)正式开机,我将继续扮演架构维护者,我会用维护者技术手段努力创造一个能用的形象,文体两开花,弘扬 MIPS 文化,希望大家多多关注
另可参见我两年前记录的 LFS on MIPS64 笔记。
编译平台
Junde Yhi, [22.12.18 22:50] [In reply to Neo_Chen (neo_chen@NeoVAX)] Host 是由江苏龙芯梦兰公司提供的 Fedora 28 (Loongson ver.) 一套
Junde Yhi, [22.12.18 22:51] 在此我们谨对 sunhaiyong 先生表示我们一贯的崇高敬意
Junde Yhi, [22.12.18 22:51] 没有 sunhaiyong 就没有 aosc [os mips port]
目标平台
20191222 注:没有 gnuabin64
这种写法,完全就是胡搞。N64 就是 gnuabi64
。
- AOSC OS MIPS64EL “Care”1 Port
mips64el-aosc-linux-gnuabin64
- (Legacy) MIPS-III ISA
- AOSC OS MIPS64EL “Modern” Port
mipsisa64r2el-aosc-linux-gnuabin64
2- MIPS64 revision 2 ISA
LFS 过程基本遵循标准 LFS 教程,因此我只按 LFS 步骤记下要注意或者要添加的事项。
4.4. Setting Up the Environment
20191222 注:$LFS_BLD
真的就是为了好看(一些诸如 Bash 之类的软件会记录 Triplet),所以是没有必要的。
- 注意调整
$LFS_TGT
到目标平台 Tuple - 可以考虑添加一些常用变量:
$LFS_BLD
当前平台 Tuple,因为config.guess
给的*-unknown-*
还是丑了点$MAKEFLAGS
放-j$(( $(nproc) + 1 ))
(执行nproc
得到当前 CPU 数,加一)让make
多线程编译,而不需要每次都打-jN
5.4. Binutils-2.31.1 - Pass 1
- 注意添加
--build=$LFS_BLD
(实际上可能没有意义) - 按照 AOSC OS 文件系统结构定义,LFS 给出的在 x86_64 上的
lib64 -> lib
链接也需要做好
5.5. GCC-8.2.0 - Pass 1
- 在修改 GCC 默认链接器位置的时候(The following command will change the location of GCC’s default dynamic linker to use the one installed in /tools),注意切换
i386
到mips
- 并且
mips
下没有linux64.h
,所以可以免去这一替换
- 并且
- LFS 对
x86_64
修改了默认的 64 位链接库目录到lib
(Finally, on x86_64 hosts, set the default directory name for 64-bit libraries to “lib”);对 MIPS,我尚不清楚位于gcc/config/mips/t-linux64
的类似修改是否有意义,因为这里面的lib{,32,64}
定义是对 Multiarch 的,在没有 Multiarch 的情况下应该不起效,所以我没有修改这一项。 - 在
configure
处:
5.7. Glibc-2.28
- 在
configure
处:- 这里 LFS 指定了
--build=$(../scripts/config.guess)
,注意我们的 Tuple 和猜的不同,所以需要替换成--build=$LFS_BLD
- 这里 LFS 指定了
5.8. Libstdc++ from GCC-8.2.0
- 添加
--build=$LFS_BLD
5.9. Binutils-2.31.1 - Pass 2
- 在
configure
后:- 添加
--build=$LFS_TGT
- 注意这里要开始使用 Pass 1 GCC 了,是
TGT
- 并且我们的 Tuple 和猜的不同,所以这一项是必要的
- 注意这里要开始使用 Pass 1 GCC 了,是
- 添加
5.10. GCC-8.2.0 - Pass 2
- 在
configure
后:- 添加
--build=$LFS_TGT
- 同上,这里要开始使用 Pass 1 GCC 了,是
TGT
- 并且我们的 Tuple 和猜的不同,所以这一项是必要的
- 同上,这里要开始使用 Pass 1 GCC 了,是
- 添加
- 其余步骤参见 Pass 1
5.29. Perl-5.28.0
- Perl 的非标准
Configure
在这个阶段会两次莫名其妙地进入 Bash 的交互命令行,我不太清楚是怎么回事。
The Rest
- 为了好看,记得
--build=$LFS_TGT
(特别是像 Bash 这种记录 Tuple 的) - 注意 LFS 对很多包做了 FHS 兼容性调整,对 AOSC OS 来说大部分都不必要,因为 AOSC OS 是默认做了
/usr
merge5 的,所以一些诸如/usr/bin/xxx -> /bin
的移动就没有意义。- 这其中还包括在
configure
阶段就做出的调整,注意弄清楚各个选项的含义。比如systemd
中的--with-xxx-path=yyy
选项不是要指定安装目录,而是指定二进制文件所在位置,meson
会将这些信息写入到 Systemd Units 配置中。一开始我就想当然去除了这些选项,启动之后 systemd 就有一堆服务因为找不到二进制文件(找了/tools/bin/xxx
,而最终系统中并没有)而发生错误。
- 这其中还包括在
6.6. Creating Essential Files and Symlinks
- 在 6.7. Linux-4.18.5 API Headers
make mrproper
的时候还需要/bin/awk -> /bin/gawk -> /tools/bin/gawk
这个链接,加上
6.9. Glibc-2.28
- 对 Determine the GCC include directory 一操作,由于 LFS 中指定了是 x86 架构的操作,这里需要手动
export
- 我们不 LSB,两个 Symlink 可以不用做
- 否则还是需要做的,目标库文件名是
ld.so.1
- 否则还是需要做的,目标库文件名是
6.17. GMP-6.1.2
- 由于在 MIPS 上 GMP 支持三种 ABI,在
configure
前手动指定ABI=64
(或者export ABI=64
) - GMP 带的
configure
对 Tuple 的识别不是很标准,把我们mipsisa64r2el
的 CPU 判断成了 32 位的。这里要给configure:4664
做个改动:mips64*-*-* -> mips*64*-*-*
- 如果 Tuple 不是那么奇葩,这里是不需要动的
6.21. GCC-8.2.0
- 这里同样要记得参照 “5.5. GCC-8.2.0 - Pass 1” 和 “5.10. GCC-8.2.0 - Pass 2” 在
configure
阶段对 GCC 做调校。
6.49. Libffi-3.2.1
- 在 Prepare libffi for compilation 处,注意给出的
configure
参数中有一个--with-gcc-arch=native
,这样会给 GCC 加上-march=native
,针对编译机器优化,代码在旧处理器上就跑不起来了。注意更换这一参数到目标平台的march
。
6.63. GRUB-2.02
- GRUB 的
configure
对mips{,64}el-*
都给出龙芯平台(platform=loongson
)的猜测,抛出了configure: error: qemu, coreboot and loongson ports need build-time grub-mkfont (need freetype2 library)
的错误,但是这个时候因为 LFS 没有给出编译 freetype2 的步骤,加上已经chroot
了,并没有grub-mkfont
可以用。- 因此 GRUB 的
configure
对mipsisa64r2el-*
直接判定未知处理器类型,不编译平台特定代码 - 绕过这一问题有两种办法:
- 给
configure
传--with-platform=none
,让 GRUB 不编译平台特定的代码(同上,功能缺失) - 在 Host 上复制一份,我没试过
- 给
- 因此 GRUB 的
Notes
另,我不知道 mipsisa64r2el
这个 Host CPU 有没有给我带来麻烦……20191222 注:肯定是会有的,黄脑袋应该没错。
-
[Forwarded from imi415] aosc os,关爱您、您的开发板、您的谜之处理器和您的史前遗产 ↩
-
好吧,我知道这其实是个 Multiarch Tuple,但是为了明确区分这两个移植,我觉得我可能不得不这么做,毕竟 MIPS-III 是 MIPS64 的子集…… ↩
-
对龙芯二号,有
-mfix-loongson2f-nop -mfix-loongson2f-jump
两个 GCC 选项来绕过龙芯 2F 前期批次的 Bug,但是它们没有对应的configure
选项,所以在后期构建系统介入之后注入选项实现修复。 ↩ -
对龙芯三号的
LL
/SC
Bug,最好是通过 Binutils 补丁的方式让gas
修复问题,而不是在 GCC 这里--without-llsc
,这样性能下降会比较厉害,不推荐。20191222 注:gas
现在已经并入--mfix-loongson3-llsc
选项,可以直接用起。 ↩ -
https://github.com/AOSC-Dev/aosc-os/wiki/FYI_FS_Hierarchy ↩