Skip to content

edwin0cheng/dy_panic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This example project demonstrates the dynamic linkage behavior of override static variable in some situation:

How to run

cargo run

Output (In Ubuntu 16.04)

Calling some_staticlib::get_global_direct()
[some_staticlib/src/lib.rs:5] p_global_var = 0x00007f977c43695c
Calling some_dy::get_global_var_from_dy)
[some_staticlib/src/lib.rs:11] p_global_var = 0x00007f977b1c16c0
Calling some_dy::cget_global_var_direct)
[some_staticlib/src/lib.rs:5] p_global_var = 0x00007f977c43695c

The "meat" of the code

dy_panic/src/main.rs

Lines 22 to 55 in 98e399a

fn main() -> Result<(), std::io::Error> {
println!("Calling some_staticlib::get_global_direct()");
some_staticlib::get_global_direct();
let dy_path = find_some_dy()?;
let lib = DynamicLibrary::open(Some(&dy_path)).expect("Cannot open dynamic library!");
let call_from_dy = unsafe {
match lib.symbol("get_global_var_from_dy") {
Err(e) => {
panic!("{:#?}", e);
}
Ok(f) => std::mem::transmute::<*mut u8, fn() -> u32>(f),
}
};
let call_from_direct = unsafe {
match lib.symbol("get_global_var_direct") {
Err(e) => {
panic!("{:#?}", e);
}
Ok(f) => std::mem::transmute::<*mut u8, fn() -> u32>(f),
}
};
println!("Calling some_dy::get_global_var_from_dy)");
call_from_dy();
println!("Calling some_dy::cget_global_var_direct)");
call_from_direct();
Ok(())
}

#[no_mangle]
pub extern "C" fn get_global_var_from_dy() -> u32 {
some_staticlib::get_global_from_dy()
}
#[no_mangle]
pub extern "C" fn get_global_var_direct() -> u32 {
some_staticlib::get_global_direct()
}

https://github.com/edwin0cheng/dy_panic/blob/98e399a70d26eb754cc09d320090d098ac25980c/some_staticlib/src/lib.rs#L1-L15

Explanation

In src/main.rs:

  • call some_staticlib::get_global_direct() (static linkage)
  • call some_dy::get_global_var_from_dy (dynamic linkgage)
    • in some_dy , call some_staticlib::get_global_var_from_dy() (static linkage with some_dy)
  • call some_dy::get_global_var_direct (dynamic linkgage)
    • in some_dy , call some_staticlib::get_global_var_direct() (static linkage with some_dy)

Note that although some_dy::get_global_var_from_dy and some_dy::get_global_var_direct are wrapped in dynamic library, the dynamic linker is smart enough to know that the underneath some_staticlib::get_global_var_direct() can be shared.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages