Удаление библиотеки, включенной в общую библиотеку

Предыстория вопроса: у меня есть библиотека, скажем, 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... что происходит?

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

Другие вопросы по тегам