Статически и динамически связывать одну и ту же библиотеку - PullRequest
1 голос
/ 06 августа 2009

У меня есть программа, которая статически связывается с библиотекой (libA.2.0.a) и динамически связывается с другой библиотекой (libB.so). libB.so также динамически связывается со старой версией libA (libA.1.0.so).

Возможна ли эта конфигурация? И если да, то как система знает, как использовать символы из libA.2.0.a для моей программы и символы из libA.1.0.so для libB.so?

1 Ответ

5 голосов
/ 06 августа 2009

Да, такая конфигурация возможна.

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

При сборке libB.so он устанавливает ссылки на libA.1.0.so. Он не знает и не заботится о том, что будут делать другие приложения, которые он использует, он просто знает, как отобразить свои собственные вызовы функций.

При создании самого приложения оно ссылается на libB.so. Что бы ни вызывало libB.so, оно совершенно неизвестно приложению. Приложение также статически ссылается на библиотеку, которая не заботится о libB.so.

Одно замечание: если libA использует статические переменные, для libB.so будет один набор статик и другой, независимый набор статик, доступных для приложения.

...