Чтобы понять, что здесь происходит, сначала нужно понять, как двоичная совместимость традиционно обрабатывается.
Механизм, используемый для «внешнего управления версиями». Вы начали с libfoo.so.1
, и когда вам нужно было изменить ABI существующей функции, вы были вынуждены ввести libfoo.so.2
.
Приложения, которые были связаны до libfoo.so.2
, продолжали использовать libfoo.so.1
со старым ABI, а новые приложения использовали libfoo.so.2
с новым ABI.
Это все подробно описано здесь .
Но затем glibc представил расширение , где вместо введения совершенно новой библиотеки (которая разделяет 99% кода с предыдущей версоном), вы вводите новый символ в существующую библиотеку.
Это расширение позволяет libc.so.6
оставаться в версии 6 в течение лет , при этом позволяя старым двоичным файлам работать и развиваться ABI.
В частном случае fopen
в версии 2.1 glibc было сделано несовместимое изменение на struct FILE
. Двоичные файлы, которые были связаны в системах glibc-2.0, продолжают использовать старый struct FILE
(единственный, который был доступен тогда) и продолжают вызывать _IO_old_fopen
(для которого fopen@GLIBC_2.0
является псевдонимом). Двоичные файлы, связанные с glibc-2.1 и новее, используют новый struct FILE
и вызывают _IO_new_fopen
(для которого fopen@GLIBC_2.1
является псевдонимом).
@@
- это просто обозначение, показывающее текущую стандартную версию символа.