The other really important bit of historical context here: UNIX did not have shared libraries at the time and so this was the only moderately efficient way of reusing code between tasks. This is also the reason that the shell does argument expansion: linking the glob function from libc into every program would have made things much bigger.
In contrast, Multics had a much richer notion of a shared library, where libraries were their own protection domain and could expose typed interfaces to programs and permit IPC via memory owned by the program. This was not possible to implement on the systems without MMUs that UNIX ran on.
The other really important bit of historical context here: UNIX did not have shared libraries at the time and so this was the only moderately efficient way of reusing code between tasks. This is also the reason that the shell does argument expansion: linking the glob function from libc into every program would have made things much bigger.
In contrast, Multics had a much richer notion of a shared library, where libraries were their own protection domain and could expose typed interfaces to programs and permit IPC via memory owned by the program. This was not possible to implement on the systems without MMUs that UNIX ran on.