如何指定在Rust动态库中使用哪个ELF节
我可以使用Rust如何指定在Rust动态库中使用哪个ELF节,rust,elf,Rust,Elf,我可以使用Rustdylibcratet类型创建一个共享对象,但无法确定如何指定ELF.init部分。我有一个C程序,它用dlopen()加载一个共享对象,共享对象将在.init上注册类似回调函数的东西。如果我写入以下内容,编译将失败: #[no_mangle] pub extern fn _init() { ... 那么 我如何指定ELF部分(比如GCC的构造函数属性),或者是否有其他方法来指定一个函数,该函数将在加载后立即调用?直接的答案是使用[link\u section=“fo
dylib
cratet类型创建一个共享对象,但无法确定如何指定ELF.init
部分。我有一个C程序,它用dlopen()
加载一个共享对象,共享对象将在.init
上注册类似回调函数的东西。如果我写入以下内容,编译将失败:
#[no_mangle]
pub extern fn _init() {
...
那么
我如何指定ELF部分(比如GCC的
构造函数属性),或者是否有其他方法来指定一个函数,该函数将在加载后立即调用?直接的答案是使用[link\u section=“foo”]
属性
我尝试对GCC在OS X上创建的内容进行反向工程以复制它:
pub extern fn do_a_thing() {
println!("I was called by .init");
cool_code();
}
#[link_section = "__DATA,__mod_init_func"]
pub static CONSTRUCTOR: extern fn() = do_a_thing;
fn cool_code() {
println!("I'm just some code");
}
当加载dlopen
时,实际上会打印两行,但是整个程序都有分段错误。我对早期初始化的细节了解不够,无法完全缩小范围
实际上,它可能是,这表明问题可能只是因为println!中使用的内部数据结构
它可以与[link_section=“.ctors”]
配合使用,谢谢。
pub extern fn do_a_thing() {
println!("I was called by .init");
cool_code();
}
#[link_section = "__DATA,__mod_init_func"]
pub static CONSTRUCTOR: extern fn() = do_a_thing;
fn cool_code() {
println!("I'm just some code");
}