3 个版本
0.1.2 | 2024 年 4 月 11 日 |
---|---|
0.1.1 | 2024 年 4 月 6 日 |
0.1.0 | 2024 年 4 月 5 日 |
#1010 in 解析器实现
131 每月下载量
150KB
560 代码行
包含 (Windows DLL, 120KB) test-dlls/hello_world_lib.dll
Reflective PE COFF DLL 加载器
加载器是一种程序,它将可执行代码(例如,在 ELF、PE COFF 或 Mach-O 格式下)加载到内存中以便执行。
反射加载器就是这样一种加载器,它从内存缓冲区加载可执行代码,而不是从磁盘上的文件加载。
use reflective_pe_dll_loader::{PeDll, Symbol};
let bytes: &[u8] = include_bytes!("../test-dlls/hello_world_lib.dll");
let pe_dll = PeDll::new(&bytes).unwrap();
let add: Symbol<extern "C" fn(i32, i32) -> i32> = {
let symbol = pe_dll.get_symbol_by_name("add").unwrap();
unsafe { symbol.assume_type() }
};
assert_eq!(add(1, 2), 3);
建议
此 crate 有有限的使用场景。如果您可以避免构建嵌入到可执行文件中的动态库,而是创建一个对象文件,将其与可执行文件静态链接,则应这样做。
致谢
它主要基于来自 https://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ 的代码。
注意:教程不完整,例如,不涵盖 TLS 回调。这可能是某些 DLL 的问题,但可能在将来得到解决。
依赖项
~1.2–1.9MB
~35K SLoC