#c #linker #shared-libraries #wrapper #dynamic-linking
#c #компоновщик #разделяемые библиотеки #оболочка #динамическое связывание
Вопрос:
Предположим, у меня есть две библиотеки libA.so
и libB.so
несколько общих библиотек C.
A предоставляет функции — F1, F2, F3
B предоставляет функции — F2, F3, F4
Моя проблема: создайте тонкую библиотеку-оболочку, libC.so
, которая вызывает F1 и F2 из libA.so
и F3 и F4 из libB.so
.
Один из известных мне методов — написать функцию с той же сигнатурой на C.c и использовать dlopen
внутри функций для вызова libA.so
или libB.so
, соответственно.
Но эта проблема кажется чем-то, что должно быть возможно решить без написания какого-либо дополнительного кода и просто с помощью инструментов компоновщика для перенаправления функций в соответствующие библиотеки.
Действительно ли возможно создать такую библиотеку libC.so
с помощью каких-либо автоматизированных инструментов?
Это кажется достаточно простой проблемой, о которой другие, должно быть, думали до меня, но я не могу понять, как автоматически создать такую библиотеку, и не могу найти хороших ресурсов для автоматических создателей оболочек.
Комментарии:
1. На самом деле, канонический способ сделать это — первый, который вы упомянули.
2. вау, я удивлен, что никто другой не попытался применить магию компоновщика для этих ситуаций.
3. @AishaTammy ну, кто-то сделал, см. Мой ответ.
Ответ №1:
Вы правы, что такие оболочки могут быть легко сгенерированы автоматически. Одним из существующих решений для этого является Implib.so инструмент. В вашем случае вы можете использовать его для создания оболочек с ограниченными интерфейсами для libA и libB:
$ cat libA_syms.txt
f1
f2
$ implib-gen.py --symbol-list libA_syms.txt libA.so
Generating libA.so.tramp.S...
Generating libA.so.init.c...
$ cat libB_syms.txt
f3
f4
$ implib-gen.py --symbol-list libB_syms.txt libB.so
Generating libB.so.tramp.S...
Generating libB.so.init.c...
а затем используйте сгенерированный код для создания библиотеки-оболочки:
$ gcc -shared -fPIC -fvisibility=hidden libA.so.* libB.so.* -o libC.so
Смотрите Этот файл для полного примера.
Комментарии:
1. Боже, да, я действительно нашел этот репозиторий и создавал для него порт в Gentoo Science, но я не смог понять, как его использовать и все его различные варианты : O Я спрошу больше там 🙂
2. @aisha Оказалось, что запас Implib.so я уже поддержал ваше дело, поэтому я привел пример в ответе.