我可以使用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
加载后立即调用的函数?
答案 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!
中使用的内部数据结构。