elfredo
is a library that allows you to patch executables after they were
compiled. It utilize an extra embedded section to store data/configurations
that one might want to change without recompiling the binary.
There are two main components to any project that uses elfredo:
* Customizing your embeditor to mach your datatype (step 1)
* Calling the get_embedded_data
method to retrieve the embedded
data (step 2)
After these two are implemented you end up with two binaries: * [app executable].elf - Your editable app * [embeditor executable].elf - The binary that you use to change the embedded data
Steps to integrate (See ./example
):
1. Write your configurable data structure in the embeditor binary:
```rust
// myembeditor.rs
use elfredo::embeditor::runembeditor;
use serde::{Deserialize, Serialize};
pub struct Person { name: String, id: u32, }
fn main() {
// This will print the embedded data if exists
if let Err(err) = run_embeditor::
fn main() -> Result<(), failure::Error> {
let person = getembeddeddata::
3. Embed new data to the elf
shell
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 } ```