Диспетчеризация динамической ссылки во время загрузки

Мне бы хотелось, чтобы мое приложение Windows могло ссылаться на обширный набор классов и функций, обернутых внутри DLL, но мне нужно иметь возможность указывать приложению правильную версию этой DLL до ее загрузки. Я знаком с использованием dllexport / dllimport и генерацией библиотек импорта для выполнения динамического связывания во время загрузки, но я не могу найти какую-либо информацию о веб-сетях относительно возможного нахождения некоторой функции точки входа в самой библиотеке импорта, поэтому Я могу, в частности, использовать CPUID для определения конфигурации центрального процессора и принять решение загрузить определенную DLL на основе этой информации. Более конкретно, я хотел бы построить 2 версии DLL, одну из которых /ARCH:AVX и в полной мере использует инструкции SSE — AVX, а другая, которая предполагает, что ничего не доступно, более новая, чем SSE2.

Одно требование: либо библиотека DLL должна быть связана во время загрузки, либо должен быть очень простой способ ручной привязки функций, на которые ссылаются извне библиотеки DLL, и существует множество, в основном, заключенных в классы.

Дополнительный вопрос: поскольку мои библиотеки будут кроссплатформенными, существует ли эквивалент для общих объектов на основе Linux?

2

Решение

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

Возможное решение

Создайте процесс выбора, который представляет необходимый пользовательский интерфейс для решения, какая DLL вам нужна, или, может быть, он даже может определить ее автоматически. Позвольте этому процессу переместить любую выбранную DLL в стандартное место (и имя), которое ожидает ваш главный исполняемый файл. Затем пусть процесс выбора запускает ваш главный исполняемый файл; он возьмет свою DLL из вашего стандартного местоположения, не зная, какая версия DLL там. Без задержки загрузки, без неожиданностей, без дополнительного кодирования; очень просто.

Если это просто не вариант для вас, то вот ваши отправные точки для отложенной загрузки DLL. Это гораздо каменистая дорога.

Windows

Linux

1

Другие решения

Чтобы добавить ответ qexyn, можно имитировать задержку загрузки в Linux, создав небольшую статическую библиотеку-заглушку, которая бы dlopen при первом вызове любой из его функций, а затем перенаправить фактическое выполнение в разделяемую библиотеку. Генерация такой библиотеки-заглушки может быть автоматически сгенерирована с помощью специального скрипта для конкретного проекта или Implib.so:

# Generate stub
$ implib-gen.py libxyz.so
# Link it instead of -lxyz
$ gcc myapp.c libxyz.tramp.S libxyz.init.c
0