Спільні бібліотеки ELF - мотивація для PLT


11

Чи може самостійно змінювати код для прискорення виклику функцій у динамічно пов'язаних бібліотеках?

Наскільки я розумію, бібліотеки спільного використання ELF використовують своєрідну таблицю непрямих стрибків (таблиця зв’язків процедур або PLT), щоб увімкнути ледачі зв'язування функцій бібліотеки. Здається, мета полягає у тому, щоб уникнути необхідності змінювати таблицю в кодовому сегменті, одночасно дозволяючи ледаче вирішення функціональних позицій під час першого дзвінка.

Чи не було б швидше динамічно створити код для цієї таблиці під час завантаження або, можливо, навіть під час першого виклику функції?

Чи варто максимально дозволити обмін сегментом коду між процесами (динамічна таблиця буде приватною для процесу)? Це з міркувань безпеки (код для запису не повинен бути виконуваним - але JIT роблять це постійно, і дозвіл на запис може бути доданий і видалений завантажувачем перед тим, як реально запустити програму)?

Або це комбінація таких, і невеликий приріст продуктивності на виклик функції просто не вартує зусиль?

Відповіді:


8

Я думаю, ми говоримо про архітектуру x86.

У захищеному режимі ви не можете мати самомодифицирующийся код , який використовується більшості операційних систем на базі UNIX (і не тільки), про які я знаю, оскільки сегменти коду завжди доступні лише для читання. Навантажувач не контролює це - це те, що обробляється підсистемою управління пам'яттю ядра.

Але навіть якби ви могли "створити код для цієї таблиці під час завантаження", як ви кажете, це не спричинило б цілі цілі спільних бібліотек. Таким чином, кожен процес мав би "приватну" копію функцій бібліотеки у своєму адресному просторі, ефективно збільшуючи слід пам'яті - однією з причин створення спільних бібліотек було вирішення цього питання.

Весь процес, який ви описуєте, є досить складним, і це коштуватиме більше циклів обробки, ніж метод PLT, який застосовується сьогодні, і, ймовірно, вніс би нові, нові та цікаві проблеми безпеки.


2
Ви можете використовувати системний виклик mprotect (2), щоб зробити сторінки сегменту .text написаними та виконуваними.
Брюс Едігер

1
Це правильно, сер. Ймовірно, це працювало б пристойно в середній системі на основі UNIX, але весь процес зв'язування порушиться, як тільки хтось спробує посилити систему, наприклад, PaX, який застосовує обмеження на mprotect (2).
dkaragasidis

(Здається, я пропустив згадати @BruceEdiger у своєму попередньому коментарі)
dkaragasidis

1

ELSO DSO можуть використовувати прапор (DF_TEXREL), щоб оголосити, що їм потрібні передислокації, змінивши їх текстовий розділ (який, як правило, доступний лише для читання). Підхід до таблиці стрибків разом із незалежним кодом позиції PIE повинен бути більш оптимальним.

(Виявлено, що в http://www.akkadia.org/drepper/dsohowto.pdf , але інші ресурси також згадують про це).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.