1) Пусть X.so сохранит свои данные в файл (с номером версии!), Выгрузит X.so, загрузит Y.so, пусть Y.so загрузит данные из файла.
2) вместо этого используйте имена версий, загрузите оба, сделайте так, чтобы Y.so заполнял его контейнеры непосредственно из контейнеров X.so (проверьте номер версии!), Затем выгрузите X.so.
Я действительно не рекомендую передавать контейнеры напрямую, так как если ABI несовместимы по какой-либо причине, он скомпилируется нормально, но вылетает во время выполнения. Это также облегчает преднамеренное изменение ABI.