#elf #patch #configuration #lib #cli

nightly bin+lib elfredo

使 ELF 格式应用程序可配置

2 个版本

0.1.1 2021 年 5 月 12 日
0.1.0 2021 年 5 月 12 日

配置 中排名 #612

MIT/Apache

13KB
158 行代码(不包括注释)

elfredo

elfredo

`elfredo` 是一个库,允许你在编译后修补可执行文件。它使用额外的嵌入部分来存储可能需要更改但不需要重新编译二进制文件的数据/配置。

任何使用 elfredo 的项目都有两个主要组件

  • 自定义你的嵌入编辑器以匹配你的数据类型(步骤 1)
  • 通过调用 get_embedded_data 方法来检索嵌入数据(步骤 2)

实现这两个步骤后,你将得到两个二进制文件

  • [应用程序可执行文件].elf - 可编辑的应用程序
  • [嵌入编辑器可执行文件].elf - 你用于更改嵌入数据的二进制文件

集成步骤(请参阅 ./example

  1. 在嵌入编辑器二进制文件中编写你的可配置数据结构
// my_embeditor.rs
use elfredo::embeditor::run_embeditor;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
pub struct Person {
    name: String,
    id: u32,
}

fn main() {
    // This will print the embedded data if exists
    if let Err(err) = run_embeditor::<Person>() {
        panic!("{}", err);
    }
}
  1. 通过使用 elfredo 的 API 读取配置
// main.rs
use elfredo::get_embedded_data;
mod my_embeditor;
use my_embeditor::Person;

fn main() -> Result<(), failure::Error> {
    let person = get_embedded_data::<Person>().unwrap();
    println!("{:?}", person);
    Ok(())
}

  1. 将新数据嵌入到 elf 中
john@ubuntu:/mnt/hgfs/elfredo/example$ cat person.json
{
"name": "Ronald",
"id": 5
}

john@ubuntu:/mnt/hgfs/elfredo/example$ cargo run --bin embeditor ../target/debug/example person.json
   Compiling elfredo v0.1.0 (/mnt/hgfs/elfredo)
   Compiling example v0.1.0 (/mnt/hgfs/elfredo/example)
    Finished dev [unoptimized + debuginfo] target(s) in 24.99s
     Running `/mnt/hgfs/elfredo/target/debug/embeditor ../target/debug/example person.json`
"/tmp/.tmpXh5QHg"

john@ubuntu:/mnt/hgfs/elfredo/example$ ../target/debug/example
Person { name: "Ronald", id: 5 }

依赖关系

~8–18MB
~253K SLoC