Информация, которая будет встроена в общую библиотеку Linux - PullRequest
2 голосов
/ 12 февраля 2010

У меня есть две общие библиотеки в Linux, которые при сборке идентичны во всех отношениях, за исключением того, что одна из функций, предоставляемая каждой из них, имеет другой интерфейс (одна принимает некоторые типы массивов сторонних производителей, а другая - строки). Я могу собрать обе версии совместно используемой библиотеки, и мне было интересно, есть ли способ вставить метаинформацию в саму разделяемую библиотеку (очень похоже на то, как вы можете вставлять комментарии / название компании / и т. Д. Во время сборки в DLL) , который может быть запрошен во время выполнения).

Я не хочу называть два вида файлов .so по-разному, потому что они на самом деле одно и то же, и они являются взаимозаменяемыми частями большей системы. Мне нужен мой код, который выполняет dlopen и dlsym в библиотеке, чтобы знать, какой это вариант, чтобы у него был правильный интерфейс.

Глупый способ, которым я сейчас занимаюсь, - это добавить функцию no-op под названием «Flavor_A» в одном и «Flavor_B» в другом. Затем я делаю Flavor_A или Flavor_B, чтобы проверить, с какой общей библиотекой я имею дело. Если я верну NULL, я знаю, что Flavor_X не существует, и в этом случае это должен быть другой вариант.

Я полагаю, должен быть лучший способ. Вот почему я здесь.

У кого-нибудь есть предложения о том, как встроить некоторую информацию, запрашиваемую во время выполнения, в сам двоичный файл .so?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 12 февраля 2010

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

FLAVOR getFlavor()
{
#ifdef FLAVOR_A
    return Flavor_A;
#else
    return Flavor_B;
#endif
}

Вы также можете напрямую экспортировать переменную, которая имеет правильный вид;

extern FLAVOR flavor = 
#ifdef FLAVOR_A
    Flavor_A;
#else
    Flavor_B;
#endif

Для последнего вы бы получили доступ к переменной следующим образом:

*(FLAVOR *)dlsym(lib, "flavor")
1 голос
/ 12 февраля 2010

Вы можете добавить произвольные разделы комментариев и т. Д. В двоичный файл ELF с помощью сценария компоновщика. Они не будут использоваться компоновщиком во время выполнения, но могут содержать такую ​​информацию, как данные сборки. GCC по умолчанию добавляет несколько слов, чтобы сказать, какая версия использовалась (например, .gnu.version).

Используйте objdump для проверки или выгрузки их.

1 голос
/ 12 февраля 2010

Почему бы вам не добавить метод GetFlavor / GetVersion, который позволит вам узнать, какой это вариант / версия?

0 голосов
/ 12 февраля 2010

Это лучший способ.Не существует стандартизированного способа поместить что-либо в .so, кроме символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...