проверка версии библиотеки C (динамическая загрузка) - PullRequest
3 голосов
/ 25 мая 2011

У меня есть программа, которая требует определенных версий библиотек (например, libgstreamer), и поэтому более старая версия не будет работать.Из-за ленивых ссылок моя программа может связываться с версией gstreamer 10.23, в которой отсутствуют некоторые символы, присутствующие в 10.25, которые я использую.У меня вопрос, как я могу проверить, какая версия библиотеки установлена, без использования диспетчера пакетов.Возможно ли загрузить библиотеку из программы на C и проверить номер ее версии, используя dlopen ()?

Редактировать: я работаю в системе Linux

Редактировать 2: Возможно, я смогуиспользовать readelf -V?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Мой вопрос: как я могу проверить, какая версия библиотеки установлена, не используя для этого менеджер пакетов?

Во-первых, обратите внимание, что обычный и принятый механизмобрабатывать это в Linux именно для того, чтобы диспетчер пакетов проверил это - это одна из основных причин, по которой они были изобретены.

Другой распространенный вариант - это проверить ваш скрипт configure или Makefile при сборке изsource.

Если вы хотите предоставить предварительно скомпилированные двоичные файлы, но не используете менеджер пакетов, я считаю, что лучший механизм - это проверить, есть ли в библиотеке какой-то внутренний механизм для извлечения своей версии во время выполнения.К сожалению, это специфично для каждой библиотеки, с которой вы ссылаетесь.

GStreamer, к счастью, имеет это:

void gst_version(guint *major, guint *minor, guint *micro, guint *nano);
Gets the version number of the GStreamer library.

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstVersion.html

Вы можете просто вызвать эту функцию при запуске, ивыручите, если версия не в порядке.

Тем не менее, я бы настоятельно рекомендовал вам не использовать менеджер пакетов.Это действительно самый безболезненный механизм, который позволяет справиться с этим, а также позволяет легко устанавливать его пользователям (если вы предоставляете репозиторий).

2 голосов
/ 25 мая 2011

Конечно, используйте функции dlopen и dlsym, чтобы загрузить библиотеку и проверить наличие символов, от которых вы зависите. Для получения подробной информации и примера кода см. Справочную страницу: http://linux.die.net/man/3/dlopen

0 голосов
/ 25 мая 2011

Попробуйте использовать ltrace или strace

ltrace -f -e dlopen ./<theapp>
strace ./<theapp> 2>&1| grep 'dlopen.*'

PS! Сам не проверял

...