В 'C', Linux,Нужно ли статическим библиотекам статически связывать?
Нужны ли мне статические библиотеки для статической ссылки или общие для меня? Если нет, почему бы и нет? (Не содержат ли они одни и те же данные?)
В 'C', Linux,Нужно ли статическим библиотекам статически связывать?
Нужны ли мне статические библиотеки для статической ссылки или общие для меня? Если нет, почему бы и нет? (Не содержат ли они одни и те же данные?)
Да, вам нужны статические библиотеки для создания статически связанного исполняемого файла.
Статические библиотеки - это связки скомпилированных объектов. Когда вы статически связываетесь с библиотекой, это фактически то же самое, что и результаты компиляции этой библиотеки, распаковка их в вашем текущем проекте и использование их, как если бы они были вашими собственными объектами.
Динамические библиотеки уже связаны. Это означает, что некоторая информация, такая как перемещение, уже была исправлена и выброшена.
Кроме того, динамические библиотеки должны быть скомпилированы как независимый от позиции код. Это не является ограничением для статических библиотек и приводит к существенной разнице в производительности на некоторых распространенных платформах (например, x86).
Существуют такие инструменты, как ELF Statifier, которые пытаются объединить динамически связанные библиотеки в динамически связанный исполняемый файл, но очень сложно создать корректно работающий результат при любых обстоятельствах.
Нет такой вещи, как статическая компиляция, только статическая привязка. И для этого вам нужны статические библиотеки. Разница между статическим и динамическим связыванием заключается в том, что с первым именами решаются во время соединения (сразу после компиляции), но с последним они разрешаются так же, как запускается программа.
Статические и динамические библиотеки могут содержать или не содержать одну и ту же информацию, в зависимости от множества факторов. Решение о том, статически или динамически связывать ваш код, является важным и часто влияет на архитектуру приложения.
Спасибо, исправлено 'compile' to 'link'. –
Все библиотеки, на которые вы ссылаетесь в статически связанной программе, должны быть статическим вариантом. Хотя динамические библиотеки (libfoo.so) и static (libfoo.a) имеют в них одни и те же функции, они представляют собой разные файлы форматов, поэтому вам нужен соответствующий тип для вашей программы.
Другой вариант: Ermine (http://magicErmine.com) Это как статор, но способный справляться с рандомизацией памяти.
Отличный продукт, спасибо. –
Спасибо за отличный ответ. Но почему это так сложно? –
ELF Statfier загружает исполняемый файл и все его библиотеки, а затем берет снимок памяти процесса. Когда выполняется выходное изображение, все, что может привести к изменению макета памяти (например, рандомизированное VDSO), приведет к неправильной работе. Любой другой подход требует повторного создания динамического компоновщика. – ephemient
Почему было бы сложно переопределить динамический компоновщик? Разве есть не две таблицы импорта и экспорта библиотеки, которые нужно переместить? Это компоновщик, поэтому он уже внедряет статический компоновщик и знает формат файла исполняемого файла и динамической библиотеки и т. Д. – ChrisW