Размер библиотеки и исполняемого файла - PullRequest
10 голосов
/ 16 декабря 2008

У меня есть статическая библиотека * .lib, созданная с помощью MSVC на Windows. Размер библиотеки, скажем, 70 КБ. Тогда у меня есть приложение, которое связывает эту библиотеку. Но теперь размер конечного исполняемого файла (* .exe) составляет 29 КБ, что меньше размера библиотеки. То, что я хочу знать, это:

  1. Поскольку библиотека статически связана, я думал, что она должна добавить непосредственно к размеру исполняемого файла, а конечный размер исполняемого файла должен быть больше, чем это? Windows exe формат также делает некоторое сжатие двоичных данных?

  2. Как это для систем Linux, то есть как размеры библиотеки в Linux (файл * .a / *. La) связаны с размером исполняемого файла linux (* .out)?

-AD

Ответы [ 7 ]

12 голосов
/ 16 декабря 2008

Статическая библиотека в Windows и Unix представляет собой набор файлов .obj / .o. Компоновщик просматривает каждый из этих объектных файлов и определяет, требуется ли программе связывание. Если это не нужно, объектный файл не будет включен в конечный исполняемый файл. Это может привести к тому, что исполняемые файлы будут меньше библиотеки.

РЕДАКТИРОВАТЬ: Как указывает MSalters, в Windows компилятор VC ++ теперь поддерживает создание объектных файлов, которые позволяют связывание на уровне функций, например, см. здесь . Фактически, редактирование и продолжение требует этого, поскольку редактирование и продолжение должны иметь возможность заменить наименьшую возможную часть исполняемого файла.

5 голосов
/ 16 декабря 2008

В файле .lib содержится дополнительная бухгалтерская информация, которая не требуется для конечного исполняемого файла. Эта информация помогает компоновщику найти код для реальной ссылки. Кроме того, отладочная информация может храниться в файле .lib, но не в файле .exe (я не помню, где хранится отладочная информация для objs в файле lib, она может быть где-то еще).

4 голосов
/ 16 декабря 2008

Статическая библиотека, вероятно, содержит несколько функций, которые никогда не используются. Когда компоновщик связывает библиотеку с основным исполняемым файлом, он видит, что определенные функции никогда не используются (и что их адреса никогда не берутся и не сохраняются в указателях функций), он просто выбрасывает код. Он также может делать это рекурсивно: если функция A () никогда не вызывается, и A () вызывает B (), но B () никогда не вызывается иначе, он может удалить код для A () и B (). В Linux происходит то же самое.

0 голосов
/ 17 декабря 2008

@ All: Спасибо за указатели. @ Грег Хьюгилл - Ваш ответ был хорошим указателем. Спасибо.

Ответ, который я узнал, был следующим:

1.) Во время построения библиотеки происходит, если опция «Сохранить отладочную программу» в MSVC (или что-то подобное) включена, то библиотека будет иметь эту отладочную информацию, увеличивая ее размер. но когда я статически включаю эту библиотеку и создаю исполняемый файл, компоновщик удаляет всю эту информацию отладки из библиотеки перед созданием exe-файла, и, следовательно, размер exe меньше, чем у библиотеки.

2.) Когда я отключил опцию «Сохранить отладочную программу», я получил библиотеку, размер которой был меньше, чем конечный исполняемый файл, что, как мне показалось, является нормальным в большинстве ситуаций.

-AD

0 голосов
/ 16 декабря 2008

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

0 голосов
/ 16 декабря 2008

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

0 голосов
/ 16 декабря 2008

Отказ от ответственности : Прошло много времени с тех пор, как я имел дело со статическим связыванием, поэтому примите мой ответ с недоверием.

Вы писали: Я думал, что это должно добавить непосредственно к размеру исполняемого файла, а конечный размер EXE должен быть больше, чем это?

Наивные линкеры работают именно так - назад, когда я занимался хобби-разработкой для систем CP / M (долгое время назад), это была настоящая проблема.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...