MENU

【歪门邪道】龙芯ls232交叉编译器环境配置

May 15, 2020 • Read: 450 • 瞎折腾

前几天在WSL里面搭建MIPS交叉编译环境,结果今天一看比赛的详细要求:

第25条 EDA 及软件开发环境如下:

  1. 大赛指定龙芯体系结构教学实验平台作为MIPS 运行环境。
  2. 大赛指定龙芯MIPS-GCC 交叉编译器为C 编译器。
  3. 大赛指定XILINX 公司的Vivado2018.3 为FPGA 综合工具。
  4. 除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

尝试别的命令,诸如ldobjdump之类的,同样的结果。我猜测应当是哪个必要的支持库没有装上。如果是具体的依赖库,应当会提示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://www.skyblond.info/about.html 处获得。

生活不易,亿点广告

Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

3 Comments
  1. 不明觉厉

  2. 我就不细读了,反正也看不明白

  3. wys wys

    (@ο@) 哇~好高深。一直羡慕程序猿,为我们码盲带了许多精彩的页面。

0:00