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

简介:

笔者:Liigo(庄小莉)

迄今:2014年9一个月17日本 (9一个月29日更新,11一个月19日本再次更新。在最后可用更新)

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

。转载请注明出处:http://blog.csdn.net/liigo


目标

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


编译rustc

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

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

注意编译过程中会调用 MIPS(el) + OpenWrt 平台的开发包SDK。详细来说就是 mipsel-unknown-linux-gnu-gcc 和 mipsel-unknown-linux-gnu-ar。

可是SDK内的工具命名格式是 mipsel-openwrt-linux-uclibc-gcc/ar,跟Rust编译脚本所要求的不同。一个简单的做法是,创建符号链接文件:

cd <openwrt>/staging_dir/toolchain-mipsel_r2_gcc-4.7-linaro_uClibc-0.9.33.2/bin
ln -s mipsel-openwrt-linux-uclibc-gcc mipsel-unknown-linux-gnu-gcc
ln -s mipsel-openwrt-linux-uclibc-ar  mipsel-unknown-linux-gnu-ar


使用Rust标准库std

编写源文件 histd.rs:

fn main() {
	println!("Hi Rust! (uses std crate)");
}
编译 histd:

rustc --target=mipsel-unknown-linux-gnu -C linker=mipsel-unknown-linux-gnu-gcc -C target-cpu=mips32r2 histd.rs

将生成目标平台下的可运行文件histd。文件尺寸是 1,389,884 字节,约 1.32 MB (11月19日Liigo用最新Rust编译后更新) 932013 字节。约 930 KB,相当的大!对于路由器设备而言,差点儿是难以接受。

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


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

编写源文件 hicore.rs:

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

extern crate libc;
extern crate core;

use libc::puts;
use core::str::StrPrelude; // &str::as_prt()

#[start]
fn start(_argc: int, _argv: *const *const u8) -> int {
    unsafe {
        puts("Hi Rust! (uses core crate)\0".as_ptr() as *const i8);
    }
    return 0;
}

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

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

编译 hicore.rs:

rustc --target=mipsel-unknown-linux-gnu -C linker=mipsel-unknown-linux-gnu-gcc -C target-cpu=mips32r2 hicore.rs

将生成目标平台下的可运行文件hicore,文件尺寸仅仅有 7419 字节。约 7KB,相当的小!

这是静态编译生成的可执行文件,没有额外的执行时库依赖。

严格地说仅依赖目标系统内的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() {}

#[lang="sized"] trait Sized {}

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

编译 hi.rs:

rustc --target=mipsel-unknown-linux-gnu -C linker=mipsel-unknown-linux-gnu-gcc -C target-cpu=mips32r2 hi.rs
将生成目标平台下的可运行文件hi,文件尺寸仅仅有 6552 字节。约 6KB。相当的小!比使用核心库core的hicore还要小,但相差不大。

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


可运行文件尺寸对照

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

-rwxr-xr-x 1 liigo liigo 932013  11月 19 20:20 histd
-rwxr-xr-x 1 liigo liigo   7419  11月 19 20:19 hicore
-rwxr-xr-x 1 liigo liigo   6552  11月 19 20:19 hi
使用标准库std编译出来的程序histd太大,不适合嵌入式设备,首先被淘汰;使用核心库core编译出来的程序hicore非常小。跟不使用不论什么库的hi不相上下。既然用不用核心库core,在文件尺寸上没有多大变化,而核心库core还能带来非常多编码上的便利,故推荐在嵌入式平台内使用核心库core。

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

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

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

