Как сделать исправление в одной из общих библиотек (.so) в проекте на linux? - PullRequest
5 голосов
/ 15 сентября 2011

Я хочу быстро исправить одну из библиотек проекта .so.Безопасно ли просто перекомпилировать .so и заменить оригинал?Или мне нужно пересобрать и переустановить весь проект?Или это зависит?

Ответы [ 5 ]

4 голосов
/ 15 сентября 2011

Это зависит.Общая библиотека должна быть двоично-совместимой с вашим исполняемым файлом.

Например,

  1. если вы изменили поведение одной из внутренних функций библиотеки, вы вероятно не нужно перекомпилировать.
  2. Если вы изменили размер структуры (например, добавив элемент), который известен приложению, вам нужно будет перекомпилировать, иначе библиотека иприложение будет думать, что структура меньше, чем она есть, и завершится сбоем, когда библиотека попытается прочитать дополнительный неинициализированный элемент, в который приложение не записало.
  3. Если вы измените тип или позицию аргументовлюбых функций, видимых в приложениях, вам нужно перекомпилировать, потому что библиотека будет пытаться прочитать больше аргументов из стека, чем приложение для нее (это в случае с C, в C ++ типы аргументов являются частью функцииподпись, поэтому приложение будет отказываться запускаться, а не падать).

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

1 голос
/ 15 сентября 2011

Это зависит, да.

Тем не менее, я предполагаю, что у вас точно такой же исходный код и компилятор, который создавал другие вещи, и теперь, если вы только измените что-то в файле .cpp, это нормально.

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

1 голос
/ 15 сентября 2011

Если вы не изменили ABI общей библиотеки, вы можете просто перестроить и заменить библиотеку.

1 голос
/ 15 сентября 2011

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

Хорошие ссылки:

1 голос
/ 15 сентября 2011

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

Конечно, всегда есть крайние случаи, когда программа зависит от некоторого недокументированногопобочный эффект функции, а затем изменение реализации этой функции может изменить побочный эффект и сломать программу;но c'est la vie .

...