elf_loader:一个使用Rust编写的ELF加载器

本文介绍一个使用Rust实现的ELF加载器。

下面是elf_loader的仓库链接:

github:

https://github.com/weizhiao/elf_loaderhttps://github.com/weizhiao/elf_loader

crates.io:

https://crates.io/crates/elf_loaderhttps://crates.io/crates/elf_loader

1 它能做什么?

elf_loader能够从内存、文件加载各种形式的elf文件,包括Executable file、Shared object file和Position-Independent Executable file。

PS:后面这两个其实是一类格式,Position-Independent Executable file其实就是带有入口的Shared object file,即可以执行的Shared object file。

鉴于此,它能够被使用在以下地方:

1 在操作系统内核中使用它作为elf文件的加载器

2 使用它实现Rust版本的动态链接器。PS:我自己也实现了一个https://github.com/weizhiao/dlopen-rs

3 在嵌入式设备上使用它加载elf动态库

2 优势

✨ 可以在 no_std环境中工作✨

elf_loader不依赖Rust std,也不强制依赖libc和操作系统,因此可以在内核和嵌入式设备等no_std环境中使用。

✨速度快✨

elf_loader吸取了musl和glibc里ld.so实现的优点,并充分利用了Rust的一些特性(比如静态分发),可以生成性能出色的代码。基于elf_loader实现的动态链接器dlopen-rs性能比libloading(ld.so)更好。

✨非常容易移植,具有良好的可扩展性✨

如果你想要移植elf_loader,你只需为你的平台实现 Mmap和ElfObject trait。在实现Mmap trait时可以参考elf_loader提供的默认实现:

elf_loader/src/mmap at main · weizhiao/elf_loader

此外你可以使用elf_loader提供的hook函数来拓展elf_loader的功能,实现其他任何你想要的功能,在使用hook函数时可以参考dlopen-rs里的实现:https://github.com/weizhiao/dlopen-rs/blob/main/src/loader/mod.rs

✨提供异步接口✨

elf_loader提供了加载elf文件的异步接口,这使得它在某些并发加载elf文件的场景下有更高的性能上限。不过你需要根据自己的应用场景实现 Mmap和ElfObjectAsync trait。比如不使用mmap来直接映射elf文件,转而使用mmap+文件读取的方式(mmap创建内存空间再通过文件读取将elf文件的内容读取到mmap创建的空间中)来加载elf文件,这样就能充分利用异步接口带来的优势。

✨编译期检查✨

elf_loader利用Rust的生命周期机制,在编译期检查elf文件的依赖库是否被提前销毁,大大提高了安全性。 比如说有三个被elf_loader加载的动态库a,b,c,其中c依赖b,b依赖a,如果a,b中的任意一个在c drop之前被drop了,那么将不会程序通过编译。你可以在examples/relocate中验证这一点:elf_loader/examples/relocate.rs at main · weizhiao/elf_loader · GitHub

3 示例

加载一个简单的动态库:

use elf_loader::{Loader, mmap::MmapImpl, object::ElfFile};
use elf_loader::{Loader, mmap::MmapImpl, object::ElfFile};
use std::{collections::HashMap, ptr::null};fn main() {fn print(s: &str) {println!("{}", s);}// liba.so依赖的符号let mut map = HashMap::new();map.insert("__gmon_start__", null());map.insert("__cxa_finalize", null());map.insert("_ITM_registerTMCloneTable", null());map.insert("_ITM_deregisterTMCloneTable", null());map.insert("print", print as _);let pre_find = |name: &str| -> Option<*const ()> { map.get(name).copied() };// 加载动态库liba.solet mut loader = Loader::<MmapImpl>::new();let liba = loader.easy_load_dylib(ElfFile::from_path("target/liba.so").unwrap()).unwrap();// 重定位liba.so中的符号let a = liba.easy_relocate([].iter(), &pre_find).unwrap();// 调用liba.so中的函数alet f = unsafe { a.get::<fn() -> i32>("a").unwrap() };f();
}

4 补充

如果你在使用时遇到任何问题,都可以在本文的评论区或者github上提出问题,此外十分欢迎任何对elf加载器感兴趣的朋友贡献代码(改进elf_loader本身,增加样例,修改文档中存在的问题都可以)。如果觉得elf_loader对你有帮助的话不妨点个star。^v^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)

数据库驱动找起来好麻烦&#xff0c;我整理到了一起&#xff0c;需要的朋友免费下载&#xff1a;驱动下载 目前收录了Oracle、Mysql、达梦、Postgresql的数据库驱动的多个版本&#xff0c;后续可能会分享更多。

对接扣子双向流式 TTS Demo

Web端对接Demo <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>TTS 测试</title> </head><body><h1>TTS 测试页面</h1><textarea id"textInput" rows&…

科普:“git“与“github“

Git与GitHub的关系可以理解为&#xff1a;Git是一种软件工具&#xff0c;而GitHub则是一个在线平台&#xff0c;它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说&#xff1a; 一、Git 定义&#xff1a;Git是一个开源的…

jsherp importItemExcel接口存在SQL注入

