Вопрос по linux, c – Нужны ли статические библиотеки для статической ссылки?

9

На 'C', Linux,

Мне нужны статические библиотеки для статической ссылки или общих, которые у меня есть? Если нет, то почему нет? (Разве они не содержат одинаковые данные?)

Ваш Ответ

4   ответа
11

вам нужны статические библиотеки для создания статически связанного исполняемого файла.

иблиотеки @Static - это пакеты скомпилированных объектов. Когда вы статически связываетесь с библиотекой, это практически то же самое, что брать результаты компиляции этой библиотеки, распаковывать их в текущем проекте и использовать их, как если бы они были вашими собственными объектами.

Динамические библиотеки уже связаны. Это означает, что некоторая информация, такая как перемещение, уже исправлена и выброшена.

Кроме того, динамические библиотеки должны быть скомпилированы как позиционно-независимый код. Это не является ограничением для статических библиотек и приводит к значительной разнице в производительности на некоторых распространенных платформах (например, x86).

Существуют такие инструменты, какELF Statifier которые пытаются объединить динамически связанные библиотеки в динамически связанный исполняемый файл, но при любых обстоятельствах очень трудно получить правильно работающий результат.

Операции статического компоновщика (во время компиляции) и динамического компоновщика (во время выполнения) сильно различаются. Статический компоновщик переписывает ссылки на символы в объектах на фиксированные ссылки - либо на перемещенный символ в том же изображении, либо на заглушку, которая переходит к правильной записи в таблице символов. Динамический компоновщик открывает файлы и сопоставляет их с определенными правилами с различными частями памяти, заполняет таблицы символов и затем переходит к инициализации кода. ephemient
ELF Statfier загружает исполняемый файл и все его библиотеки, а затем делает снимок памяти процесса. Когда запускается выходное изображение, все, что может привести к изменению структуры памяти (например, рандомизированное VDSO), приведет к неправильной работе. Любой другой подход требует переизобретения динамического компоновщика. ephemient
Спасибо за отличный ответ. Но почему это так сложно? Liran Orevi
Когда действует -bstatic, общие объекты статически связаны в выходной файл. Когда действует -bdynamic, общие объекты динамически связаны. (AIX) Ibm.com / поддержка / knowledgecenter / SSGH4D_14.1.0 / ... nahzor
Почему трудно переопределить динамический компоновщик? Разве нет двух таблиц импорта и экспорта библиотеки, которые нужно переместить? Это компоновщик, поэтому он уже реализует статический компоновщик и знает формат файла исполняемого файла и динамической библиотеки и т. Д. ChrisW
6

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

Статические и динамические библиотеки могут содержать или не содержать одну и ту же информацию, в зависимости от множества факторов. Решение о том, стоит ли статически или динамически связывать ваш код, является важным и часто влияет на архитектуру приложения.

Спасибо, исправлено "compile" в "link". Liran Orevi
2

на которые вы ссылаетесь в статически связанной программе, должны быть статическими. Хотя динамическая (libfoo.so) и статическая (libfoo.a) библиотеки имеют одинаковые функции, они представляют собой файлы разных форматов, поэтому вам необходим соответствующий тип для вашей программы.

1

http: //magicErmine.co) Это как стабилизатор, но может справиться с рандомизацией памяти.

Отличный продукт, спасибо. Liran Orevi

Похожие вопросы