Как встроить статическую библиотеку в общую библиотеку? - PullRequest
2 голосов
/ 20 мая 2019

В Linux я пытаюсь создать общую библиотеку libbar.so, которая встраивает коммерческую статическую библиотеку (лицензирование в порядке).Коммерческая библиотека имеет 4 версии: libfoo-seq.a, libfoo-mt.a, libfoo-seq.so и libfoo-mt.so (все они предоставляют одинаковые символы, только код является последовательным / многопоточным, ибиблиотека является статической / общей).Из этих четырех я хочу, чтобы мой код всегда использовал последовательную библиотеку foo, поэтому при создании libbar.so я связываю вместе свои объектные файлы и libfoo-seq.a.

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

Интересно, как я могу решить эту проблему?Какие магические флаги мне нужно использовать при компиляции для создания моих объектных файлов и когда я связываю свои объектные файлы с libfoo-seq.a для создания libbar.so?

1 Ответ

1 голос
/ 20 мая 2019

Вы можете скрыть символы libfoo в libbar через скрипт версии:

$ cat libbar.map
{
  global: libbar_*;
  local: libfoo_*;
};
$ gcc ... -o libbar.so -Wl,--version-script=libbar.map
...