一、漏洞简介 很多人说管伊佳ERP&#xff08;原名&#xff1a;华夏ERP&#xff0c;英文名&#xff1a;jshERP&#xff09;是目前人气领先的国产ERP系统虽然目前只有进销存财务生产的功能&#xff0c;但后面将会推出ERP的全部功能&#xff0c;有兴趣请帮点一下 二、漏洞影响 …

【目标检测】【BiFPN】EfficientDet:Scalable and Efficient Object Detection

EfficientDet&#xff1a;可扩展且高效的目标检测 0.论文摘要 模型效率在计算机视觉中变得越来越重要。在本文中&#xff0c;我们系统地研究了用于目标检测的神经网络架构设计选择&#xff0c;并提出了几项关键优化以提高效率。首先&#xff0c;我们提出了一种加权双向特征金…

拖动线条改变区域大小

浏览网页时&#xff0c;经常看到这样一个功能&#xff0c;可以通过拖拽线条&#xff0c;改变左右区域大小 在管理后台中更为常见&#xff0c;菜单的宽度如果固定死&#xff0c;而后续新增的菜单名称又不固定&#xff0c;所以很可能导致换行&#xff0c;样式不太美观&#xff0c…

输入框元素覆盖冲突

后端响应中的 "trainingKbGroupName": "基础死型" 通过searchForm2.initFormData(rowData[0]);操作会把基础死型四个字填充到<div class"col-sm-5 form-group"> <label class"col-sm-3 control-label">知识点分组名称<…

【LLM】Llama 3 论文精读

导言 Llama 3.5系列模型的发布&#xff1a; Llama 3.5系列模型是开源的&#xff0c;最大模型参数为405B&#xff08;[[稠密Transformer架构]]&#xff0c;而不是MOE 架构&#xff09;&#xff0c;上下文窗口长度为128K。模型支持多语言和工具使用&#xff0c;并且在某些评估中已…

selenium环境搭建

1. 安装selenium pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/如遇以下报错 Getting requirements to build wheel ... errorerror: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─…

My first Android application

界面元素组成&#xff1a; 功能代码&#xff1a; /*实现功能&#xff1a;当输入内容后&#xff0c;欢迎文本发生相应改变&#xff0c;并清除掉文本域内容当未输入任何内容时&#xff0c;弹出提示文本以警告用户*/val greetingText findViewById<TextView>(R.id.printer)…

js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性

ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言,本文讲述Javascript[ECMAScript]版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]的新特性,帮助朋友们更好的熟悉和使用Javascript ES5 1.严格模式 use strict2.Object getPrototypeOf,返回一个对象的原…

Redis数据结构-String字符串

1.String字符串 字符串类型是Redis中最基础的数据结构&#xff0c;关于数据结构与要特别注意的是&#xff1a;首先Redis中所有的键的类型都是字符串类型&#xff0c;而且其他集中数据结构也都是在字符串类似基础上进行构建&#xff0c;例如列表和集合的元素类型是字符串类型&a…

cline通过硅基流动平台接入DeepSeek-R1模型接入指南

为帮助您更高效、安全地通过硅基流动平台接入DeepSeek-R1模型&#xff0c;以下为优化后的接入方案&#xff1a; DeepSeek-R1硅基流动平台接入指南 &#x1f4cc; 核心优势 成本低廉&#xff1a;注册即送2000万Tokens&#xff08;价值约14元&#xff09;高可用性&#xff1a;规…

Java多线程三:补充知识

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Lambda表达式 简介&#xff1a; 希腊字母表中排序第十一位的字母&#xff0c;英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念 为什么要使用lam…

装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住

文章目录 引言I 毛坯房装修的全流程**1. 装修前准备****1.1 确定装修预算****1.2 选择装修方式****1.3 选择装修公司****1.4 办理装修手续****2. 设计阶段****2.1 量房****2.2 设计方案****2.3 确认方案****3. 施工阶段****3.1 主体拆改****3.2 水电改造****3.3 防水工程****3.…

Embedding方法:从Word2Vec到ltem2Vec

引言 在推荐系统领域&#xff0c;如何有效表征物品特征始终是核心挑战。传统协同过滤方法受限于稀疏性问题&#xff0c;直到2016年微软研究院提出的Item2Vec方法&#xff0c;将自然语言处理中的Word2Vec技术创造性应用于物品表征学习&#xff0c;开启了嵌入学习的新纪元。 It…

Udp发送和接收数据(python和QT)

服务端代码 (python) import socketdef udp_server(host0.0.0.0, port12345):# 创建一个UDP套接字sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动&#xff0c;监听端口 {port}...&…

VBA脚本将DeepSeek嵌入Word中教程

一、获取API-Key 目前我们可以直接只用官网的API来实现&#xff0c;申请这一步是关键 也可以直接访问官网的API平台&#xff1a;https://platform.deepseek.com/ &#xff0c;没注册的注册完登录一下&#xff0c;我们点击到左侧菜单的“APIKeys”按钮&#xff0c;然后点击右侧…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

网站搭建基本流程

需求分析&#xff1a; 实现网站搭建的过程&#xff1a;首先进行网站的需求性分析 网站可分为前台系统和后台系统&#xff0c;由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块&#xff1a; 在编写代码前&#xff0c;我们要先对网站进行架构&#xff0c;通过…