GCC 5.3 добавил новую опцию: -fno-semantic-interposition
Новая опция -fno-semantic-interposition может быть использована для улучшения кода
качество разделяемых библиотек, где расположение экспортируемых символов
не положено.
Это звучит так, как будто это что-то полезное для проектов C ++, где нельзя использовать взаимозаменяемость по какой-либо причине, но где латентность является проблемой.
Однако описание довольно расплывчато. Кто-нибудь может уточнить, как именно работает эта опция?
-fno-semantic-interposition
может значительно улучшить производительность кода в разделяемых библиотеках, но редко может изменить семантику.
По умолчанию компилятор соблюдает Семантика вставки функции ELF. Короче говоря, любая экспортируемая функция (т.е. любая функция, если она скомпилирована с флагами компилятора по умолчанию) может быть заменена во время выполнения с помощью LD_PRELOAD
или просто разделяемой библиотекой, которая раньше загружалась динамическим компоновщиком. Это препятствует тому, чтобы компилятор сделал много полезных анализов и оптимизаций (особенно встраивание и клонирование), потому что они могут нарушить взаимное расположение.
-fno-semantic-interposition
дает компилятору разрешение игнорировать потенциальную вставку и оптимизировать его более агрессивно.
Как я уже сказал, при использовании -fno-semantic-interposition
:
-fvisibility=hidden
и явно аннотировать все экспортируемые символы с __attribute__((visibility("default")))
)Первый пункт препятствует широкому распространению fno-semantic-interposition
, Например. Насколько мне известно, ни один Linux дистрибутив не использует его в широких масштабах (кстати, это был бы отличный проект).
Других решений пока нет …