如何指定在Rust动态库中使用哪个ELF节

如何指定在Rust动态库中使用哪个ELF节,rust,elf,Rust,Elf,我可以使用Rustdylibcratet类型创建一个共享对象,但无法确定如何指定ELF.init部分。我有一个C程序,它用dlopen()加载一个共享对象,共享对象将在.init上注册类似回调函数的东西。如果我写入以下内容,编译将失败: #[no_mangle] pub extern fn _init() { ... 那么 我如何指定ELF部分(比如GCC的构造函数属性),或者是否有其他方法来指定一个函数,该函数将在加载后立即调用?直接的答案是使用[link\u section=“fo

我可以使用Rust
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");
}