ghostscope_process/
cookie.rs

1use object::Object;
2use std::fs;
3
4/// Compute a stable cookie from a module file path (no PID context):
5/// 1) Build-ID if available; 2) filesystem dev:ino; 3) absolute path string hash.
6pub fn from_path(module_path: &str) -> u64 {
7    // 1) Build-ID
8    if let Ok(bytes) = fs::read(module_path) {
9        if let Ok(obj) = object::File::parse(&bytes[..]) {
10            if let Ok(Some(build_id)) = obj.build_id() {
11                use std::collections::hash_map::DefaultHasher;
12                use std::hash::{Hash, Hasher};
13                let mut hasher = DefaultHasher::new();
14                build_id.hash(&mut hasher);
15                return hasher.finish();
16            }
17        }
18    }
19    // 2) Filesystem dev:ino
20    #[cfg(target_os = "linux")]
21    {
22        use std::os::unix::fs::MetadataExt;
23        if let Ok(meta) = fs::metadata(module_path) {
24            let dev = meta.dev();
25            let ino = meta.ino();
26            return ((dev & 0xffff_ffff) << 32) | (ino & 0xffff_ffff);
27        }
28    }
29    // 3) Absolute path string hash
30    use std::collections::hash_map::DefaultHasher;
31    use std::hash::{Hash, Hasher};
32    let mut hasher = DefaultHasher::new();
33    module_path.hash(&mut hasher);
34    hasher.finish()
35}