MIPS平台OpenWrt路由器系统内的Rust应用程序开发

作者:Liigo(庄晓立)

日期:2014年9月17日

原创链接:http://blog.csdn.net/liigo/article/details/39347541

版权所有,转载请注明出处:http://blog.csdn.net/liigo

目标

使用 Rust 语言,交叉编译开发 MIPS(el) + OpenWrt 路由器平台下的应用软件。

编译rustc

首先自行编译Rust编译器源代码,生成支持 mipsel-linux 平台的交叉编译器rustc

./configure --target=mipsel-linux && make && make install

注意编译过程中会调用 MIPS(el) + OpenWrt 平台的开发包SDK,具体来说就是 mipsel-linux-gcc 和 mipsel-linux-ar。但是SDK内的工具命名格式是 mipsel-openwrt-linux-uclibc-gcc/ar,跟Rust编译脚本说要求的不同。一个简单的做法是,创建符号软连接文件:

cd /path/to/openwrt/sdk/toolchain
ln -s mipsel-openwrt-linux-uclibc-gcc mipsel-linux-gcc
ln -s mipsel-openwrt-linux-uclibc-ar mipsel-linux-ar

使用Rust标准库std

编写源文件 histd.rs:

fn main() {
	println!("Hi Rust! (uses std crate)");
}

编译 histd:

rustc --target=mipsel-linux -C linker=mipsel-linux-gcc histd.rs

将生成目标平台下的可执行文件histd,文件尺寸是 1,389,884 字节,约 1.32 MB,相当的大!对于路由器设备而言,几乎是难以接受。

这是静态编译生成的可执行文件,没有额外的运行时库依赖。严格地说仅依赖目标系统内的libc.so,当然如果不需要向控制台输出文本,连libc.so也不需要。

使用Rust核心库core(不使用标准库std)

编写源文件 hicore.rs:

#![no_std]
#![feature(lang_items)]
#![feature(intrinsics)]

extern crate libc;
extern crate core;

use libc::puts;
use core::intrinsics::transmute;

#[start]
fn start(_argc: int, _argv: *const *const u8) -> int {
	let s = "Hi Rust! (uses core crate)\0"; // &str
    unsafe {
    	let (s,_): (*const i8, uint) = transmute(s); // see core::raw::Slice
    	puts(s);
    }
	return 0;
}

#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}

#[lang = "begin_unwind"]
extern fn begin_unwind(_args: &core::fmt::Arguments,
                        _file: &str,
                        _line: uint) -> ! {
    loop {}
}

编译 hicore.rs:

rustc --target=mipsel-linux -C linker=mipsel-linux-gcc hicore.rs

将生成目标平台下的可执行文件hicore,文件尺寸只有 6556 字节,相当的小!

这是静态编译生成的可执行文件,没有额外的运行时库依赖。严格地说仅依赖目标系统内的libc.so,当然如果不需要向控制台输出文本,连libc.so也不需要。

不用标准库std,也不用核心库core,纯裸奔

编写源代码 hi.rs:

#![no_std]
#![feature(lang_items)]
#![feature(intrinsics)]

#[link(name = "c")]
extern {
	fn puts(s: *const u8);
}

#[start]
fn start(_argc: int, _argv: *const *const u8) -> int {
	let s = "Hi Rust!\0"; // &str
    unsafe {
    	let (s,_): (*const u8, uint) = transmute(s); // see core::raw::Slice
    	puts(s);
    }
	return 0;
}

#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}

extern "rust-intrinsic" {
    fn transmute<T, U>(x: T) -> U;
}

编译 hi.rs:

rustc --target=mipsel-linux -C linker=mipsel-linux-gcc hi.rs

将生成目标平台下的可执行文件hi,文件尺寸只有 6504 字节,相当的小!比使用核心库core的hicore还要小,但相差不大。

这是静态编译生成的可执行文件,没有额外的运行时库依赖。严格地说仅依赖目标系统内的libc.so,当然如果不需要向控制台输出文本,连libc.so也不需要。

可执行文件尺寸对比

使用Rust标准库std编译生成的histd,使用Rust核心库core编译生成的的hicore,和不用标准库也不用核心库编译生成的hi,这三者的可执行文件尺寸对比如下:

-rwxr-xr-x 1 liigo liigo 1389884  9月 17 20:20 histd
-rwxr-xr-x 1 liigo liigo    6556  9月 17 20:19 hicore
-rwxr-xr-x 1 liigo liigo    6504  9月 17 20:19 hi

使用标准库std编译出来的程序histd太大,不适合嵌入式设备,首先被淘汰;使用核心库core编译出来的程序hicore很小,跟不使用任何库的hi不相上下。既然用不用核心库core,在文件尺寸上没有多大变化,而核心库core还能带来很多编码上的便利,故推荐在嵌入式平台内使用核心库core。

以上是 mipsel-linux 平台的情况。下面作为对比,我们再看一下 x86_64-unknown-linux-gnu 平台:

-rwxr-xr-x 1 liigo liigo 1004136  9月 17 20:16 histd
-rwxr-xr-x 1 liigo liigo    8203  9月 17 20:16 hicore
-rwxr-xr-x 1 liigo liigo    8159  9月 17 20:16 hi

对比后发现,x86_64 平台下的可执行文件总体上比 mipsel 平台略大,但差距也不大,情况也类似。

Rust支持的主流交叉编译平台 (target triples)

信息来源:https://github.com/rust-lang/rust/blob/master/mk/platform.mk

