GNU 工具链的安装

参考文章:https://blog.csdn.net/qq_33880925/article/details/122741140?spm=1001.2014.3001.5506

工具链地址:

百度网盘: https://pan.baidu.com/s/1W5VnCT7z0YuR7hvjc3Jg0g

提取码: 1nw3


建立共享文件夹

1.点击设置

2.点击选项中的共享文件夹,添加共享文件夹

3.在宿主机中创建一个空文件夹用来和虚拟机共享,在文件夹路径中输入宿主机的

文件路径。


安装 GNU 工具链

1.先把压缩包移动到宿主机与虚拟机的共享文件中

2.挂载共享文件夹:

​ 在 VMware 中,虚拟机启动后,虚拟机操作系统会自动创建一个挂载点,通常挂载到 /mnt/hgfs/ 目录。
​ 如果 VMware Tools 已安装并且共享文件夹已启用,系统应该自动将共享文件夹挂载到 /mnt/hgfs/ 目录。你可以通过以下命令检查:

1
ls /mnt/hgfs/

gcc 是共享文件夹,切换到 gcc 目录,查看文件

1
2
cd /mnt/hgfs/gcc
ls

3.将代码解压到/opt目录下

/mnt/hgfs/gcc目录下,终端中输入以下代码,解压文件

1
sudo tar –zxvf gcc-4.3-ls232.tar.gz –C /

检查/opt/gcc-4.3-ls232/bin是否存在

1
2
cd /opt/gcc-4.3-ls232/
ls

4.更改默认路径

打开home目录,点击展示隐藏文件

打开.bashrc文件,在最后一行添加以下代码

1
export PATH="$PATH:/opt/gcc-4.3-ls232/bin"

5. 64位的系统需要添加32位的拓展库

在终端输入如下代码

1
sudo apt install lsb-core lib32z1 lib32ncurses-dev

6.检查是否安装成功

在终端输入以下代码

1
mipsel-linux-gcc -v

如果出现 gcc 的版本号说明安装成功。


编译汇编指令

我们先编写一组汇编指令,命名为 inst_rom.S,写入以下内容

1
2
3
4
5
6
7
8
9
        .org 0x0                # Instruct program starts from 0x0
.global _start # Define a global symbol _start
.set noat # Register $1 can be freely used
_start:
ori $1,$0,0x1100 # $1 = $0 | 0x1100 = 0x1100
ori $2,$0,0x0020 # $2 = $0 | 0x0020 = 0x0020
ori $3,$0,0xff00 # $3 = $0 | 0xff00 = 0xff00
ori $4,$0,0xffff # $4 = $0 | 0xffff = 0xffff

然后我们在终端中输入指令:

1
mipsel-linux-as -mips32 inst_rom.S -o inst_rom.o

表示用as工具将inst_rom.S文件编译成inst_rom.o文件。

然后创建一个 ram.ld文件,写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
MEMORY
{
ram : ORIGIN = 0X00000000, LENGTH = 0X00001000
}

SECTIONS
{
.text :
{
*(.text)
} > ram

.data :
{
*(.data)
} > ram

.bss :
{
*(.bss)
} > ram

.reginfo :
{
*(.reginfo)
} > ram
}

ENTRY (_start)

再输入:

1
mipsel-linux-ld -T ram.ld inst_rom.o -o inst_rom.om

表示将inst_rom.o文件链接成inst_rom.om文件。

再输入:

1
mipsel-linux-objcopy -O binary inst_rom.om inst_rom.bin

根据.om文件得到了bin文件,

再输入:

1
mipsel-linux-objdump -D inst_rom.om > inst_rom.asm

,对汇编指令进行反汇编,得到与机器指令对应的二进制字。

最后将Bin2MEM.exe拷贝到与inst_rom系列文件相同的目录下,执行

1
./Bin2Mem.exe -f inst_rom.bin -o inst_rom.data

第一次执行应该需要修改Bin2Mem.exe文件的权限,输入:

1
Chmod 777 Bin2Mem.exe

,最终转化为与Vivado程序中读入的文件类型(.data),执行结果如图

我们打开inst_rom.data文件查看:

这便是我们一开始那几条汇编指令的机器指令。


Make工具

每次都输入四个(加上.asm一共五个)指令显得很麻烦,我们可以编写一个脚本来自动执行命令。
make便是Linux上的一个脚本,当我们只输入make命令的工作流程是:

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件;
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“inst_rom.data”这个文件,并把这个文件作为最终的目标文件;
  3. 如果inst_rom.data文件不存在,或是.data所依赖的后面的 .om 文件的文件修改时间要比.data这个文件新,那么make会执行下面定义的命令来生成.data文件;
  4. 如果.data所依赖的.om文件也存在,那么make会在当前文件中找目标为.om文件的依赖性,如果找到再根据命令生成.om文件(这是一个递归的过程);
  5. 如果在找寻的过程中,出现了被依赖的文件找不到的错误,那么make就会直接退出,并报错。
  6. 如果在一条依赖链中,比如:A依赖B,B依赖C,C依赖D。那么当D更新后,make发现D比C新则会重新构建C,以此类推,最终A也会被更新。
  7. 简单的说,makefile带来的好处就是——自动化编译,只要一个make命令,所有工程和文件自动编译,类似于Shell的.sh和cmd的.bat

我们编写如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ifndef CROSS_COMPILE
CROSS_COMPILE = mipsel-linux-
endif
CC = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump

OBJECTS = inst_rom.o

export CROSS_COMPILE

# ********************
# Rules of Compilation
# ********************

all: inst_rom.om inst_rom.bin inst_rom.asm inst_rom.data

%.o: %.S
$(CC) -mips32 $< -o $@
inst_rom.om: ram.ld $(OBJECTS)
$(LD) -T ram.ld $(OBJECTS) -o $@
inst_rom.bin: inst_rom.om
$(OBJCOPY) -O binary $< $@
inst_rom.asm: inst_rom.om
$(OBJDUMP) -D $< > $@
inst_rom.data: inst_rom.bin
./Bin2Mem.exe -f $< -o $@
clean:
rm -f *.o *.om *.bin *.data *.mif *.asm

其中 $< 表示第一个依赖文件的名称,$@ 表示目标的完整名称

执行以下命令

1
make all

至此,我们用gcc编译汇编指令生成机器码的过程就做完了。
————————————————