手撸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

驱动器 D 中的卷是 LINUX 卷的序列号是 4471-561B D:\桌面\mips交叉编译环境 的目录 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linux的MIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能正确编译MIPS交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc库可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH
驱动器 D 中的卷是 LINUX 卷的序列号是 4471-561B D:\桌面\mips交叉编译环境 的目录 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linux的MIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能正确编译MIPS交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc库可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值