Что можно изменить в библиотеке .so без нарушения совместимости

Например, я могу добавить новую функцию в заголовочный файл без необходимости перекомпиляции всех программ, использующих эту библиотеку?

0

Решение

Вы можете добавлять функции и объекты в общей библиотеке, не нарушая существующие программы, которые полагаются на эту библиотеку. При некоторых обстоятельствах вы можете увеличить размер объектов (в частности, массивов) в библиотеке.

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

Вы можете удалить функции и объекты, на которые не ссылается ни одна программа. Если вы обеспокоены только существующий тогда вы сможете каталогизировать, какие это функции и объекты, но в противном случае вы можете основывать такую ​​оценку только на видимости функций / объектов в общей библиотеке — видимые извне функции и объекты не могут быть безопасно удалены.

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

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

1

Другие решения

Другое дело, что вы должны быть очень осторожны с любыми общими структурами. Если функция в вашей библиотеке принимает или возвращает структуру или указатель на структуру, и если вы вносите какие-либо изменения в эту структуру (добавление, удаление или перестановка элементов), вы, скорее всего, столкнетесь с несовместимостью.

(Строго говоря, такие изменения считаются изменениями сигнатуры функции, как упоминалось другими.)

Если вы очень, очень осторожны, вы можете организовать добавление новых членов в конце структуры, но, как правило, это требует явного взаимодействия вызывающих абонентов, используя заранее определенные механизмы (то есть соблюдаемые начиная с версии 0 всеми вызовами). код, прежде чем будут сделаны какие-либо изменения).

0