2015-01-01 1 views
1

Если вы читали описание stali, он упоминает о статически связанные бинарные файлы:Как статически связанные двоичные файлы могут быть меньше динамически связанных двоичных файлов? Размер

Он также нацелен на сокращение двоичного размера путем избежания Glibc и других раздутых библиотек GNU, где это возможно (ранние эксперименты показывают , что статически связанные двоичные файлы обычно меньше, чем их динамически связанных аналогов glibc !!!).

Я не понимаю, как в том числе библиотеки в двоичном сам сделает двоичная меньше, чем в двоичном с включенными библиотеки (Может быть, есть что-то я пропускаю о statically vs dynamically linked).

Как это возможно? Это происходит только в некоторых конкретных ситуациях?

ответ

1

Я не понимаю, как в том числе библиотеки в двоичном сам сделает двоичная меньше, чем в двоичном с библиотеками включены

Существует определенная накладных расходов, что связано с использованием динамического связывания: например, вам нужны .dynsym, .dynstr, .got и .plt разделы для импорта символов от libc.so.6.

Однако, если основной исполняемый файл не связан с -rdynamic, размеры этих «служебных» разделов обычно довольно малы, поэтому утверждение о том, что полностью статическое двоичное число меньше, выглядит довольно сомнительным.

1

Если вы используете статическое связывание, компоновщик может выкинуть символы, которые не используются.

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

В случае динамической компоновки это невозможно, поскольку компоновщик/компилятор не может знать, что будет использоваться при создании библиотеки.

Кроме того, динамическое связывание является прекрасным источником ошибок (например, segfaulting, потому что новая библиотека несовместима), чего можно избежать, связывая статически.

Дополнительная информация: http://harmful.cat-v.org/software/dynamic-linking/