#c #linker #shared-libraries
#c #компоновщик #разделяемые библиотеки
Вопрос:
Я загружаю библиотеку pthread в свою программу, используя dlopen
, и извлекаю обработчики в pthread_create
и pthread_join
используя dlsym
.
Как я могу гарантировать, что оба обработчика имеют совместимую версию? Меня не волнует, принадлежат ли символы новой версии или старым версиям. Я просто хочу, чтобы все, что pthread_create
я использую, хорошо работало с тем pthread_join
, что я получаю.
Я знаю, что есть dlvsym
, которому я могу передать явный номер версии, но меня не волнуют точные номера версий, поскольку я хочу, чтобы мой код не зависел от версий библиотеки.
Комментарии:
1. Я действительно полагаю, что вы можете с уверенностью предположить, что pthread_create и pthread_join, предоставляемые одной библиотекой, будут совместимы.
2. Вопрос в том, вернет ли dlsym совместимые символы. Я не связываюсь с библиотекой в командной строке, скорее использую dlopen и dlsym для извлечения обработчиков.
3. Поздно об этом, но, читая вышесказанное, я задаюсь вопросом — я не понимаю, как использование
dlopen
в отличие от традиционного неявного динамического связывания имеет какое-либо отношение к действительности комментария Эрика — если вы используетеdlopen
для получения дескриптора выбранной вами библиотеки, будьте уверены, что_join
и_create
практически гарантированно будут работать друг с другом, учитывая, что они являются частью одного и того же объекта dynamic library, созданного из исходного кода, где они были разработаны для работы друг с другом?4. Может быть поздно, но вы должны знать, что libpthread — это особый зверь: если ваша программа изначально была скомпилирована / связана без libpthread, она вполне может завершиться неудачей, если вы попытаетесь использовать libpthread во время выполнения (например, из плагина или с dlopen / dlsym).
Ответ №1:
Единственная причина, по которой существует управление версиями, заключается в плохой попытке обеспечения совместимости ABI с программами, скомпилированными на основе древних версий glibc, которые на самом деле все равно не будут работать. (По крайней мере, один раз они незаметно нарушили ABI способом, который, насколько я могу судить, не может быть совместим.) Просто игнорируйте это.
Ответ №2:
Звучит так, как будто вам нужно «dladdr — найти общий объект, содержащий заданный адрес».
Однако, поскольку вы не указали, какую платформу используете, она может быть недоступна.
Взгляните и убедитесь..
Комментарии:
1. Кто-нибудь может мне помочь, как передать «версию» в dlvsym