gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:07:57 25 4
gpt4 key购买 nike

我可以使用 Rust dylib 包类型创建一个共享对象,但无法弄清楚如何指定 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 - 如何指定在 Rust dylib 中使用哪个 ELF 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35428834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com