управление версиями символов и dlsym

#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