Description
Using dlopen
is a subtle art. On top of the usual requirements around symbol conflicts and ABI compatibility, Rust's handling of symbols adds certain extra assumptions that can lead to UB here: ideally, we'd make sure that symbols from "different" crates can never clash. During normal builds, this is ensured by checking that the StableCrateId
is globally unique (and hashing everything into the StableCrateId
that is considered as relevant for crate identity), but this check is bypassed by dlopen
.
At the very least, this potential risk of collisions in dlopen
seems worth documenting somewhere. On top of that, is there anything we could do to mitigate this problem? Making StableCrateId
an actual cryptographic hash and 256 bits large is probably going to be prohibitively expensive, but maybe there is an alternative where only dlopen
users have to pay for extra checks, and if you don't use dlopen
it doesn't cost anything. One could imagine a rust_checked_dlopen
or so that performs the crate ID uniqueness check at runtime, somehow. Is that realistic? Is it useful?