Shawl: 将一切应用程序运行为Windows服务
Shawl是一个用Rust编写的能够将任何程序作为Windows服务运行的包装程序。它可以处理Windows服务的API,因此您原本的程序只需要响应ctrl-C
或者SIGINT
。创建需要作为服务来运行的项目,只需将Shawl与您的项目捆绑在一起,将其设置为入口点,然后通过CLI传递指令来运行。
Rust中的插件
Rust语言为我们提供了许多非常强大的工具,为应用程序提升了灵活性和可扩展性(例如特征、枚举、宏等),但是所有这些都是在编译时完成的。但是为了获得我们所希望的灵活性,我们希望能够在运行时添加新功能。
这可以使用一个称为动态加载的技术来实现。
何为动态加载?
动态加载是所有主流操作系统提供的一种可以在运行时加载库的机制,以便用户检索函数或变量的地址。然后可以像使用其他任何指针一样使用这些函数和变量的地址。
在* nix平台上,dlopen()
函数用于将库加载到内存中,然后dlsym()
能够让您通过其符号名称获取指向某变量的指针。需要记住的一点是,符号不包含任何类型信息,因此调用者必须将指针转换为正确的类型。
通常,通过与某种类型的协定提前完成加载库来完成.例如,头文件需要声明"cos
"函数为 fn(f64) -> f64
.
来自man dlopen
的示例:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
// Defines LIBM_SO (which will be a string such as "libm.so.6")
#include <gnu/lib-names.h>
// the type signature used by our cosine function
typedef double (*trig_func)(double);
int main() {
char *error;
// load the libm library into memory
void *handle = dlopen(LIBM_SO, RTLD_LAZY);
// handle loading failures
if (!handle) {
fprintf(stderr, "unable to load libm: %s\n", dlerror());
return EXIT_FAILURE;
}
// Clear any existing errors
dlerror();
// get a pointer to the "cos" symbol and cast it to the right type
trig_func cosine = (trig_func) dlsym(handle, "cos");
// were we able to find the symbol?
error = dlerror();
if (error != NULL) {
fprintf(stderr, "cos not found: %s\n", error);
return EXIT_FAILURE;
}
// use our cosine function
printf("cos(2.0) = %f\n", (*cosine)(2.0));
// cleanup and exit
dlclose(handle);
return EXIT_SUCCESS;
}
其中LoadLibraryA\(\)
, GetProcAddress\(\)
以及FreeLibrary\(\)
分别代替了dlopen()
,dlsym()
和dlclose()
。
libloading提供了一个高品质的Rust接口以及底层平台的动态加载机制。
阅读博客原文了解更多。
使用Rust制作RISC-V操作系统
详细教程请参阅http://web.eecs.utk.edu/~smarz1/osblog/
Cargo安全问题
最近,Rust团队收到了有关使用旧版Cargo构建crates的安全问题的反馈,这些crates使用了新版Cargo中添加的软件包重命名功能。如果您使用的是2018年5月10日发布的Rust 1.26.0,则不会受到影响。
此漏洞的CVE为CVE-2019-16760。
问题概述
可以通过Cargo.toml
和[dependencies]
区域配置Cargo,使其依赖于不同的crates,例如在crates.io中的crates。还可以通过多种方式配置crates的依赖,例如,如果您依赖serde
并启用该crates,则derive
的特征将如下所示:
serde = { version = "1.0", features = ['derive'] }
Rust 1.31.0 引入了Cargo的新功能 package
,这是一个在本地重命名crates的可选方法。例如,如果您在本地更喜欢使用serde1
,可以将serde
进行更改:
serde1 = { version = "1.0", features = ['derive'], package = "serde" }
正是由于添加了package
密钥,Cargo才以不同的方式编译crates。该功能最初是在Rust 1.26.0中实现的,但当时还不稳定。但是,对于Rust 1.25.0及更低版本,Cargo会忽略这个package关键字,并将依赖项行编译为:
serde1 = { version = "1.0", features = ['derive'] }
这意味着,当使用Rust 1.25.0及更低版本进行编译时,它将尝试下载 serde1
crates。黑客可以将serde1
的名字建立在crates.io上,虽然长得像serde 1.0.0
但是却是恶意的代码。
总而言之,在Rust 1.25.0及更低版本中,将忽略使用package
关键字来重命名依赖项Cargo.toml
。使用Rust 1.25.0及更高版本时,Cargo会忽略package
并下载错误的依赖关系,而该依赖关系可能被crates.io认为是恶意软件包。这不仅会影响您自己在本地编写的清单,还会影响发布到crates.io的清单。例如,如果您发布的crates依赖于crates.io上的serde1
,则添加了您的依赖项的用户如果使用Rust 1.25.0及更低版本,也可能会受到攻击。
阅读原文了解更多
使用Rust构建Azure IoT Edge安全防护程序
Azure IoT Edge是Microsoft Azure IoT团队的开源跨平台软件项目,旨在解决从云管理到本地网络边缘的计算分发管理问题。
该安全防护程序引导Azure IoT Edge的运行。它充当Azure IoT Edge运行时与许多主机服务(例如容器运行时和基于硬件的加密设备,硬件安全模块(HSM)和受信任的平台模块(TPM))之间的通信代理。
Cyclone的深远影响
2001年,Trevor Jim(AT&T的研发公司)和Greg Morrisett(康奈尔公司)发起了一个联合项目,以开发C编程语言的安全方言,这是早期的有关Typed Assembly Language的成果 。经过五年的努力和参阅了一些已发表的论文,该团队(包括Dan Grossman,Michael Hicks,Nik Swamy和其他人)发布了Cyclone 1.0。随后,开发人员继续开展了一系列工作。
阅读原文了解更多
【招聘】在日本的RUST实习
关于我们:Tsuru Capital是总部设在东京的权益基金。这家公司规模虽小但实力雄厚,专门开发自动期权交易。公司文化宽松,员工有很大的个人自由。目前大多数软件都是用Haskell编写的,但是一些新组件是用Rust编写的。
关于工作:通常,实习生会在公司待上3~6个月。您将住在东京(我们将帮助您找到公寓并安顿下来)。与大多数实习不同,这里薪水高,还可以休假。因此,如果您愿意,您将有足够的时间和金钱来日本做一些旅行。在最后,您有可能获得我们永久性的offer。实习生没有任何与交易相关的岗位,因此实习期的全部时间都是在编写软件。您将使用Rust编写,并且可能会在新的市场模拟环境中工作。办公语言是英语。如果您想在这里学习日语,我们每周会在办公室开设一次课程。如果您想了解Tsuru的实习情况,请在r/haskell中询问。这是我们第一次提供Rust实习。
关于您的背景:从博士学位到大学刚毕业、或是大学一年级的学生、以及从事专业软件编写多年的人都可以。我们并不是专门寻找应届毕业生,对教育、经验、居住国家等没有严格的要求,只要您满足条件能够让我们能帮助您取得日本签证即可。虽然有时这可能是一个问题,但通常情况下都是成功的。您不需要任何先前的财务知识或经验。我们将在前两个星期内举办一系列的讲座来让您快速入门,如果您想更深入地了解我们,我们还提供很多文献。最重要的是您需要具备Rust编程的能力,您还需要能够说一口流利的英语。
如何申请:在Tsuru Capital 的网站上有一个页面描述编程挑战。使用Rust完成它。将您的提交和简历等发送到jobs@tsurucapital.com。如果一切顺利,我们将安排视频聊天面试。
From 日报小组 @Lance
日报订阅地址:
独立日报订阅地址:
社区学习交流平台订阅:
评论区
写评论还没有评论