Добавит ли параметр -rdynamic linker значение gcc/g++?

Я хочу получить трассировку стека при сбое приложения. Я понимаю, что параметр -rdynamic позволяет получить полную трассировку стека с именами функций. Но меня беспокоит, будет ли какое-либо влияние на производительность моего приложения.

Ответ 1

Да, есть, хотя это очень специфично и обычно не вызывает беспокойства.

Параметр -rdynamic указывает компоновщику добавлять символы в таблицы символов, которые обычно не требуются во время выполнения. Это означает, что есть больше, возможно, намного больше символов, которые динамический компоновщик должен просачиваться во время выполнения для разрешения символа.

В частности, поскольку поиск таблиц символов в системах на основе GNU реализуется с использованием хэша, наличие большего количества символов увеличивает вероятность возникновения хеш-коллизий. Поскольку все симломы, которые сталкиваются в хэш-таблице, сидят в списке, компоновщик времени выполнения должен пересекать список и сравнивать, используя memcmp, каждое имя символа. Наличие большего количества символов в хеш-символе означает наличие более длинных списков, поэтому для разрешения каждого динамического символа потребуется больше времени.

Эта ситуация немного хуже для С++, затем C, с множеством идентично префиксных имен символов из-за имен классов.

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

В редких случаях, когда ваше приложение велико, трюки, такие как prelinking, могут быть использованы для преодоления накладных расходов.