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