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

时间:2016-02-16 09:40:16

标签: rust elf

我可以使用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加载后立即调用的函数?

1 个答案:

答案 0 :(得分:2)

直接答案是使用#[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!中使用的内部数据结构。