需求是在gem5里跑SPEC程序。作为一个指令级模拟器,允许在不单独运行操作系统的情况下运行指定架构的程序本身就已经是一个巨大的工程了,而它所付出的代价则是运行效率低下和不支持动态链接(作者似乎说了在x86模式下支持加载动态库,但我没测试)。

于是对应的解决方案是,静态链接。

然而,在如今这个内外存充足、处理器足够快的时代,静态链接的用途可以说是已经被大幅削减了,如果要依赖外部程序的话,没有什么是附加一个动态库解决不了的。一定要说离不开静态链接的,可能也就只有在仍处于系统底层的内核了。对于只能识别汇编指令的处理器来说,它不知道该去哪里找对应的依赖实现,因而程序必须一字一句指导处理器执行。

好在仍然有部分C语言程序离不开静态编译,因而现有的操作系统还是提供了gcc的静态包。而fortran就不一样了,天生作为计算工具的语言往往在操作系统中执行,没必要搞静态链接,但凡一个库函数被调用了两次都是一种空间的浪费——或许是基于这种思想,几乎所有的Linux发行版都从安装源里删去了gfortran的静态依赖库,仿佛多的这几百KB的空间对服务器也是种累赘。

然而还是有人关注这个问题:在CentOS论坛中,有人解决方案。作为开源操作系统,保留源码可以说是一个非常好的文明了,而红帽系的系统甚至还提供了rpmbuild工具用来实现快捷的,从源码包到二进制包的编译功能,大致分为两步:

首先找到源码rpm包(这里推荐pkgs.org和rpmfind.net,格式工整,资料齐全)并解压:

rpm -i gcc-8.3.1-5.1.el8.src.rpm

然后用rpmbuild按照配置文件编译即可:

rpmbuild -bb ./rpmbuild/SPECS/gcc.spec

然后编译过程中可能会提示缺包缺文件,通过yum/dnf安装即可,缺失的文件也都是可以通过包管理器补上的

以经典的/lib/libc.so.6/usr/lib/libc.so为例,这两个文件是x86架构下的glibc库文件,在amd64系统上是默认不装的,但是因为rpmbuild需要,可以通过分别glibc.i686glibc-devel.i686补上。

补完缺失的依赖之后就可以快乐泡茶等编译啦~

标签: none

添加新评论