- При обычной компиляции с
gcc test.c
компоновщик создает динамическую ссылку на printf
или статическую ссылку?
Это зависит.Учитывая эту конкретную команду компиляции, если доступна динамическая версия библиотеки C, и если GCC создан для ее использования (обе из которых весьма вероятны), то GCC будет выполнять динамическое соединение.Если доступна только статическая версия библиотеки C, или если GCC построен или настроен для статической ссылки по умолчанию, будет выполняться статическая ссылка.
printf
в конечном итоге совершает системный вызов write()
.Копирует ли компилятор C lib, определенный printf
, в конечный исполняемый файл (который в итоге вызовет write()
во время выполнения), или он копирует write()
непосредственно в конечный исполняемый файл.
Если GCC выполняет статическую связь, то он скопирует все функции, прямо или косвенно необходимые программе, и, возможно, другие, в конечный двоичный файл.В частности, я не уверен насчет компоновщика GNU, но некоторые компоновщики будут включать всю целевую библиотеку в окончательный двоичный файл.
Если я скомпилирую свой код и затем удалю C lib, мой код все еще будет работать?поскольку printf
больше нигде не определено.
Если вы статически связываете библиотеку C с вашей программой, то последующее удаление библиотеки C не будет (напрямую) препятствовать ее запуску.Но, в зависимости от деталей, это может помешать запуску всего остального , включая графический интерфейс, другие ваши приложения и даже оболочку, что может вызвать вопрос.
Статическое связывание все обязательные библиотеки - разумный метод для минимизации зависимостей времени выполнения ваших двоичных файлов, которые могут улучшить совместимость с системами, отличающимися от среды сборки.Это, как правило, дает на 1035 * намного бинарных файлов большего размера.В любом случае, если вы не строите каждую программу таким образом, удаление библиотек после факта обычно не является жизнеспособной альтернативой.