如何指定在 Rust dylib 中使用哪个 ELF 部分

How to specify which ELF section to use in a Rust dylib

我可以使用 Rust dylib crate 类型创建共享对象,但无法弄清楚如何指定 ELF .init 部分。我有一个 C 程序,它用 dlopen() 加载一个共享对象,共享对象将在 .init 注册类似回调函数的东西。如果我写编译失败:

#[no_mangle]
pub extern fn _init() {
    ...

那么,

test.0.rs:(.text._init+0x0): multiple definition of `_init'

如何指定 ELF 部分(如 GCC 的 constructor 属性)或是否有另一种方法来指定将在 .so 加载后立即调用的函数?

直接的答案是使用 #[link_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 时,这实际上打印了两行,但随后整个程序出现了分段错误。我对早期初始化的详细信息了解不够,无法完全缩小范围。

实际上,它可能是 this bug,这表明问题可能只是因为 println! 中使用的内部数据结构。