Удаление библиотеки, включенной в общую библиотеку
Предыстория вопроса: у меня есть библиотека, скажем, mylib.so, которая включает в себя старый libpng. Теперь (из-за недавних политик Google Play) я должен использовать более новую libpng; но это может быть сложно, поскольку библиотека была скомпилирована давно, и может потребоваться очень много времени, чтобы собрать все необходимые библиотеки со старой версией... и так далее.
Вопрос:
Можно ли "удалить" определенные записи из файла mylib.so, чтобы я мог затем связать mylib.so и новый libpng.so из моих приложений, и все будет работать нормально (очевидно, если libpng обратно совместим с тем, что ранее было связано внутри mylib.so)?
Я не знаю внутренностей общих библиотек, но я надеюсь, что компоновщик сможет сделать это без перекомпиляции всего mylib.so... Я слишком оптимистичен?
Дополнительный вопрос (не основной, но я бы хотел это понять): если mylib.so включает в себя старый libpng и я ссылаюсь как на mylib.so, так и на новый libpng... что происходит? Я имею в виду, что компоновщик позволяет мне связывать 2 библиотеки, вероятно, с похожими именами экспортируемых символов... но это немного сбивает с толку...
1 ответ
Можно ли "удалить" определенные записи из файла mylib.so,
Нет.
Большинство систем UNIX (за исключением AIX) учитывают .so
как окончательная ссылка на продукт, и дальнейшая модификация невозможна.
если mylib.so включает в себя старый libpng и я ссылаюсь как на mylib.so, так и на новый libpng... что происходит?
Ваша программа демонстрирует неопределенное поведение, нарушая правило одного определения. Обычно это просто сбой, но возможно и все остальное. Это может, например, молча испортить ваш стек и вызвать сбой только один раз в час или один раз в день. Такие ошибки труднее всего найти. Просто не делай этого.