Задать вопрос
@makaleks

Как изменять область видимости символов в CMake или Visual Studio?

История старая - плагины. Одинаковый интерфейс, разные реализации. Си-ABI, использование в плагинах чего-либо вне возможностей стандартной библиотеки не ожидается.

Разделяемые/динамические библиотеки, подгружаемые во время выполнения работают без проблем.

Но дело в том, что мне нужно иметь возможность включать в стандартную сборку некоторый минимальный набор плагинов, так сказать, то, что доступно по-умолчанию. Набор плагинов, встроенных в бинарник. С одной стороны, это должна быть статическая линковка, с другой - конфликт символов неизбежен. Linux молодец, в Linux есть objcopy --localize-symbol <symbol> <file>, так что я успешно смог сделать в отдельном файле функцию-прокси с уникальным именем, слинковать в одну единицу трансляции (ld --relocate impl1.o proxy1.o -o lib1.o) и сделать в этом франкенштейне все символы плагина статическими, оставив наружу только уникальное имя прокси.

Я не могу найти, как сделать такое в Windows. Изначально искал, как можно это сделать с помощью CMake, не нашёл, но вдруг кто знает - было бы идеально.

Вопрос: как скрыть от линковщика символы средствами Windows, а лучше CMake? Или как иначе нужно подходить к этой проблеме и почему только так?

Сразу мои варианты других подходов к проблеме и оправдания, почему не они:
  • Существует вариант притащить в винду Linux-стэк в виде каких-нибудь MinGW, Cygwin. Или продать душу clang и использовать llvm-objcopy. Но это дополнительные установки и настройки и не совсем кроссплатформенность, к тому же трудозатратно для разработчика плагина.
  • Возможно стоит уйти в кодогенерацию: задекларировать интерфейс и обязать разработчика плагина сообщать, какая функция какой интерфейс реализует. Проблема - наивная надежда, что символы разных разработчиков плагинов будут уникальны.


Спасибо
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 2
gbg
@gbg
Любые ответы на любые вопросы
Оверинжинеринг прямо на лице.

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

Покритиковал, теперь предлагаю:
Сделайте у каждого плагина функцию - экспортер уникальной, но опознаваемой. При загрузке плагина, сливайте список экспортируемых функций из DLL, парсите его хоть регуляркой и находите точку входа.
Ответ написан
@makaleks Автор вопроса
01.2022. Пока ограничиваюсь llvm, с такими шагами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы