Prelink/ru

В этом руководстве рассказывается, как использовать поддержку prelink в Portage 2.0.46 и более поздних версиях.

Что такое Prelink и как он может помочь?
В большинстве распространенных приложений используются общие библиотеки. Эти разделяемые библиотеки должны быть загружены в память во время выполнения, при этом различные символьные ссылки должны быть вычислены. Для большинства небольших программ эта динамическая компоновка очень быстрая. Но для программ, написанных на C++ и имеющих множество зависимостей между библиотеками, динамическое связывание может занимать достаточно много времени.

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

Предварительное связывание может сократить время запуска приложений. Например, типичное время загрузки программы KDE можно сократить на целых 50%. Единственное, что необходимо сделать - повторно выполненить prelink каждый раз, когда библиотека обновляется для предварительно связанного исполняемого файла.

Обобщение

 * Prelinking is done via a program called, surprisingly,  . It changes the binary to make it start faster.
 * If an application's dependent libraries change after you have prelinked it, you need to re-prelink the application, otherwise you lose the speed advantage. This is to say, everytime you update a package via portage that updates libraries, they need to be re-prelinked.
 * The change to the binary is fully reversible.  has an undo function.
 * Current versions of Portage can handle, via , the changing MD5sums and mtimes of the binaries.
 * You do not need to set  in your  file; Portage will automatically support prelink if it can find the prelink binary.

Установка программ
First you need to install the  tool. The emerge process automatically verifies that your system can prelink safely.

Ряд людей получают ошибки в при установке prelink из-за неудавшихся тестов. Тесты были введены из соображений безопасности, поведение prelink не предсказуемо, если вы отключите их. Ошибки emerge обычно зависят только от основных пакетов; Binutils, gcc и glibc. Попробуйте повторно пересобрать эти пакеты в этом случае.

Если у вас есть набор шагов, которые приводят к такой же ошибке emerge на другой системе, пожалуйста проверьте Bugzilla и создайте отчет об ошибке, если о ней еще не сообщалось.

Подготовка системы
Также убедитесь, что вы "не" установили -fPIC в «CFLAGS/CXXFLAGS». Если вы это сделали, вам нужно будет полностью пересобрать всю систему без него.

Конфигурация
Запуск  создаст файл, который сообщает , какие файлы должны быть предварительно связаны.

К сожалению, вы не можете предварительно связать файлы, которые были скомпилированы старыми версиями binutils. Большинство таких приложений поставляются только в виде предварительно скомпилированных бинарных пакетов, которые установлены в. Создание следующего файла укажет prelink не пытаться связать их.

Использование Prelink
Я использую следующую команду для связывания всех двоичных файлов в каталогах, заданных.

Задание Cron для Prelink
Установите, а затем установите задание cron в. Чтобы включить его, отредактируйте файл конфигурации. Он будет запускать prelink ежедневно в фоновом режиме, спасая вас от необходимости запуска команды вручную.

Ускорение KDE после предварительного связывания
Время загрузки KDE может быть значительно уменьшено после предварительного связывания. Если вы сообщите KDE, что он был предварительно связан, это отключит загрузку  (поскольку он больше не требуется), что еще больше ускорит KDE.

Установите  в, чтобы сообщить KDE о предварительном связывании.

Удаление prelink
Если вы передумаете использовать предварительное связывание, прежде чем удалять prelink, сначала нужно удалить prelink cronjob из и. Затем вам придется удалить предварительное связывание из всех двоичных файлов:

Наконец, удалите сам пакет :

"Cannot prelink against non-PIC shared library"
Причина этой проблемы связана с плохо скомпилированными разделяемыми библиотеками, которые были скомпилированы без gcc опции -fPIC для всех их объектных файлов.

Библиотеки, которые не были исправлены или не могут быть исправлены:


 * Библиотеки в wine пакете, включая winex. Предварительное связывание в любом случае не ускорит выполнение исполняемых файлов MS Windows.
 * Библиотека в media-video/mjpegtools,.
 * Библиотеки Nvidia OpenGl, . Из соображенияй производительности они были скомпилированы без поддержки PIC.

If your problem library was not listed please report it with, preferably, a patch to add  to the relevant CFLAGS.

Когда я применяю предварительное связывание к моей системе, некоторые статические двоичные файлы больше не работают
Когда дело касается glibc, нет такого понятия, как 100% статический двоичный файл. Если вы статически компилируете двоичный файл с помощью glibc, он все равно может зависеть от других системных файлов. Ниже приводится объяснение Дика Хауэлла (Dick Howell),

"I suppose the idea is that everything will be in the downloaded file, so nothing depends on the local libraries on the target system. Unfortunately with Linux, and I think anything else using GLIBC, this still isn't quite true. There's this "libnss" (name service switch, some people seem to call it network security system) which provides functions for accessing various databases for authentication, network information, and other things. It's supposed to make application programs independent of the separately configured actual network environment of the machine. A nice idea, but changes to GLIBC can lead to problems loading it. And you can't statically link "libnss", since it is configured for each machine individually. The problem comes, I think, mainly from statically linking other GLIBC libraries, notably "libpthread", "libm", and "libc", from which come incompatible calls to "libnss" functions."

Prelink прерывается с "prelink: dso.c: 306: fdopen_dso: Assertion 'j
k' failed." ===

Это известная проблема, любезно диагностированная здесь. Prelink не может справиться с UPX-сжатыми исполняемыми файлами. Начиная с prelink-20021213, нет способа это исправить, кроме как скрыть исполняемые файлы во время предварительного связывания. Смотрите раздел выше для простого способа сделать это.

Я использую grsecurity, и кажется, что предварительное связывание не работает.
Чтобы предварительно связать систему с grsecurity с использованием рандомизированной базы mmap, необходимо включить параметр «randomized mmap base» OFF для. Это можно сделать с помощью утилиты, но это необходимо сделать, когда файл не используется (например, загрузиться с компакт-диска для восстановления).

Prelink падает с ошибкой "prelink: Can't walk directory tree XXXX: Too many levels of symbolic links" ("prelink: не удается обойти дерево каталогов XXXX: слишком много уровней символических ссылок")
Your symlinks are nested too deeply. This happens when a symlink points to itself. For example, is the most common. To fix this, you can find the symlink manually or use the utility provided by the  package:

More details can be found at Bugzilla and this forum post.

Заключение
Prelinking can drastically speed up the start up times for a number of large applications. Support is built into Portage. Prelinking is also safe as you can always undo the prelinking for any binary if you come across any problems. Just remember that when you update glibc or other libraries that you prelinked with, you need to rerun ! In short good luck!