LINUX.ORG.RU

История изменений

Исправление devsdc, (текущая версия) :

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

Динамическая линковка в целом работает как-то так: в ассемблерном коде вместо call f происходит call [linked_f], где f - это имя функции, а linked_f - ячейка памяти, куда линкер положит известный только ему адрес загруженной функции f. Если библиотека уже загружена, в linked_f лежит адрес загруженной функции. Если же нет, там лежит адрес некоторой «заглушки», которая вызывает линкер с нужными аргументами, и в итоге происходит загрузка нужной библиотеки. В реальности всё происходит чуть-чуть по-другому, но общая суть та же.

Таким образом, если ни одна функция из библиотеки не была ни разу вызвана, то и библиотека не загрузится. Это иногда даёт выигрыш, например, если загружаемые библиотеки весьма жирные, а программа по каким-то причинам завершилась очень быстро (например, ей передали некорректные аргументы при запуске, и она сразу определила это и завершилась с ошибкой). Но в целом это практически ничего не ускоряет.

Это я всё про линукс, если что. Не знаю, как оно там под виндой.

Исходная версия devsdc, :

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

Динамическая линковка в целом работает как-то так: в ассемблерном коде вместо call f происходит call [linked_f], где f - это имя функции, а linked_f - ячейка памяти, куда линкер складывает известные только ему адреса загруженных функций. Если библиотека уже загружена, в linked_f лежит адрес загруженной функции. Если же нет, там лежит адрес некоторой «заглушки», которая вызывает линкер с нужными аргументами, и в итоге происходит загрузка нужной библиотеки. В реальности всё происходит чуть-чуть по-другому, но общая суть та же.

Таким образом, если ни одна функция из библиотеки не была ни разу вызвана, то и библиотека не загрузится. Это иногда даёт выигрыш, например, если загружаемые библиотеки весьма жирные, а программа по каким-то причинам завершилась очень быстро (например, ей передали некорректные аргументы при запуске, и она сразу определила это и завершилась с ошибкой). Но в целом это практически ничего не ускоряет.

Это я всё про линукс, если что. Не знаю, как оно там под виндой.