Обязательно динамически связанные библиотеки - PullRequest
3 голосов
/ 14 марта 2011

Из книги ( Экспертное программирование: глубокие секреты C "Питера Ван Дер Линдена ) я узнал, что существуют специальные библиотеки, для которых динамическое связывание является обязательным; что это за библиотеки и почему они являются обязательнымидинамически связаны? (более конкретно в системе GNU / Linux)

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Что это за библиотеки

Все системы UNIX гарантируют обратную совместимость; то есть двоичный файл, построенный на более старой системе, продолжит работать и на более новой системе. Но эта гарантия предоставляется только для двоичных файлов, которые связываются с system библиотеками динамически .

почему они обязательно динамически связаны

Ограничение действует, поскольку программы уровня пользователя обычно не выполняют прямые системные вызовы, а вызывают процедуры-оболочки libc. Таким образом, поставщик UNIX может вносить несовместимые изменения в интерфейс системного вызова (например, для исправления ошибки) при условии, что также обновлена ​​системная библиотека. Обычно такие изменения происходят только при обновлении до новой версии ОС, например от Solaris 2,6 до 2,7.

Изображение в Linux даже более сложное, чем то, что я описал выше, потому что одна версия glibc состоит из более чем 200 отдельных двоичных файлов, которые должны точно соответствовать . Связывание одного такого фрагмента статически, а затем запуск в системе, где другие фрагменты не совпадают, приведет к непредсказуемым результатам; часто авария где-то в libc.

Резюме: никогда статически связывать системные библиотеки UNIX с исполняемыми файлами, если только вы не знаете, что делаете, и у вас есть очень веская причина для этого.

1 голос
/ 14 марта 2011

POSIX позволяет, чтобы функции dlopen и dlsym работали, как требуется, в зависимости от условий сборки, определенных реализацией, и обычно это либо условия, что программа должна быть динамически связана, либо, если она статически связана, что будет использоваться эквивалент опции компоновщика -rdynamic.Поэтому вполне возможно, что некоторые библиотеки, которые зависят от динамически загружаемых модулей, могут работать только в программах с динамической связью, в зависимости от вашей ОС.

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

Следует также отметить, что у glibc есть ряд проблем со статическим связыванием.Даже при статической привязке программы, использующие glibc, динамически загружают библиотеки libnss_*.so для обработки файла passwd / поиска NIS / DNS / и т. Д.В glibc также есть периодические сбои поддержки статической компоновки.Например, я недавно столкнулся со сбоями в функции glibc, которые должны были знать pid / tid из-за того, что дескриптор потока для основного потока не был должным образом инициализирован в статически связанном двоичном файле.Если вы хотите использовать статическую линковку в Linux, я настоятельно рекомендую выбрать не-glibc libc.

...