Badoo corporate blog
System Programming
Compilers
C
Development for Linux
Comments 9
+6
Все хорошо, только записи в PLT традиционно называют «трамплином» а не «батутом».
0
Получается для вызова ф-ций static из библиотеки, PLT не требуется, достаточно только GOT?
0
Если функция из библиотеки вызывает static функцию из библиотеки, то даже GOT не нужен, на сколько я понимаю. Достаточно offset-а до функции, а он известен.
0
на x86 все-таки наверно нужен будет, иначе переменные тоже адресовались offset'ом
0

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

0

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

0

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

Only those users with full accounts are able to leave comments. , please.