#patch #dynamic #hotload

nightly hotpatch

在运行时更改函数定义

3 个版本 (破坏性更新)

0.3.0 2021 年 2 月 9 日
0.2.0 2021 年 2 月 2 日
0.1.0 2020 年 12 月 18 日

#1181开发工具

GPL-3.0 许可证

26KB
368 行代码

hotpatch

crates.io docs.rs

此包主要用于以极简单的方式从共享对象文件中加载新的函数定义。

主要特性

  • 线程安全
  • 类型安全
  • 适用于任何签名函数
  • 命名空间感知

简例

以下展示了此包的使用是多么简单

// main.rs
use hotpatch::*;

#[patchable]
fn foo() { }

fn main() -> Result<(), Box<dyn std::error::Error>> {
  foo(); // does nothing
  foo.hotpatch_lib("libsomething.so")?;
  foo(); // does something totally different!
  foo.hotpatch_fn(|| println!("Dyamic!"))?;
  foo(); // even more modification!
  Ok(())
}

警告

不要对您当前所在的函数或其父函数进行热补丁。

因为 hotpatch 不允许同时生效多个函数定义,这会导致死锁。

虽然可以使用 force 函数实现此功能,但它们是 unsafe 的,因为在多线程环境中,这可能导致同时生效多个函数定义。

文档

更多信息,请参阅 文档

待办事项

此包距离“完成”还有很长的路要走。以下是待完成的任务。提交问题或 PR 到此部分以提出功能请求!

  • no_std 和使用功能以提供最广泛的功能
    • 可能需要回到 lazy_static
  • 方法(进行中)
  • #[patchable] ||() 从闭包生成(这可能甚至不可能?)
  • 降低编译时间
    • 仅包含子依赖项所需的必要功能
  • 正确记录夜间功能要求

依赖项

~1.3–1.8MB
~38K SLoC