Скрытие символов в динамической библиотеке без изменения исходного кода.

У меня есть закрытая-исходная общая-библиотека стороннего производителя, которая мне нужна связать против. К сожалению, создатели сторонней-библиотеки не удосужились ограничить экспортируемые символы и экспортировали все символы. Сторонняя-библиотека внутри использует несовместимую версию популярной библиотеки, которую я использую в своем коде, но экспортирует конфликтующие символы (библиотеки protobuf от Google). Это приводит к ошибке времени выполнения, когда проверка версии библиотеки протобуфера обнаруживает, что версии времени компиляции и времени выполнения библиотеки несовместимы. Я могу решить проблему, вернувшись к более старой версии protobufs 2.3, которая соответствует версии, используемой в сторонней библиотеке. Однако у protbuf 2.3 есть проблемы с производительностью, которые делают его непригодным для использования медленным для моего приложения. Мне нужен способ использовать protobuf 2.4 в моем коде и позволить сторонней-библиотеке использовать собственную внутреннюю версию 2.3.

Есть ли способ сгенерировать новую версию сторонней библиотеки, которая не экспортирует символы из библиотеки protobuf v 2.3, используемой внутри, с учетом только файла so? Если бы у меня был источник, это было бы проще. Похоже, что такие инструменты, как objcopy и strip, фактически не могут изменять динамическую таблицу символов. Единственная идея, которая у меня есть на данный момент, это создать свою собственную библиотеку прокладок, которая экспортирует только нужные мне символы, перенаправляя вызовы на стороннюю-библиотеку (, открытую с помощью dlopen, возможно?).

Есть ли лучшее решение?

5
задан AstroCB 24 August 2014 в 01:41
поделиться