手撸MIPS32——6、交叉编译环境的搭建、编程与我踩到的坑

参考博客:https://blog.csdn.net/stdio_h666/article/details/104330395

用VM建个虚拟机

https://blog.csdn.net/qq_41782425/article/details/85119258
建议选择kernel 是下图这几个的…不然就要降级或升级了:
在这里插入图片描述
在这里插入图片描述
同时内存建议3G以上,不然会在配置完buildroot config后make出现什么什么恶_all,[s_auto…]的问题

下载安装buildroot构建交叉编译环境

用uname -r 查询kernel版本
在这里插入图片描述
然后下载安装相关库:

sudo apt-get update
sudo apt-get install libncurses5-dev patch
sudo apt-get install texinfo
sudo apt-get install bison
sudo apt-get install flex

下载buildroot两种方式一种git,一种wget建议第二种,速度快很多…
第一种:

git clone https://github.com/buildroot/buildroot.git
cd buildroot

第二种:

wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2 


tar -jxvf buildroot-snapshot.tar.bz2

cd buildroot

配置menuconfig

make menuconfig

这个界面:
在这里插入图片描述
选target options,配置如下(小端模式)
在这里插入图片描述
返回选Toolchain,配置如下(kernel根据自己uname后的选):
在这里插入图片描述
点Save保存
在这里插入图片描述
然后make,等待很长一段时间。需要联网

make

添加环境变量:

vim /root/.bashrc

在最后一行添加:

export PATH="$PATH:之前到你buildroot的路径/buildroot/output/host/usr/bin"

然后安装完成:

mipsel-linux-gcc --help

如果如下图则安装成功。
在这里插入图片描述

具体交叉编译例程

例程arith_logic.S如下:

   .set noat   
   .set noreorder
   .globl main
   .text
main:
   ori	$at, $zero, 0x0064	#$at($1) = 0x64
   lui 	$v0, 0x6500         #$v0($2) = 0x65000000
   nop
   nop
   addiu $v1, $at, 0x4      #$v1($3) = 0x68
   sltiu $a0, $at, 0x0068	#$a0($4) = 0x1

   add 	$a1, $at, $v0       #$a1($5) = $at + $v0 = 0x65000064
   subu $a2, $v0, $at       #$a2($6) = $v0 - $at = 0x64FFFF9C
   slt 	$a3, $at, $v0       #$a3($7) = 0x1
   and 	$t0, $at, $v0       #$t0($8) = $at & $v0 = 0x0
   ori 	$t1, $at, 0x0065	#$t1($9) = $at | 0x65 = 0x65
   sll 	$t2, $at, 0x4       #$t2($10)= $at << 4 = 0x640

   mult $at, $v0            #hi = 0x27
				            #lo = 0x74000000
   nop
   nop
   mfhi $t3                 #$t3($11) = hi = 0x27
   mflo $t4                 #$t4($12) = lo = 0x74000000
   nop

编译:

mipsel-linux-as arith_logic.S -o arith_logic.o

链接:
首先编写个链接描述脚本default.ld:

OUTPUT_ARCH(mips)
ENTRY(main)
SECTIONS
{
    
    
        . = 0x00000000;
        .text : 
        {
    
    
            *(.text)
            _etext = .;
        }

        . = 0x00010000;
        .data : 
        {
    
    
            *(.data)              
        }

	.bss :
        {
    
    
            *(.bss)
        }

} 

然后链接:

mipsel-linux-ld -T default.ld arith_logic.o -o arith_logic.om

得到bin文件

mipsel-linux-objcopy -O binary arith_logic.om arith_logic.bin

这样就得到了一个二进制文件…其实基本就算完成了但是为了让vivado识别编程.coe文件需要以下操作

mipsel-linux-objcopy -O binary -j .data arith_logic.om arith_logic.data

这个convert是个可执行文件在:https://download.csdn.net/download/u010594449/12479219
下载

./convert arith_logic.bin arith_logic.data

生成如下两个coe文件就是对应文件。
在这里插入图片描述
MakeFile编写(就是编译,链接,转换的整体)
首先布局如下,build放输出,src源文件。用的时候make USER_PROGRAM=待编译的文件 就好。在这里插入图片描述

.PHONY: mem clean help

ifndef CROSS_COMPILE
CROSS_COMPILE := mips-sde-elf-
endif
ifndef TESTCASE_SRC_DIR
TESTCASE_SRC_DIR := src/
endif
ifndef TESTCASE_BUILD_DIR
TESTCASE_BUILD_DIR := build/
endif
DEBUG := false

CC :=  $(CROSS_COMPILE)gcc
AS := $(CROSS_COMPILE)as
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump

CFLAGS := -mips1 -EL

ifeq ($(DEBUG), true)
CFLAGS += -g
endif


OBJECTS := $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).o

export	CROSS_COMPILE
export	TESTCASE_SRC_DIR
export	TESTCASE_BUILD_DIR

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

all: $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).bin $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).data convert
	./convert $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).bin $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).data
	rm *.mif
	mv inst_rom.coe $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).coe
	rm *.coe

#%.S: %.c
#	$(CC) -S $< -o $@

$(TESTCASE_BUILD_DIR)$(USER_PROGRAM).o: $(TESTCASE_SRC_DIR)$(USER_PROGRAM).S
	$(AS) $(CFLAGS) $< -o $@

$(TESTCASE_BUILD_DIR)$(USER_PROGRAM): default.ld $(OBJECTS)
	$(LD) -T default.ld $(CFLAGS) $(OBJECTS) -o $@
	$(OBJDUMP) -alD $@ > $@.asm

$(TESTCASE_BUILD_DIR)$(USER_PROGRAM).bin: $(TESTCASE_BUILD_DIR)$(USER_PROGRAM)
	$(OBJCOPY) -O binary -j .text $<  $@

$(TESTCASE_BUILD_DIR)$(USER_PROGRAM).data: $(TESTCASE_BUILD_DIR)$(USER_PROGRAM)
	$(OBJCOPY) -O binary -j .data $<  $@

mem: $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).bin $(TESTCASE_BUILD_DIR)$(USER_PROGRAM)
	./bin2mem $(TESTCASE_BUILD_DIR)$(USER_PROGRAM) $(TESTCASE_BUILD_DIR)$(USER_PROGRAM).bin

help: 
	@echo "用法:make USER_PROGRAM=待编译的文件 <DEBUG=[true|false]>"
	@echo "< >为可选项"

clean:
	cd $(TESTCASE_BUILD_DIR) && rm -f *.o *.bin *.vh *elf

猜你喜欢

转载自blog.csdn.net/u010594449/article/details/106448034
今日推荐