Автоматическое перенаправление функций через библиотечные оболочки в C

#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 я уже поддержал ваше дело, поэтому я привел пример в ответе.