Dynamic linking addressed was a solution to a lot more issues than just not having enough physical memory. It provided convenient ways to ensure consistent modules between otherwise unrelated processes, to upgrade functionality on all processes on a platform without altering them, to insulate programs from changes to the underlying platform, etc.