Есть ли способ определить, была ли библиотека статически связана во время выполнения?
У меня есть ситуация, когда я распространяю библиотеку, которая использует взаимное расположение символов, чтобы иметь дело с некоторыми 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
в настоящее время доступен? Таким образом, я могу создать одну библиотеку, которая работает в обоих контекстах.