The R_callDLLUnload function removes a Dllinfo from the LoadedInfo array by releasing its allocated memory and moving the following items one item backwards.
However there is additional reference to that array kept in a 'DLLs' object inside the package namespace (put there by loadNamespace). That pointer is not updated and is still pointing to the same place, meaning that every dynamic library loaded after an unloaded library has a wrong pointer. That pointer is used by the getCallingDLLe inside .Call.
This can be reproduced by loading two dlls, unloading the first and calling .Call for some function in the second dll (without the PACKAGE argument).
This will tell you it cannot resolve the function name.
I solved it internally by adding another level of dereferencing in the LoadedDLL array but it might need a better solution.
I neglected to mention that this causes occasional bus error crashes with a "non-existent physical address" message.