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,如需转载请自行联系原作者


相关文章
|
24天前
|
Rust 算法 安全
【Rust中的所有权系统深入解析】A Deep Dive into Rust‘s Ownership System
【Rust中的所有权系统深入解析】A Deep Dive into Rust‘s Ownership System
26 0
|
1月前
|
Rust 监控 数据安全/隐私保护
Rust语言在员工屏幕监控系统中的应用指南
员工屏幕监控系统在现代企业管理中扮演着重要角色。它们能够帮助企业监控员工的活动,确保他们的工作效率和数据安全。在这篇文章中,我们将探讨如何使用Rust语言构建一个简单而高效的员工屏幕监控系统,并提供一些代码示例以帮助你入门。
91 0
|
1月前
|
Rust 安全 程序员
拜登:“一切非 Rust 项目均为非法”,开发界要大变天?
白宫国家网络总监办公室(ONCD,以下简称网总办)在本周一发布的报告中说道:“程序员编写代码并非没有后果,他们的⼯作⽅式于国家利益而言至关重要。”
32 1
|
2月前
|
Rust Java C++
Rust生态系统与社区支持:跨语言比较的探究
【2月更文挑战第1天】本文旨在比较Rust语言与其他主流编程语言(如Python、Java、C++)在生态系统与社区支持方面的差异与优势。我们将从标准库、第三方库、工具链、社区活跃度和文档质量等多个维度进行深入分析,以揭示Rust在这些方面所展现出的独特之处和潜力。
|
2月前
|
Rust 安全 开发者
Rust中的元编程概念与应用
本文将深入探讨Rust编程语言中的元编程概念,包括宏、特性、元组和元函数等,并展示它们在Rust中的实际应用。元编程允许开发者在编译时操纵代码,实现代码生成、条件编译、类型检查等高级功能。通过本文的讲解,读者将能够更好地理解元编程在Rust中的作用,并学会如何在项目中应用元编程技术。
|
2月前
|
Rust 监控 算法
Rust中的系统性能监控与调优:提升应用效能的关键实践
随着Rust在系统级编程中的广泛应用,性能监控与调优变得尤为关键。本文介绍了在Rust中实施系统性能监控的方法,探讨了Rust应用的性能瓶颈,并提供了调优策略与最佳实践,旨在帮助开发者更有效地提升Rust应用的性能。
|
2月前
|
Rust 安全 物联网
Rust在嵌入式系统中的应用:开辟安全高效的新天地
随着物联网(IoT)和嵌入式系统的快速发展,Rust编程语言正逐渐在这些领域中崭露头角。本文旨在探讨Rust为何适合嵌入式系统开发,并深入分析其在安全性、性能和内存管理方面的优势。通过几个实际应用案例,展示Rust如何助力嵌入式系统迈向更安全、更高效的未来。
|
2月前
|
Rust 安全 Java
Rust 语言的类型系统
假如让你设计编程语言的类型,你会怎么做? 要定义哪些类型? 类型之间如何交互? 是否需要类型推断? 类型系统是编程语言中用于定义和控制类型的一组规则。
Rust 语言的类型系统
|
2月前
|
Rust 安全 开发者
Rust在操作系统组件开发中的应用:设备驱动与系统服务
本文探讨了Rust在系统级开发中的潜力,特别是针对操作系统组件如设备驱动和系统服务的开发。我们将分析Rust为何适合这些任务,展示其在实际项目中的应用,并讨论其面临的挑战和未来的可能性。
|
2月前
|
Rust 安全 物联网
Rust在系统级编程中的独特优势
本文深入探讨了Rust在系统级编程中的独特优势,包括其内存安全、高性能、并发编程能力以及与其他语言的互操作性。通过实际案例,展示了Rust如何在操作系统、嵌入式系统、网络编程等领域发挥重要作用,并预测了Rust在未来系统级编程中的发展趋势。