Comments 9
Не могли бы подробнее пояснить, почему в таком случае не требуется got и plt. Я не вижу разницы между static и рассмотренной в статье функцией. Для call ведь по-прежнему требуется абсолютный адрес, а его без got в случае pic не получить.
Отвечу сам же. Инструкция call использует относительный адрес, а не абсолютный, как я считал выше. В случае вызова static функции линкеру нет смысла делать релокацию, т.к. функция внутренняя и ее расположение известно по смещению. Если же функция не static, то линкер создаст для нее релокацию, причины лежат в LD_PRELOAD и в глобальном переопределении внешних символов динамическим линкером.
Насчёт безопасности — есть же mprotect, чисто технически линкер может изменить права доступа к секции кода на более строгие после релокации. Что до производительности — позиционнонезависимый код получается чуть более медленным из-за дополнительных операций, так что долгоживущим процессам может быть таки выгоднее потупить на загрузке. Вот по памяти выигрыш получается, да, с другой стороны данных обычно на порядок больше, чем кода...
Position-independent code (PIC) в разделяемых библиотеках