【发布时间】:2019-07-17 19:22:14
【问题描述】:
你好互联网的人们,
我正在努力调用一个存储在libc::c_void-Pointer 中的函数。我无法告诉 Rust 指针是可调用的,而且我不知道该怎么做。
我想翻译这段 C++ 代码
void * malloc(size_t size) {
static void *(*real_malloc)(size_t) = nullptr;
if (real_malloc == nullptr) {
real_malloc = reinterpret_cast<void *(*)(size_t)> (dlsym(RTLD_NEXT, "malloc"));
}
// do some logging stuff
void * ptr = real_malloc(size);
return ptr;
}
去锈。
#[no_mangle]
pub extern fn malloc(bytes: usize) {
let c_string = "malloc\0".as_mut_ptr() as *mut i8; // char array for libc
let real_malloc: *mut libc::c_void = libc::dlsym(libc::RTLD_NEXT, c_string);
return real_malloc(bytes);
}
这是我在互联网上搜索并尝试 1 小时后的进展。我是 Rust 新手,还不熟悉 Rust/FFI / Rust with libc。我尝试了很多 unsafe{},使用 as 进行强制转换,但我总是遇到以下问题:
return real_malloc(bytes);
^^^^^^^^^^^^^^^^^^ expected (), found *-ptr
Q1:如何调用存储在real_malloc中的void-Pointer后面的函数?
Q2:我的 Rust-String 到 C-String 转换这种方式可行吗?
【问题讨论】:
-
我认为在尝试做 ffi 之前应该优先学习基础知识,如何从函数中返回一些东西。
-
@Stargateur 是的,确实!请看看我自己对这篇文章的回答。我找到了你提到的帖子,它对我有帮助!还是谢谢!
-
我找到它是因为你找到了它,正如你自己所说,这解决了你的问题,所以它很可能是一个很好的重复候选者。只是将这个问题“标记”为接近,因为存在一个更通用的答案,如果未来的读者阅读您的问题,他们可以直接阅读。
-
好的!不知道它是否真的是重复的,因为这里的流行词是 void-Pointer。我可能不是唯一一个搜索这个而不是“原始地址”的人——你怎么看?
-
您的问题不会被删除,您的答案也不会被删除。只是我们阻止未来的人在这里写答案,而是鼓励人们在副本上写答案(如果需要)。 “重复的问题不一定是坏事;对同一问题的不同描述有助于未来的访问者找到他们正在寻找的答案。”见meta.stackexchange.com/questions/10841/…
标签: rust