о статической линковке с разными версиями библиотек
От: sidorov18 США  
Дата: 05.08.14 08:46
Оценка:
Это не вопрос, а, скорее комментарии по поводу уже решенной задачи. Может кому-то будет интересно, а может кто-то что-то свое добавит для расширения понимания.

У нас проект с множеством статических библиотек, которые пишут разные люди. Так же есть система версионирования с минорными и мажорными версиями.
Какова идея? Если мы меняем реализацию, но интерфейс остается прежний или его изменения не ведут к бинарной несовместимости — минорная версия. т.е. старую либу можно не пересобирать.
Мажорное изменение — изменение в интерфейсе и сама система сборки заставит пересобрать либу с более новой.
Примерная структура проекта:

Либа_Б — собрана с Либа_А_1_2
Либа_В — собрана с Либа_А_1_3

Линкуем:
Либа_А_1_3
Либа_Б
Либа_В

Ожидается, что обе либы подхватят новую либу А_1_3
Все успешно линкуется. среда — vs2005
Далее натыкаемся на странный баг при долгой отладке которого оказывается, что причина — бинарная несовместимость. И только в дебажной сборке.
Причем в либе В.

Загадки линковки, которые привели к багу:
В либе А есть класс, объявленный полностью в хедере.
При сборке Либа_Б забирает себе этот класс. Из старой либы.
При сборке Либа_В так же забирает себе этот класс. Из новой либы.
При линковке линкер натыкается на две реализации класса, не выдает ни малейшего ворнинга и берет класс из либы Б для либы В!
Далее мы получаем Либу_В с классом из либы, которая не участвует в сборке вообще!
Баг состоял в том, что программист добавил виртуальный метод перед уже существующим виртуальным методом.
Либа запомнила индекс метода, но не его имя. И при вызове вызывался совершенно иной метод, который не приводил к падению программы,
т.к. имел идентичную сигнатуру. Позже приводил к странному поведению программы. т.к. это класс хелпер для строк — не сразу стало понятно, в чем дело.

Программист, конечно, должен был добавлять виртуальный метод в конец или изменить мажорную версию. В этом случае была бы ошибка компиляции и либу Б пришлось бы пересобирать с новой либой А.
Но благодаря ему мы узнали такое вот странное поведение линковщика. Хорошо хоть только в дебаге.
Re: о статической линковке с разными версиями библиотек
От: Ops Россия  
Дата: 05.08.14 12:24
Оценка: +1
Здравствуйте, sidorov18, Вы писали:

S>Программист, конечно, должен был добавлять виртуальный метод в конец или изменить мажорную версию. В этом случае была бы ошибка компиляции и либу Б пришлось бы пересобирать с новой либой А.

Это будет UB, т.к. все равно ODR violation.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.