x86_64-unknown-linux-gnu
i686-unknown-linux-gnu
arm-apple-ios
i386-apple-ios
x86_64-apple-darwin
i686-apple-darwin
arm-linux-androideabi
arm-unknown-linux-gnueabihf
arm-unknown-linux-gnueabi
mipsel-linux
mips-unknown-linux-gnu
i586-mingw32msvc
i686-w64-mingw32
x86_64-w64-mingw32
x86_64-unknown-freebsd
x86_64-pc-dragonfly-elf

使用方法:

编译Rust本身:./configure --target=triple1,triple2 && make && make install

编译Rust程序:rustc --target=triple -C linker=triple-gcc

必要时创建对应交叉编译平台SDK编译工具的符号软连接文件 triple-gcc/triple-ar 等。

本文涉及到多个源代码文件已上传到Github:https://github.com/liigo/hirust ,作者Liigo。

时间: 2024-10-07 05:30:01

MIPS平台OpenWrt路由器系统内的Rust应用程序开发的相关文章

wifidog 移植到MIPS平台

使用的是一款Broadcom的芯片,现在上面运行wifidog实现认证上网的功能.由于不是openwrt平台,所以就没了make menuconfig 勾选就能自动编译到版本中的.所以想使用交叉编译的方法将wifidog移植到该平台上. 下面写下步骤吧,不是很复杂,但是开始也破费周折.下载源码到http://dev.wifidog.org 下载就可以了. ./configure CC=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc

mips平台使用jdbc操作sqlite的最终解决方案

1.概述: 本项目需要在多平台上(mips必须支持)操作嵌入式数据库sqlite,而最新的sqlite-jdbc-3.15.1.jar的本地驱动只含有少量的平台,于是解决支持mips平台实在必行.方法有多,具体如下. 1.1 SQLite三种JDBC驱动的区别 摘自http://blog.sina.com.cn/s/blog_654337ca01016x4n.html 在DBeaver中看到SQLite有三种JDBC驱动,查了它们官方网站的相关解释,发现它们还是挺不一样的. SQLite Wra

Openwrt 路由器挂载摄像头教程

一.准备工作 首先就是要有一个刷了openwrt的路由器,固伯里至少包括下面两个摄像头相关模块 kmod-video-core, kmod-video-uvc 以及mjpeg-streamer软件,一个免驱并支持MJPEG输出的摄像头,本人使用HD5000,建议使用HD3000,差别不大 二.测试摄像头 将摄像头插到路由器上,然后SSH到路由器上,执行logread命令,会打印出路由器开机后的的终端log.在里面寻找 "usbcore:registered new interface drive

openwrt路由器更换了Flash之后需要修改的源码

假如我使用的是WR703N,改为8M内存: 1 修改openwrt/target/linux/ar71xx/image/Makefile文件 $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLMR3420V2,tl-mr3420-v2,TL-MR3420-v2,ttyS0,115200,0x34200002,1,4Mlzma)) #$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR703,tl-w

MIPS 平台 Android 移植过程记录1_编译环境搭建

在工作的空闲时间, 尝试着在公司的MIPS平台上移植了Android, 把之前记录的遇到的问题贴到blog上来, 做个记录. 1.设置上网代理   /etc/apt/apt.conf, 在文件中添加下面的内容, 注意最后的 ";" 也是需要添加的, 否则会提示这个文件的结束字符不对 Acquire::http:Proxy "user:[email protected]:port/"; 2. Installing the JDK apt-get install ope

0 openwrt路由器入门 远程命令行+文件系统

如图,拿到一个openwrt路由器我们第一步要远程控制. 这里在买了两块wifi-robots  wifi视频模块. 0首先说下这个WIIF的信息 淘宝购买链接 https://item.taobao.com/item.htm?spm=a312a.7700824.w5001-18055431271.3.18644705m9g8Qz&id=555120245987&scene=taobao_shop GL.iNet 刷的系统 OpenWrt Barrier Breaker r38451 /

下载基于JavaEE&&移动平台的企业级房地产ERP采购系统全程开发实录

201课全,下载地址:http://pan.baidu.com/s/1pLxVAHX课程非常牛,不多说.本课程基于众多技术如:Spring IOC,Spring MVC,MyBatis,BeifengFlow,FushionChart,Flexigrid,jackrabbit,课程总共分为4季,第一季是采购系统,第二季是客户关系销售系统,第三季是成本管理系统,第四季是Android版本的手机应该开发.每一季的知识点和业务都不一样,对学员的要求也有所不同.课程需求绝对来源于真实项目,并且主要的业务

小程序开发运营必看:微信小程序平台运营规范

一.原则及相关说明 ? 微信最核心的价值,就是连接——提供一对一.一对多和多对多的连接方式,从而实现人与人.人与智能终端.人与社交化娱乐.人与硬件设备的连接,同时连接服务.资讯.商业. ? 微信团队一直致力于将微信打造成一个强大的.全方位的服务工具.在此基础上,我们推出了微信小程序这个产品,提供给微信小程序的开发者在微信内搭建和实现特定服务.功能的平台.通过全面开放的能力,我们将更多连接的可能给予企业和服务提供者,并为微信小程序提供基础的接入能力.运营环境和规则体系,进而帮助更多的企业和服务提供

ubuntu下搭建rust到intellij开发环境

网上看了一些高手写的东西,表示功力太浅,不习惯大量的使用终端来写rust代码,既然学习一门新的语言,就要弄的简单点,将时间和重心放到学习中来. 先来说说安装rust环境,先去官网下载安装包,也可以按照命令行安装,太慢了,我表示中途安装失败了,所有使用安装包来安装. https://www.rust-lang.org/ 点击install就是下载包了,如果下载失败的话,我已经讲文件离线到百度网盘了,地址http://pan.baidu.com/s/1jGLAcE6 下载完成后,解压,打开目录,执行