Самый простой случай - статическое линкование, когда весь код и данные библиотеки включаются в файл:
То есть каждая программа, которая использует библиотеку с таким способом линковки, содержит свой собственный экземпляр библиотеки.
Теперь же рассмотрим динамическое линкование. Дела обстоят совсем по-другому:
Как видно из рисунка, программа, использующая динамическую линковку, создает только копии модифицируемых глобальных переменных библиотеки ("library data"), а непосредственно код библиотек ("library code") не копирует, а использует тот, что уже загружен в память, используя отображение (mapping) адресов функций из виртуального адресного пространства на физические адреса функций загруженной в память библиотеки. И каждая программа, вызывая функции динамически линкованной библиотеки, использует одни и те же физические адреса, что позволяет экономить память.
Подробнее здесь.