Pull to refresh

Comments 9

Все хорошо, только записи в PLT традиционно называют «трамплином» а не «батутом».
Получается для вызова ф-ций static из библиотеки, PLT не требуется, достаточно только GOT?
Если функция из библиотеки вызывает static функцию из библиотеки, то даже GOT не нужен, на сколько я понимаю. Достаточно offset-а до функции, а он известен.
на x86 все-таки наверно нужен будет, иначе переменные тоже адресовались offset'ом

Переменные в другой секции лежат.

Не могли бы подробнее пояснить, почему в таком случае не требуется got и plt. Я не вижу разницы между static и рассмотренной в статье функцией. Для call ведь по-прежнему требуется абсолютный адрес, а его без got в случае pic не получить.

Отвечу сам же. Инструкция call использует относительный адрес, а не абсолютный, как я считал выше. В случае вызова static функции линкеру нет смысла делать релокацию, т.к. функция внутренняя и ее расположение известно по смещению. Если же функция не static, то линкер создаст для нее релокацию, причины лежат в LD_PRELOAD и в глобальном переопределении внешних символов динамическим линкером.

Насчёт безопасности — есть же mprotect, чисто технически линкер может изменить права доступа к секции кода на более строгие после релокации. Что до производительности — позиционнонезависимый код получается чуть более медленным из-за дополнительных операций, так что долгоживущим процессам может быть таки выгоднее потупить на загрузке. Вот по памяти выигрыш получается, да, с другой стороны данных обычно на порядок больше, чем кода...

Sign up to leave a comment.