ABI - это прикладной двоичный интерфейс (не путать с API, интерфейсом программирования приложений). ABI определяет размеры, знаки и порядки номеров, которые использует приложение.
Чтобы быть ясным, вот пример: я хочу кодировать возраст здания, выраженный в годах. Для этого я могу использовать C unsigned char, который является типом, размер которого равен 1 байту, и который может кодировать значения от 0 до 255. Теперь предположим, что я обнаружил, что 255 является слишком низким пределом, потому что есть здания, которые были построены более 255 лет назад. Затем я могу использовать C unsigned int длиной 4 байта и кодировать значения от 0 до 65535.
Изменяя тип от char до int, я не изменил семантическое значение поля (это был возраст, выраженный в годы и до сих пор), однако я изменил его размер. Каждое программное обеспечение, которое взаимодействует с моим приложением, не нужно изменять, однако оно будет говорить на другом «языке».
Поэтому, когда ядро меняет свой ABI, это означает, что он изменил язык, на котором он говорит, но никакие функциональные возможности не были добавлены, удалены или изменены. Все сторонние модули, которые должны взаимодействовать с ядром, должны быть перекомпилированы, чтобы говорить на этом новом языке, но их не нужно каким-либо образом изменять, чтобы работать правильно.