2009-06-20 7 views

ответ

10

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

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

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

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

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

+1

Спасибо за отличный ответ. Но почему это так сложно? –

+2

ELF Statfier загружает исполняемый файл и все его библиотеки, а затем берет снимок памяти процесса. Когда выполняется выходное изображение, все, что может привести к изменению макета памяти (например, рандомизированное VDSO), приведет к неправильной работе. Любой другой подход требует повторного создания динамического компоновщика. – ephemient

+1

Почему было бы сложно переопределить динамический компоновщик? Разве есть не две таблицы импорта и экспорта библиотеки, которые нужно переместить? Это компоновщик, поэтому он уже внедряет статический компоновщик и знает формат файла исполняемого файла и динамической библиотеки и т. Д. – ChrisW

6

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

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

+0

Спасибо, исправлено 'compile' to 'link'. –

2

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

1

Другой вариант: Ermine (http://magicErmine.com) Это как статор, но способный справляться с рандомизацией памяти.

+0

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