在学习了一段时间x86指令集后打算穿插着点MIPS指令集同步学习,从现在开始入门IOT

学习文章:《IoT从入门到入土》(1)–MIPS交叉编译环境搭建及其32位指令集

1.MIPS交叉编译环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

# qemu安装
sudo apt install qemu
sudo apt install qemu-system qemu-user-static binfmt-support

# 顺带也将ARM依赖库安装一下
sudo apt install libncurses5-dev gcc-arm-linux-gnueabi build-essential synaptic gcc-aarch64-linux-gnu

# mips依赖库
sudo apt-get install gcc-mips-linux-gnu
sudo apt-get install gcc-mipsel-linux-gnu
sudo apt-get install gcc-mips64-linux-gnuabi64
sudo apt-get install gcc-mips64el-linux-gnuabi64

2.MIPS交叉编译环境测试

先来段测试代码

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <unistd.h>

int main(){
char buffer[0x10];
printf("hello world\n");
read(0,buffer,0x10);
printf("%s",buffer);
return 0;
}

和x86相同,MIPS也分为大端序和小端序,有32位和64位的区别,接下来记录编译不同类型的可执行文件所需要的命令:

32位小端序

1
mipsel-linux-gnu-gcc -g test.c -o test_mipsel_32

32位大端序

1
mips-linux-gnu-gcc -g test.c -o test_mipsel_32

64位小端序

1
mips64el-linux-gnuabi64-gcc -g test.c -o test_mipsel_64

64位大端序

1
mips64el-linux-gnuabi64-gcc -g test.c -o test_mipsel_64

编译出的文件保护均为开启Canary、半开RELRO,其他保护均为关闭状态。

测试qemu运行环境

选择其中的test_mipsel_32使用qemu模拟运用,该可执行文件是动态链接,所以需要在运行时额外指定对应的动态链接库

ubuntu的动态链接库在/usr/目录下

1
qemu-mipsel-static -L /usr/mipsel-linux-gnu/ ./test_mipsel_32

1

测试成功