gcc связывает только «необходимые функции» - PullRequest
3 голосов
/ 18 июня 2011

При компиляции C-программы gcc по умолчанию связывает стандартную C-библиотеку.Можно ли связать только выбранные функции, скажем printf вместо полной стандартной библиотеки C, в попытке уменьшить размер исполняемого файла до минимума?

1 Ответ

5 голосов
/ 18 июня 2011

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

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

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

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

...