В начало → Linux не для идиотов → Статически и динамически собранные программы |
В Linux исполняемые файлы можно условно разделить на две группы – те, которые содержат в себе весь код, необходимые для работы, и те, которым необходимы разделяемые библиотеки. Первые называют статически собранными бинарными файлами, вторые называют динамически собранными исполняемыми файлами.
Статически собранные программы характеризуются тем, что могут корректно функционировать в любых условиях, и не зависят от наличия или отсутствия разделяемых библиотек, что может оказаться полезным в ситуациях, когда возникают конфликты версий разделяемых библиотек, или когда системные библиотеки повреждены или недоступны (например во время восстановления операционной системы после серьезного сбоя). К недостаткам таких исполняемых файлов следует отнести то, что они имеют значительный размер и для обновления программы необходимо полностью заменить ее исполняемый файл – например, если несколько статически собранных программ, которые работают с архивами ZIP, содержат ошибку, то для исправления ошибки необходимо заменить все эти программы, что может быть затруднено (например, будет трудно точно установить, какие именно программы содержат ошибочный код и нуждаются в обновлении). Кроме того, статически собранные программы не умеют совместно использовать совпадающие участки кода, что ведет к излишнему расходу системных ресурсов.
Динамически собранные исполняемые файлы для корректной работы требуют наличия файлов разделяемых библиотек, и соответственно при их отсутствии/повреждении не могут корректно функционировать, но зато для обновления программы и исправления ошибки часто оказывается достаточным просто заменить соответствующую разделяемую библиотеку, после чего ошибка исчезает во всех программах, которые эту библиотеку используют динамически. Динамически связанные программы также значительно меньше по объему, чем статически связанные, и код разделяемых библиотек может использоваться одновременно многими программами – что позволяет экономить системные ресурсы.
Подавляющее большинство программ в современных дистрибутивах Linux являются динамически собранными. Определить тип исполняемого файла (статический ли он либо с динамическим связыванием) можно, например, с помощью команды ldd:
$
ldd /bin/su
linux-gate.so.1 => (0xffffe000) libpam.so.0 => /lib/libpam.so.0 (0x4ce08000) libpam_misc.so.0 => /lib/libpam_misc.so.0 (0x4cb3c000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x4e3a2000) libdl.so.2 => /lib/libdl.so.2 (0x4ca49000) libc.so.6 => /lib/tls/libc.so.6 (0x4c907000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x4c8ee000)$
ldd /sbin/devlabel
not a dynamic executable
В данном случае мы видим, что исполняемый файл /bin/su
использует динамическое связывание, а исполняемый файл /sbin/devlabel
собран статическим образом.
В начало → Linux не для идиотов → Статически и динамически собранные программы |