Dynamic library based plugin system with async

  1. Is it possible to call async functions from Rust to Rust across a dynamic linking boundary?
  2. Question like above, but additionally with a requirement that the plugin could be compiled with a different version of rustc.

It's technically possible, but somewhat fiddly.

The easy way would be to use Box<dyn Future> if you're linking code compiled using the same Rust version on both sides.

But Rust's dyn Trait objects don't officially have a stable ABI, so if you need something less fragile, you need to do it the hard way, and make your own ABI for futures. Something like a struct with custom function pointers/callbacks for polling the future and drop for cleanup. You may also need to create a custom ABI wrapper for the Context and Waker. Unfortunately, libstd doesn't expose ability to deconstruct Waker into RawWakerVTable fields, so you'll need to make your own waker wrapper.