С большинством традиционных компоновщиков статическая компоновка библиотеки выполняется на основе объектного файла. gcc обычно использует системный компоновщик в системе, которую вы используете.
Традиционно статическая библиотека - это просто архивный файл, состоящий из объектных файлов, которые образуют библиотеку. Когда вы связываете статическую библиотеку с вашей программой, компоновщик извлекает любые объектные файлы из библиотеки, которые помогают разрешать любые неразрешенные символы в вашей программе, включая файлы, представленные объектными файлами из библиотеки, которые помогали разрешать ранее неразрешенные символы.
Теоретически, если реализация стандартной библиотеки состояла из одного объектного файла на функцию, и между стандартными функциями библиотеки не было никаких зависимостей, то вы получите только те функции, которые вы явно вызвали. На практике вы, скорее всего, получите больше функций, чем явно включили.
Динамическое связывание совершенно другое. В этом случае ваша программа будет просто содержать ссылку на общий объект стандартной библиотеки, который будет полностью загружен в пространство памяти ваших процессов во время выполнения.