Что такое статическая ссылка?

Статическая линковка связывает библиотеки во время компиляции, копируя их в окончательный бинарник.

Что такое динамическое связывание?

Динамическое связывание загружает и связывает библиотеки во время выполнения, загружая их в память.

Во время компиляции сохраняется только имя общих библиотек.

Эти имена сохраняются в 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)