Есть ли способ определить, была ли библиотека статически связана во время выполнения?

У меня есть ситуация, когда я распространяю библиотеку, которая использует взаимное расположение символов, чтобы иметь дело с некоторыми stdlib.h функции, например, malloc, Я бы обычно просто использовал стандарт psymbol = dlsym(RTDL_NEXT,"symbol") Техника, как описано здесь.

У меня есть пользователи, которые хотят создавать статически связанные двоичные файлы, и RTLD_NEXT не действует в этом контексте ---dlsym в этом контексте не просто происходит сбой, он завершается с RTLD_NEXT, используемым в коде, который не загружается динамически. Я могу заставить этих пользователей использовать -Wl,--wrap,symbol методологии, описанной здесь, и предоставить соответствующие __real_symbol,_wrap_symbol пара, так как они используют pkg-config в любом случае, чтобы связаться с моей библиотекой.

Было бы хорошо, чтобы я всегда использовал решение для компоновки компоновщика, однако у меня есть проблема, когда одна из моих дополнительных библиотечных зависимостей (Open MPI) также пытается обернуть те же символы, но использует RTLD_NEXT подход --- это, кажется, имеет приоритет над ld вариант обтекания.

Я, конечно, могу реализовать оба варианта, и статически выбрать dlsym подход, когда Open MPI настроен (Open MPI предотвращает -static ссылки в любом случае). Проблема в том, что я не уверен, что это будет единственная библиотека, которая пытается вставить мои символы.

Есть ли способ, которым я могу скомпилировать оба варианта в моей библиотеке (то есть, __real_symbol а также __wrap_symbol для -static ссылка и symbol а также *psymbol за dlsym), заставить -Wl,--wrap,symbol флаги при статическом связывании (через pkg-config --static --cflags) и динамически проверять, RTLD_NEXT в настоящее время доступен? Таким образом, я могу создать одну библиотеку, которая работает в обоих контекстах.

0 ответов

Другие вопросы по тегам