2013-02-22 3 views
4

Я понимаю, что при связывании со статической библиотекой, то есть с именем libname.a, двоичный код для используемых функций вынимается из архива, а вставлен в двоичный файл приложения. Поэтому статическая библиотека ДОЛЖНА присутствовать во время компиляции.Что происходит при компиляции с общей библиотекой?

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

ответ

4

Общие библиотеки должны быть переданы в командную строку компоновщика, чтобы ссылка на конкретные функции и файл, в котором находятся эти функции, хранится в исполняемом файле. Когда исполняемый файл запускается, динамический компоновщик (/lib/ld-linux.so, /libexec/ld-elf.so и т. Д., В зависимости от вашей системы) загружается первым и проверяет эти ссылки. Как только он находит файлы lib, он отображает их (используя системный вызов mmap()) в адресное пространство вашей программы.

Вы можете увидеть эти ссылки, запустив

objdump -T a.out 

или

nm -D a.out 

Для ELF исполняемых файлов, существование раздела .interp означает, что программа использует динамическое связывание.

+0

Спасибо. Между тем, я нашел [это] (http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html) замечательный учебник, дополняющий ваши объяснения. – Vorac

0

обратитесь к страницам для dlopen и dlsym для явного динамического управления ссылками погрузчика.

Смежные вопросы