2013-05-23 2 views
0


Мне интересно, как работает linux в ситуации, которая изображена. enter image description hereКак linux загружает библиотеки в приложение

Вы можете увидеть библиотеку "A", которая статически связана с приложением. Но это приложение зависит от динамической библиотеки B, а это, в свою очередь, зависит от библиотеки A.
Итак, какая библиотека A будет использовать динамическую библиотеку B? Staticaly связанная библиотека A в моем приложении или она снова загрузит дополнительную библиотеку A.
Это важно, если эти библиотеки имеют разные версии.
Также вы можете предложить мне несколько статей обо мне, потому что для меня линкер похож на черный ящик.

ответ

1

Динамически подключаемая библиотека B libB.so -Какой должна быть динамически связаны между собой, когда libB.so построен, чтобы libA.so не будет видеть статически libA.a (еще хуже, это может иметь дублированные глобальные переменные этой библиотеки, так что может дать вам кошмар).

На самом деле, libA.a не существует в исполняемом файле ELF из вашей основной программы. Только некоторые, но не все объектные файлы a*.o от libA.a статически связаны внутри вашего исполняемого файла (на самом деле это необходимо).

См Levine Linkers and Loaders книги на dynamic linking вики страницы и на ELF и Drepper ДОКУМЕНТ How To Write Shared Libraries. См. Также ld.so(8), ldconfig(8), ldd(1), dlopen(3), mmap(2), proc(5) man pages. Используйте strace и один раз попробовать cat /proc/self/maps ...

Короче не увязывали статически и динамически той же библиотеки (даже одинаковых или разных версий).

правило: всегда ссылаются динамически, за исключением того, когда вы знаете, что вы делаете и почему ...