11月19日Liigo注:跟两个月前最初发表本文时相比,mipsel 平台和 windows 平台的 histd 尺寸分别缩小了 450KB 和 320KB,体现了标准库的优化结果(比如 RFC #230);但 hicore 和 hi 的尺寸变化非常小。


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

信息来源:https://github.com/rust-lang/rust/tree/master/mk/cfg

arm-apple-ios
arm-linux-androideabi
arm-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
i386-apple-ios
i686-apple-darwin
i686-pc-windows-gnu
i686-unknown-linux-gnu
mipsel-unknown-linux-gnu
mips-unknown-linux-gnu
x86_64-apple-darwin
x86_64-pc-windows-gnu
x86_64-unknown-dragonfly
x86_64-unknown-freebsd
x86_64-unknown-linux-gnu

用法:

编译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。


Liigo 20140929 更新内容

1、修正 lang_item `sized` 和 `fail_fmt`。与当前最新 rustc 编译器修改同步;

2、添加编译參数 `-C target-cpu=mips32r2`,针对測试所用CPU。消除编译警告信息。

3、注明測试採用的硬件路由器CPU型号`MT7620A CPU`。


Liigo 20141119 更新内容

1、修正目标平台为 mipsel-unknown-linux-gnu (原 mipsel-linux 已废弃)。

2、更新Rust支持的主流交叉编译平台列表(triples);

3、更新文中Rust演示样例代码(与 https://github.com/liigo/hirust 同步);

4、採用今日最新Rust交叉编译器的源代码,再和更新文本数据。


版权声明:这篇文章的博客Liigo原版的,不得擅自转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4891405.html,如需转载请自行联系原作者


相关文章
|
Rust 安全 区块链
探索Rust语言:系统编程的新选择
【10月更文挑战第27天】Rust语言以其安全性、性能和并发性在系统编程领域受到广泛关注。本文介绍了Rust的核心特性,如内存安全、高性能和强大的并发模型,以及开发技巧和实用工具,展示了Rust如何改变系统编程的面貌,并展望了其在WebAssembly、区块链和嵌入式系统等领域的未来应用。
|
Rust 安全 开发工具
探索 Rust:系统编程语言的新纪元
【10月更文挑战第17天】介绍了 Rust 语言的核心特性,如内存安全、强大的并发编程模型和接近 C/C++ 的性能。文章还涵盖了 Rust 的开发工具,如 Cargo 和 Rustup,以及其在业界的应用,包括微软 Azure 和 Firefox 浏览器。Rust 正在成为系统编程领域的新星,为开发者带来高性能和安全性。
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
652 7
|
Rust 安全 Java
探索Rust在系统级编程中的应用
【10月更文挑战第9天】Rust语言以其现代化设计、安全性和高性能,在系统级编程领域逐渐崭露头角。本文探讨Rust在操作系统开发、设备驱动、嵌入式系统和网络编程中的应用,介绍其核心优势及实施步骤,帮助读者了解如何在项目中有效利用Rust。
|
Rust 安全 Java
探索Rust在系统编程中的崛起
Rust 是一种由 Mozilla 研究院开发的现代系统编程语言,以其在安全性、并发性和内存管理方面的优势,逐渐成为开发者的新宠。Rust 提供内存安全保证且性能媲美 C/C++,支持跨平台开发,并具备强大的并发编程工具。本文将介绍 Rust 的核心优势、工作原理及实施方法,探讨其在系统编程中的崛起及其面临的挑战。尽管 Rust 学习曲线较陡,但其广泛的应用场景和不断壮大的社区使其成为构建高性能、安全应用的理想选择。
|
Rust 网络协议 安全
Rust在系统编程中的案例分享
Rust在系统编程中的案例分享
423 10
|
Rust 安全 Java
探索 Rust:系统编程语言的新纪元
Rust 是一种由 Mozilla 研究院开发的开源系统编程语言,以其内存安全、高性能和现代并发工具著称,已连续多年被评为 Stack Overflow 最受喜爱的编程语言。Rust 通过所有权系统和借用检查等机制确保内存安全,并具备无垃圾回收、强大类型系统及高效并发编程特性。它广泛应用于系统级应用、WebAssembly、区块链技术和游戏开发等领域。Rust 提供丰富的学习资源和开发工具,包括官方文档、书籍、Cargo 包管理器和活跃社区支持,正逐渐成为系统编程领域的新力量。
|
Rust 安全
深入理解Rust语言的所有权系统
深入理解Rust语言的所有权系统
581 0
|
数据采集 Rust 安全
Rust在网络爬虫中的应用与实践:探索内存安全与并发处理的奥秘
【8月更文挑战第31天】网络爬虫是自动化程序,用于从互联网抓取数据。随着互联网的发展,构建高效、安全的爬虫成为热点。Rust语言凭借内存安全和高性能特点,在此领域展现出巨大潜力。本文探讨Rust如何通过所有权、借用及生命周期机制保障内存安全;利用`async/await`模型和`tokio`运行时处理并发请求;借助WebAssembly技术处理动态内容;并使用`reqwest`和`js-sys`库解析CSS和JavaScript,确保代码的安全性和可维护性。未来,Rust将在网络爬虫领域扮演更重要角色。
378 1
|
Rust 安全 JavaScript
探索Rust在系统编程领域的前景:虚拟机和编译器开发的新篇章
【8月更文挑战第31天】在系统编程领域,性能与安全性至关重要。Rust作为一种新兴语言,凭借其独特的内存安全和并发特性,正逐渐成为虚拟机和编译器开发的首选。本文通过案例分析,探讨Rust在这些领域的应用,例如Facebook的Compiler VM (CVM)项目和实验性的JavaScript JIT编译器Mithril。Rust的静态类型系统和所有权模型确保了高性能和安全性,而其强大的包管理和库生态则简化了虚拟机的开发。随着Rust社区的不断成熟,预计未来将有更多基于Rust的创新项目涌现,推动系统编程的发展。对于追求高性能和安全性的开发者而言,掌握Rust将成为一个重要战略方向。
524 1