Динамический линкер Redox: PLT-релокации перенесены до проверки символа

19.07.2026

В динамическом линкере Redox исправлен порядок релокаций PLT: они теперь выполняются до проверки, принадлежит ли символ самому загружаемому объекту. Из-за прежнего порядка динамически связанные программы могли получать неверные адреса.

Что такое PLT и почему порядок важен

PLT — таблица переходов, через которую программа обращается к функциям из динамической библиотеки. При первом вызове вместо самой функции выполняется переходник из PLT, который запускает поиск настоящего адреса и записывает его в GOT.

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

Что это означало на практике

Программа, собранная динамически против Redox, могла упасть при вызове внешней функции — то есть при первом же обращении к printf, malloc или любой другой функции из libc.so. Ошибка выглядела как повреждение памяти, хотя к памяти отношения не имела, и по симптому была почти неотличима от настоящей ошибки в программе.

Почему это касается разработчика на Rust

По умолчанию Rust собирает статически, и на Redox этот дефект его не касался. Но если программа линкуется динамически — а это иногда нужно для совместного использования библиотек, — неверные адреса в таблице переходов ломали её независимо от языка. Правка в динамическом линкере помогает всем, кто собирает динамические бинарные файлы, и в том числе крейты с готовыми артефактами.

Оригинал

Коммит Fix ld.so PLT relocations by relocating lazily before is_me check от 19 июля 2026 года в репозитории redox-os/relibc

Упоминаний: 1 · Просмотров: 2