我想创建C-linkage函数来通过LD_PRELOAD
拦截我的程序调用,但我正在Rust中实现拦截函数。
我创建pub extern fn
来拦截调用没有问题,但我想从程序的全局状态读取/写入某处,因为我无法改变我正在拦截接受的函数的签名元数据。我不需要堆分配,我可以使用一些大型静态初始化的HashSet
或Vec
条目池。但我确实需要能够在程序运行期间添加和删除集合的元素。
我认识到这种模式与许多Rust设计目标背道而驰,但它对我来说似乎是一个合法的用例。
我是Rust的新手,所以我希望有一个unsafe
选项可以做到这一点。
如果查看代码示例很有用:
static mut foo Vec<c_int> = Vec::new();
...失败,因为您不能拥有需要析构函数的static
存储,或者进行堆分配。并且lazy_static!
不允许使用mut
能力结构。
理想情况下,我更喜欢HashSet<c_int>
。如果我不能让它工作,我想我可以尝试Vec::from_elem(100, 0)
。这不太理想,因为我需要提名某种哨兵价值,但如果它有效,我想我会感到满意。