Прямая привязка
Прямая привязка — это функция компоновщика и динамического компоновщика в Solaris и OpenSolaris . Он предоставляет метод, позволяющий библиотекам напрямую связывать символы с другими библиотеками, а не слабо привязываться к ним и предоставлять динамическому компоновщику возможность выяснить, какая библиотека содержит символ.
Теория
[ редактировать ]При связывании общей библиотеки или динамически связанного исполняемого файла компоновщик обычно заполняет таблицу символов для этой библиотеки всеми необходимыми символами. Он добавляет символы в текущий объект с их смещением и оставляет неопределенные символы в объекте неразрешенными. Неразрешенные символы по-прежнему должны быть известны во время компоновки, но компоновщику передаются общие библиотеки для связывания, и когда он находит символ в другой библиотеке, он помещает в выходную библиотеку примечание, указывающее, что он зависит от этих других общих библиотек.
Этот вид слабого связывания заставляет динамический компоновщик решать, какая библиотека какой символ содержит, при запуске исполняемого файла. Например, динамический компоновщик в Linux считывает раздел DT_NEEDED объекта ELF и загружает необходимые библиотеки; но не сообщается, где находятся необходимые символы. Для этого он должен перебрать каждый неразрешенный символ в объекте и для каждого из них перебрать каждую загруженную библиотеку, проверяя, пока не найдет соответствующий символ. Это может занять много времени.
Прямая ссылка решает эту проблему, сохраняя эквивалентный список указателей на записи DT_NEEDED в отдельном разделе ELF. Каждый указатель соответствует символу в объекте; таким образом, эти указатели создают связь между символом и записью DT_NEEDED. Это позволяет компоновщику найти библиотеку, указанную в конкретной записи DT_NEEDED, и проверять только ее таблицу символов для каждого символа, а не перебирать потенциально каждую библиотеку для каждого символа.