Может ли самоизменяющийся код использоваться для ускорения вызова функций в динамически связанных библиотеках?
Насколько я понимаю, разделяемые библиотеки ELF используют своего рода таблицу косвенных переходов (таблица связывания процедур или PLT), чтобы обеспечить ленивое связывание библиотечных функций. Похоже, что цель состоит в том, чтобы избежать необходимости изменять таблицу в сегменте кода, в то же время позволяя лениво разрешать позиции функций при первом вызове.
Разве не было бы быстрее динамически создать код для этой таблицы во время загрузки или, возможно, даже при первом вызове функции?
Позволяет ли максимально разделять сегмент кода между процессами (динамическая таблица была бы приватной для процесса)? Это из соображений безопасности (доступный для записи код не должен быть исполняемым - но JIT делают это постоянно, а загрузчик может добавлять и удалять разрешение на запись перед тем, как запустить программу)?
Или это их комбинация, и небольшой прирост производительности на вызов функции просто не стоит усилий?
DSO ELF могут использовать флаг (DF_TEXREL), чтобы объявить, что им требуется перераспределение путем изменения их текстового раздела (который обычно доступен только для чтения). Подход таблицы переходов вместе с независимым от PIE кодом должен быть более оптимальным.
(Обнаружено, что в http://www.akkadia.org/drepper/dsohowto.pdf , но другие ресурсы упоминают об этом тоже).
источник