It looks unsafe because it is unsafe. Unsafe means nothing more and nothing less than that there is a requirement you need to check to avoid UB that the compiler can't check for you. In the case of #[unsafe(no_mangle)] that would be that for well-known symbols (memcpy, on unix targets things like malloc, ...) you follow the specified behavior of this symbol. So for example the following thing is UB:
This has absolutely nothing to do with making the linker happy. Linker reported conflicts are the least of your worry if you use #[unsafe(no_mangle)] the wrong way. It is precisely the cases where the linker doesn't report conflicts that you have to worry about UB.