По крайней мере, в библиотеке GNU C связывание содержит информацию о версии для каждого отдельного символа (функции и т. д. ), которые используются. Вы можете увидеть это с помощью objdump -T
; например, на /bin/ls
я получаю
DYNAMIC SYMBOL TABLE:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3 __ctype_toupper_loc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __uflow
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getenv
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 sigprocmask
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3.4 __snprintf_chk
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 raise
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
и т. д.
Разработчики библиотеки C делают все возможное, чтобы обеспечить обратную совместимость библиотеки C. Приведенный выше вывод означает, что для ls
требуется __ctype_toupper_loc
из библиотеки C версии 2.3 или более поздней и т. д. Любая библиотека C, которая предоставляет все необходимые символы, сможет запустить данный двоичный файл; и любая данная версия библиотеки GNU C предоставляет реализации всех символов, которые когда-либо предоставлялись более старой версией библиотеки C (, восходящей к 1997 году ).
Другой способ обработки вещей, используемый большинством библиотек в системах на основе Linux -(, фактически, в системах на основе ELF -и других ), — это soname. Каждая библиотека определяет не только свое имя, но и номер версии, который меняется всякий раз, когда вносятся критические изменения (в некоторых случаях, чаще ). Несколько версий библиотек с разными именами могут быть установлены параллельно; например
-rw-r--r-- 1 root root 2500416 Dec 16 21:07 libcrypto.so.1.0.2
-rw-r--r-- 1 root root 2711616 Nov 28 23:43 libcrypto.so.1.1
(Это также используется библиотекой C, о чем свидетельствует имя зависимости, libc.so.6
— но последний скачок soname библиотеки GNU C произошел много лет назад.)
Чтобы ответить на вопрос в вашем заголовке, можно статически связать библиотеку C, но это редко бывает необходимо или полезно (и может привести к путанице, поскольку некоторые части библиотеки C динамически связаны, даже если библиотека C статически связаны ).Может быть полезно связать другие библиотеки статически. Другие языки используют другие подходы, и, например, программы Go статически компонуются.