Создание общей библиотеки, которая «реэкспортирует» символы из других общих библиотек - PullRequest
0 голосов
/ 01 мая 2020

Предположим, что существует простой двоичный файл, который зависит от трех библиотек: libA.so, libB.so и libC.so. В обычном случае эти три зависимости будут отображаться в readelf по мере необходимости. Однако мне любопытно, можно ли создать общую библиотеку libABC.so, которая абсолютно ничего не делает, кроме как выполняет функцию интерфейса с тремя актуальными библиотеками, «перенаправляя» символы. Таким образом, возможно, можно иметь несколько версий libABC.so, которые в свою очередь указывают на разные версии трех зависимостей, и двоичный файл может «зависеть» только от libABC.so. Возможно ли это с помощью ELF?

Другим возможным вариантом использования является обратный вариант, когда двоичный файл уже зависит от существующей библиотеки libABC.so, которая, как оказалось, оказалась разделенной на три отдельные библиотеки.

Остерегайтесь, что у меня не обязательно есть практическое использование или фактический случай использования для этого. Независимо от того, являются ли приведенные выше примеры практическими, мне просто любопытно, есть ли такая возможность.

Повторный экспорт символов совместно используемой библиотеки из другой библиотеки (OS X / POSIX) имеет многообещающее название, но ответы кажутся либо заданными Дарвином c, либо не вполне отвечают на этот вопрос.

1 Ответ

2 голосов
/ 01 мая 2020

Этот вид работает с ELF из-за плоского пространства имен символов: если вы зависите от одной библиотеки, вы обычно получаете доступ к символам ее зависимостей одновременно (за исключением случаев, когда * Используется 1003 *).

Но большинство редакторов ссылок (ld) не делают этого по умолчанию (больше), потому что в противном случае это позволит добавлять ненужные библиотеки в зависимости. В GNU ld эта функция контролируется флагом --as-needed и была включена примерно через 10 лет go по умолчанию, если я правильно помню.

Вы должны быть в состоянии заставить поведение, которое вы ' изучите с помощью GNU ld, связав (например, через внешний интерфейс G CC) с gcc yourprogram.c -Wl,--no-as-needed -lABC -Wl,--as-needed. Это заставит связываться с libABC.so независимо от того, использует ли программа один из своих экспортированных символов или нет.

Я много писал об этой функции, потому что в то время она решала много проблем с дистрибутивами, на мой блог , если вы изучаете его практические возможности.

...