前几天在WSL里面搭建MIPS交叉编译环境,结果今天一看比赛的详细要求:
第25条 EDA 及软件开发环境如下:
- 大赛指定龙芯体系结构教学实验平台作为MIPS 运行环境。
- 大赛指定龙芯MIPS-GCC 交叉编译器为C 编译器。
- 大赛指定XILINX 公司的Vivado2018.3 为FPGA 综合工具。
- 除C 编译器和FPGA 综合工具为大赛指定工具外,各参赛队可使用
其他各种开发工具。
额,行吧。我装他指定的编译器还不行吗。本文将简要记述如何尽可能多的使用最新软件包搭建一个可用的ls232交叉编译器。
操作之前...
这里强烈建议读者先通读一遍本文,对将要执行的操作在心里有个数儿,然后再操作就会比较流畅,避免手忙脚乱出现错误。前言
关于ls232编译器,本来我也想在WSL里面做的,但是由于我还没有收到Windows10的2004更新,因此WSL版本还是1,没法完全虚拟化,而通过readelf -h
查看龙芯提供的mipsel-linux-gcc
发现它的机器类型还是Intel 80386
,我寻思这多少年前就都人均x86_64
起步了, 这i386
我上哪给你变去?要运行也不是不行,但是要安装许多对应架构的支持库,原则上WSL2可以搞这波操作,但是我不想把我的文件系统搞乱,因此使用了VMware workstation 15,没有用Hyper-V的原因在于前者可以很方便的在主机之间实时共享文件夹。
这里我是用VMware Workstation 15.5.2,Linux使用Ubuntu Desktop 20.04 LTS版本,安装时使用简易安装。
遵循大赛文档的说明
龙芯官方提供的编译器可以在这里找到,目前ls232核交叉编译器的版本是gcc-4.3.0
32位,依我说可能后续不太可能更新了,因此这里给出的下载链接是本文撰写时最新的链接,也是大赛指定的版本。对于其他版本,各位可以按需替换成对应的下载地址即可。
下载交叉编译工具链:
wget http://ftp.loongnix.org/toolchain/gcc/release/gcc-4.3-ls232.tar.gz
解压:
sudo tar -zxvf gcc-4.3-ls232.tar.gz -C /
这时候要你输入root密码,这个命令解压刚刚下载的文件,最终文件会放在/opt/gcc-4.3-ls232/
这个目录下。
随后将其添加到Path环境变量中,如果是新安装的系统可以通过下面这条命令设置,否则需要手动将/opt/gcc-4.3-ls232/bin
这个目录添加到Path中:
echo "export PATH=/opt/gcc-4.3-ls232/bin:$PATH" >> ~/.bashrc
按照大赛官方文档的说明,还需要安装一个lsb-core
,我不知道安装这一步的作用是什么,这一步有没有用我也无法考证。如果担心安装的东西比较多,脏了文件系统,这一步可以暂时跳过,到文章结尾发现还是不行,回过头来再补装也不迟:
sudo apt install lsb-core
这个软件包安装的东西还挺多的,因为在虚拟机,用完就删了,所以我就大胆安装了,各位可以酌情。
按照大赛文档的说法,这时候应该已经能用了,至少可以打印出版本号:mipsel-linux-gcc -v
,但是我的命令行眉头一皱,发现事情并不简单。
安装额外的支持库
此时我的命令行提示我:
/opt/gcc-4.3-ls232/bin/mipsel-linux-gcc: No such file or directory
尝试别的命令,诸如ld
、objdump
之类的,同样的结果。我猜测应当是哪个必要的支持库没有装上。如果是具体的依赖库,应当会提示xxx.so
不存在,但是这个啥也没说,就说找不到文件或目录,我觉得应当是一些基础库出了问题。
这里我使用readelf -h /opt/gcc-4.3-ls232/bin/mipsel-linux-gcc
发现它的目标机器是Intel 80386
,即i386
架构,我用uname -m
查看发现我的架构是x86_64
。问题就在这里了,前面安装的各种库应当都是x86_64
架构的,而运行这个编译器需要i386
的库,因此这里还要安装额外的支持库。(以下内容参考自How to run 32-bit app in Ubuntu 64-bit?)
首先为Ubuntu添加多架构选项:
sudo dpkg --add-architecture i386
然后更新并安装软件包:
sudo apt update
sudo apt install libc6:i386 libncurses5:i386 libstdc++6:i386
可以看出这些软件包后面都通过:i386
指定了架构,所以我想之所以安装完官方说的lsb-core
没有作用,是不是也应该在安装的时候用lsb-core:i386
这个包呢?这个无从得知,我也没有再实验,如果有读者有尝试的话不放在评论区留个脚印儿。
这个时候再运行mipsel-linux-gcc -v
,就可以看到久违的版本信息了,但是这回我眉头一皱,发现事情并不简单。
安装编译时依赖库
我一想这事情指定是不能这么简单,遂找来大赛的样板程序试图编译,切换到目录一个make敲下去,果然挂了:
/opt/gcc-4.3-ls232/lib/gcc/mipsel-linux/4.3.0/../../../../mipsel-linux/bin/as: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
好在这回是明确说缺少了一个叫libz
的库,网上一查他对应的软件包是zlib1g
,这里也要安装对应架构的,因此安装他:
sudo apt install zlib1g:i386
然后再重新运行make,至此就没问题了。但是每次编译要把东西跨主机复制,很是麻烦。因此可以在VMware中配置共享文件夹。
VMware配置共享文件夹
首先关闭虚拟机,打开虚拟机设置,在「选项」选项卡中找到共享文件夹一项:将共享文件夹设置为总是启用,然后添加你要共享的文件夹,保存。再打开虚拟机就是了。
虚拟机中要安装open-vm-tools
,默认情况下共享文件夹会挂载到/mnt/hgfs
目录,首次使用需要创建:
sudo mkdir -p /mnt/hgfs
然后挂载目录:
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
这样只能挂在一次,需要重启后自动挂载的,可以修改etc/fstab
文件,在末尾追加
.host:/ /mnt/hgfs fuse.vmhgfs-fuse auto,allow_other 0 0
保存即是。在/mnt/hgfs
目录下就能看到你共享的文件夹了。
其他Linux发行版本
关于其他Linux发行版本,包名应该都差不多,但是在指定架构那里不一样。Debian/Ubuntu系列的发行版本使用apt管理软件包,这时候使用包名:架构名
,例如zlib1g:i386
。
如果是RedHat/CentOS/Fedora这些包管理是yum的,以及包管理器是zypper
的,需要使用包名.架构名
,例如zlib1g.i386
。
其他发行版本,诸如使用pacman
的,还请各位读者自己去网上搜索吧,我反正是没找到2333
-全文完-
【歪门邪道】龙芯ls232交叉编译器环境配置 由 天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。
十分有用,刚好遇到类似架构的问题
不明觉厉
我就不细读了,反正也看不明白
(*@ο@*) 哇~好高深。一直羡慕程序猿,为我们码盲带了许多精彩的页面。