Что такое статическая ссылка?
Статическая линковка связывает библиотеки во время компиляции, копируя их в окончательный бинарник.
Что такое динамическое связывание?
Динамическое связывание загружает и связывает библиотеки во время выполнения, загружая их в память.
Во время компиляции сохраняется только имя общих библиотек.
Эти имена сохраняются в PLT (таблица связи процедур).
Статическое и динамическое связывание
Статический
- Большие двоичные файлы
- Обновления кода общей библиотеки могут внести критические изменения и помешать запуску программы.
Динамический
- Зависит от внешних библиотек, которые должны быть установлены и совместимы
- Общие библиотеки являются общими для процессов.
- Код общей библиотеки можно обновлять/исправлять без новой компиляции.
Как создать статически связанный двоичный файл?
$ ld [options] objfile
ld
объединяет несколько файлов объектов и архивов, перемещает их данные и связывает ссылки на символы. Обычно последним шагом в компиляции программы является запуск ld
.
$ gcc hello.c -static -o hello
Как создать динамически подключаемый бинарник?
$ gcc hello.c -o hello
Как узнать, связан ли двоичный файл статически или динамически?
Проверьте тип ссылки
$ file /usr/bin/gcc /usr/bin/gcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=017fc52acbca077c9bc6a4e8f04dd90eb5385243, for GNU/Linux 4.4.0, stripped
Проверить динамически подключаемые библиотеки
$ ldd /bin/gcc linux-vdso.so.1 (0x00007fff6377e000) libc.so.6 => /usr/lib/libc.so.6 (0x00007fcd238f2000) /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fcd23b02000)