- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在研究 DynamicLibrary
.
我的动态库代码(使用rustc --crate-type dylib dylib.rs
编译):
// dylib.rs
#[no_mangle]
pub fn minicall() -> u8 {
3u8
}
调用它的代码:
// caller.rs
use std::dynamic_lib::DynamicLibrary;
fn main() {
let mut v = Vec::new();
DynamicLibrary::prepend_search_path(&::std::os::getcwd());
match DynamicLibrary::open(Some("./libdylib.so")) {
Err(e) => panic!("ERROR: {}", e),
Ok(lib) => {
println!("Unsafe bloc !");
let func = unsafe {
match lib.symbol::< fn() -> u8 >("minicall") {
Err(e) => { panic!("ERROR: {}", e) },
Ok(f) => { *f },
}
};
println!("call func !");
let new_value = func();
println!("extend vec !");
v.push(new_value);
}
}
println!("v is: {}", v);
}
我有这个输出:
~> ./caller
Unsafe bloc !
call func !
Illegal instruction
在这里我完全迷路了。我做错了什么?
最佳答案
这里的问题是如何symbol
功能有效。它有签名:
unsafe fn symbol<T>(&self, symbol: &str) -> Result<*mut T, String>
加载的库基本上是内存中的一个大数组,其中某些地址标有名称(符号名称)。查询符号查找地址并直接返回指向它的指针。库中的函数是一长串指令,因此查询函数名称会返回一个直接指向开始的(函数)指针。然后可以将其作为普通函数指针调用。 rust DynamicLibrary
API返回此指针,即*mut T
直接指向动态库中的内存块(假设/希望是 T
类型)。
类型fn(...) -> ...
本身就是一个函数指针,也就是说,它是8个字节(或4个字节)存储它所代表的函数的开始地址。因此,调用 lib.symbol::< fn() -> u8 >("minicall")
是说“给我找到一个叫做 minicall
的东西的地址(它是一个函数指针)”,它并不是说“给我找到一个叫做 minicall
的东西的地址(它是一个函数指针)”是一个函数)”。 *mut (fn() -> u8)
的返回值然后是双重间接的,并且取消引用它以调用它是将函数代码的前 8(或 4)个字节解释为指针(即随机机器指令/函数前奏),而不是执行它们。
(旁注:如果您的图书馆中有 #[no_mangle] pub static minicall: fn() -> u8 = the_real_minicall;
,它可能会起作用,但您可能不想要它。)
调用lib.symbol::<T>("minicall")
正在返回我们想要的确切函数指针(也就是说,它返回一个指向 minicall
代码开头的指针),所以它只是向编译器表达这个问题。不幸的是,目前没有类型 T
这使得 *mut T
一个函数指针,所以必须先设置 T = u8
(即 lib.symbol::<u8>("minicall")
),然后通过 transmute::<_, fn() -> u8>(pointer)
将返回值转换为适当的函数指针类型.
(即使在其他答案被接受后我也在回答这个问题,因为我认为它没有很好地解释原因,只是给出了解决方案。)
最后一件事,在这种情况下这不是问题,但它经常使人绊倒:Rust ABI(用于 fn(...) -> ...
类型函数的调用约定)与 C ABI 不同,因此函数从 C 动态库加载的类型应为 extern "C" fn(...) -> ...
, 不是 fn(...) -> ...
.
关于rust - 手动调用一个rust动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26688575/
http://www.vex.net/~trebla/haskell/so.xhtml描述如何编译共享库。 关于编译命令: ghc -O2 -dynamic -shared -fPIC -o libE
我想从Rust调用一个C++动态库(* .so),但是我不想从Rust构建它。像这样, cc::Build::new() .file("src/foo.cc") .shared_fla
我想问一下,打包在ear中的war是否可以使用war文件中没有打包的库。我想在文件系统上拥有包含库的目录,部署的 war 文件将从该目录加载库。我还没有找到如何执行此操作的示例。所以我想问一下部署的w
我正在制作一个 C++ 库。在库中,我正在使用另一个静态库中的一些函数(例如 ref.a)。 我想生成一个库文件,mylib.a 或 mylib.so,这样使用我的库的任何程序都不需要链接到静态库 (
我正在尝试在 linux 中为一个使用 opencv 和 tesseract 以及动态链接的程序创建一个共享库 我关注了link我的代码如下 g++ -c Serial_Key.cpp -fPIC -
[编辑:简而言之,问题是:当我链接到一个链接到另一个动态库的动态库时,我是否也必须显式链接到那个?] 我在一个软件中看到了类似的东西。它不起作用,现在我想知道它是否应该起作用。我可以将库“bar”动态
我的项目中有一堆 Dll,使用 VStudio 9.0 编译器,预编译头文件用于我所有的 Dll。 dll 的加载过程由隐式调用程序完成(必须提供.dll、.lib 和 header )。 我通常为每
在我开始开发更多的 c++ 项目之前,我想建立一个良好的多平台环境并使用一些基本形式的修订 (rsync)。为此,我学习了如何构建 makefile(使用 uname 变量)并且还开始在 Window
我测试试,导出dll成功了,但是调用exe编译失败。 后来把声明代码改为了dllexport,调用exe编译成功了,调用也成功。 #pragma once #ifdef YOLOFACE_DLL_AP
我的问题很简单。有什么方法可以反编译、逆向工程 DYLIB 文件(MAC 的动态库,如 Windows DLL)。? 推荐什么程序这样做? 我正在寻找类似 Olly 或 IDA 之类的程序,但适用于
我已将我的应用提交到App Store,但遭到拒绝。我收到一封电子邮件,说: 无效的捆绑包-dylib搜索路径中不存在您的应用程序引用的一个或多个动态库。 我没有使用CocoaPods,所以所有外部框
我在 CPython 中使用 pythonnet,并且我成功安装了它 import clr clr.AddReference('Assembly') 确实有效。 在我的 C# 代码中,如果是成员 pu
GCC 简介有一个例子: $ gcc -Wall -L. main.c -lhello -o hello The option ‘-L.’ is needed to add the current d
我知道当您使用 dlopen() 加载动态 C++ 库时,您可以获得指向该库内函数的指针,但是有没有一种方法可以有效地(性能很重要)另一个怎么办? 我知道我可以在库中调用一个函数(在初始化库时),将一
给程序和库添加版本号和库,有利于维护和升级。 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本。所
我正在尝试将我的 C 程序链接到静态库和动态库以查看差异。我怎么做?我制作了自己的 Makefile: # ------ executable rule ----------- app : app.
假设我想创建一个动态库 dynamic.so,但我的代码引用了某个其他静态库 static.a 中存在的函数。自然地,如果我使用 g++ 和 -shared 选项进行编译和链接,dynamic.so
我想使用 alarm函数有一个中断来安排对 fcntl + F_SETLKW 的阻塞调用超时(用于锁定文件获取)。但是,我的代码位于共享库/dylib(主机应用程序的插件)中,alarm 的文档指出这
【目录】 第一个动态库文件 应用程序 第二个动态库文件 错误做法:直接给它改名 正解:patchelf 工具 One More Thing
什么是模块化编程 模块化编程就是我们一个复杂的项目分成很多模块,比如一个单片机项目,就可能分为:主函数模块,液晶显示和数码管显示模块,时间延时模块,温度传感器模块等。而一个程序工程包含多个源文件(.c
我是一名优秀的程序员,十分优秀!