如何指定在 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!
中使用的内部数据结构。
我可以使用 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!
中使用的内部数据结构。