Сразу к делу: AUR-пакеты ломаются после обновления репозитория из-за ABI-поломок. Библиотека в официальном репо меняет soname, libfoo.so.5 превращается в libfoo.so.6, а AUR-пакет собран под старую версию и ссылается на файл, которого больше нет. Лечится пересборкой пакета под новую библиотеку, обычно за пару команд.
ABI это двоичный интерфейс приложения: набор функций, структур и соглашений, по которым программа общается с библиотекой. Пока ABI совпадает, бинарник работает с любой версией библиотеки. Как только разработчики меняют сигнатуры функций или внутренние структуры, старый бинарник начинает падать или вести себя странно.
Чтобы такие ситуации не проходили незаметно, библиотеки используют soname, имя файла с номером версии: libjsoncpp.so.24. Когда ABI меняется, номер увеличивается, libjsoncpp.so.24 превращается в libjsoncpp.so.25. Старые программы, собранные под .so.24, физически не могут найти файл, он перестал существовать. Это и есть ABI-поломка.
Посмотреть, какие библиотеки требует бинарник, можно через readelf:
readelf -d /usr/bin/ffmpeg | grep NEEDED
В выводе будут строки вида NEEDED libavcodec.so.61. Если такого файла в системе нет, библиотека обновилась и soname сменился.
Пакеты из официального репозитория собираются в едином конвейере: когда библиотека обновляется, все зависящие от неё пакеты пересобираются в тот же релиз. Поэтому в репо почти не встретишь бинарник, который ссылается на несуществующую soname.
AUR-пакеты собираются из исходников на твоей машине под конкретные версии библиотек. PKGBUILD фиксирует зависимости, но не версии: depends=('ffmpeg') означает «любая версия ffmpeg». Собрал ты пакет, когда в системе стоял ffmpeg 6, потом обновил репо, пришёл ffmpeg 7 с новым soname. Твой AUR-бинарник продолжает искать старую библиотеку и не находит её.
Отдельная беда, пакеты, которые тянут библиотеку как зависимость и вшивают её версию в себя. Например, программы, собранные против libavcodec, после обновления ffmpeg требуют libavcodec.so.61, а в системе уже libavcodec.so.62.
Усугубляет ситуацию частичное обновление. Если ты обновил только часть пакетов, например pacman -S ffmpeg без полного pacman -Syu, рассинхрон между библиотеками и программами гарантирован. Arch поддерживает только полное обновление системы, и это правило касается AUR-пакетов напрямую: они собираются под то, что стоит в системе прямо сейчас. Подробнее про частичные обновления читай в статье «Частичное обновление и IgnorePkg».
ffmpeg чемпион по ABI-поломкам. Его библиотеки (libavcodec, libavformat, libavutil, libswscale) меняют soname почти каждый релиз. После обновления ffmpeg пересобираются десятки пакетов: видеоредакторы, конвертеры, плееры, программы захвата экрана. Если у тебя много AUR-пакетов, зависящих от ffmpeg, готовься к цепочке пересборок.
jsoncpp маленькая библиотека для работы с JSON. Её soname меняется реже, но болезненно: libjsoncpp.so.24 превращается в libjsoncpp.so.25. Типичная картина: обновил систему, запускаешь AUR-программу, а она пишет error while loading shared libraries: libjsoncpp.so.24: cannot open shared object file. Пакет в AUR давно не обновлялся, а в репо уже новая версия библиотеки.
ncurses5 особый случай. В официальном репозитории живёт ncurses с soname libncurses.so.6. Старые программы, собранные против пятой версии, не работают с шестой из-за изменений в ABI. Поэтому в AUR существует отдельный пакет ncurses5-compat-libs, он ставит libncurses.so.5 рядом с шестой. Это не пересборка, а сосуществование двух версий.
Симптом почти всегда одинаковый, программа не запускается с ошибкой:
error while loading shared libraries: libjsoncpp.so.24: cannot open shared object file: No such file or directory
Проверь, какая версия библиотеки стоит в системе:
pacman -Q jsoncpp
ls /usr/lib/libjsoncpp.so*
Если в системе libjsoncpp.so.25, а программа просит .so.24, это ABI-поломка. Посмотреть, какие библиотеки не находятся, можно через ldd:
ldd /usr/bin/имя-программы | grep "not found"
Строки not found кандидаты на поломку. А readelf -d покажет полный список требуемых библиотек:
readelf -d /usr/bin/имя-программы | grep NEEDED
Полезно также проверить, откуда взялась зависимость. Команда pactree покажет дерево зависимостей пакета, а pacman -Qi версию установленной библиотеки:
pactree -r имя-программы
pacman -Qi jsoncpp | grep Версия
Так ты поймёшь, какой пакет тянет старую библиотеку и что именно пересобирать. Про работу с деревом зависимостей читай в статье «pactree: граф зависимостей».
Иногда программа запускается, но сразу падает с другой ошибкой:
$ имя-программы
имя-программы: symbol lookup error: /usr/lib/libfoo.so.6: undefined symbol: foo_bar
Файл библиотеки на месте, soname совпадает, а нужного символа внутри нет. Так бывает, когда бинарник собран против более новой версии библиотеки, чем стоит в системе, или когда библиотеку пересобрали и выкинули часть функций.
Проверка по шагам. Сначала ldd:
ldd /usr/bin/имя-программы | grep "not found"
Вывод пустой, файл находится. Дальше readelf -d:
readelf -d /usr/bin/имя-программы | grep NEEDED
Строка NEEDED libfoo.so.6 есть, и файл /usr/lib/libfoo.so.6 существует. Значит, дело не в отсутствии библиотеки, а в отсутствии символа. Проверь его через nm -D:
nm -D /usr/lib/libfoo.so.6 | grep foo_bar
Если вывод пустой, библиотека не экспортирует этот символ, бинарник собран против другой версии. Лечение то же, пересборка пакета под установленную библиотеку.
Самый правильный путь. Обнови PKGBUILD, если он отстал, и пересобери:
yay -S имя-пакета
или вручную:
cd ~/aur/имя-пакета
git pull
makepkg -si
Если PKGBUILD в AUR уже обновлён под новую библиотеку, пересборка пройдёт без правок. Если нет, смотри, что изменилось: возможно, нужно поднять версию в pkgver или добавить новую зависимость. Разбор структуры PKGBUILD в статье «Свой PKGBUILD: полный гайд».
Иногда пакет, который ты ставишь, давно заброшен, а в AUR есть форк или обновлённая версия. Поищи по имени:
yay -Ss имя-пакета
Если нашёлся пакет с более свежей датой, ставь его.
Если пакет собирается из исходников, а не тянет готовый бинарник, достаточно пересобрать его с новой библиотекой в системе. makepkg сам подтянет актуальные зависимости. Главное, не собирай пакет, пока в системе стоит старая библиотека: результат снова будет сломан. Про флаги и настройки сборки читай в статье «makepkg: всё, что нужно знать».
Когда библиотека исчезла из официального репо, а AUR-пакет без неё не работает, ставь совместимую версию из AUR. Классика, ncurses5-compat-libs:
yay -S ncurses5-compat-libs
Пакет ставит libncurses.so.5 и libtinfo.so.5 рядом с шестой версией. Старые программы находят свою soname и работают. Это костыль, но иногда единственный вариант.
Если поломка уже случилась, действуй по порядку: откати сломанный пакет, пересобери AUR-связку, проверь систему на забытые бинарники.
Если программа сломалась сразу после обновления, быстрее всего вернуть старую версию библиотеки из кэша pacman:
pacman -U /var/cache/pacman/pkg/libfoo-5.0-1-x86_64.pkg.tar.zst
Имя файла подставь из того, что лежит в кэше. Если кэш уже почистили, старую версию можно взять с archive.archlinux.org. Откат это временная мера: при следующем pacman -Syu библиотека снова обновится. Используй его, чтобы выиграть время и спокойно пересобрать AUR-пакеты. Про откат из архива читай в статье «Архив Arch Linux: откат пакетов».
Когда сломано несколько пакетов, пересобирай их разом, а не по одному. yay умеет пересобирать все пакеты, собранные из исходников:
yay -S --rebuild --answerclean All
Если какой-то пакет не собирается, смотри ошибку: возможно, PKGBUILD отстал и нужна правка. Про типичные ошибки сборки читай в статье «Сборка AUR падает: submodules и checksum». А про пересборку всех пакетов разом — в статье «Переустановка всех пакетов».
После пересборки проверь, не осталось ли пакетов, собранных против удалённых библиотек:
rebuild-detector
Утилита живёт в AUR. Она сканирует систему и выводит список бинарников, которые ссылаются на несуществующие файлы. Прогони её после каждого крупного обновления, она ловит то, что легко пропустить.
После массовых пересборок в кэше pacman копятся старые версии библиотек. Почисти их:
sudo paccache -r
Оставь пару последних версий на случай отката. Про кэш и его очистку читай в статье «Чистка кэша пакетов paccache».
Перед обновлением загляни на главную страницу Arch Linux, там публикуют предупреждения о грядущих ABI-поломках. Если в новостях пишут про ffmpeg или jsoncpp, знай, что после обновления придётся пересобирать AUR. Официальные рекомендации по обслуживанию системы на странице «System maintenance, ArchWiki».
Перед pacman -Syu посмотри, что обновляется, и прикинь последствия. Сначала список обновлений:
checkupdates
Потом проверь, какие установленные пакеты зависят от обновляемых библиотек. Если в списке ffmpeg:
pactree -r ffmpeg
Дерево покажет все пакеты, которые тянут ffmpeg, включая AUR-сборки. Отдельно посмотри, какие AUR-пакеты ждут обновления:
yay -Qua
Если среди них есть те, что зависят от обновляемой библиотеки, обнови их сразу после pacman -Syu, не откладывая.
Порядок обновления важен. Сначала обнови систему:
sudo pacman -Syu
Потом пересобери AUR-пакеты, которые зависят от обновлённых библиотек. Если обновляешь наоборот, AUR-пакет соберётся под старую библиотеку и сломается при следующем обновлении.
Официальные пакеты собираются в едином конвейере: при обновлении библиотеки все зависимые пакеты пересобираются в тот же релиз. AUR-пакеты собираются на твоей машине под конкретную версию библиотеки и не пересобираются автоматически.
Пересобери его под новую библиотеку: yay -S имя-пакета или makepkg -si. Если PKGBUILD отстал, обнови его или поищи форк в AUR. Основы установки из AUR в статье «Установка пакетов из AUR».
Можно, но это плохая идея. Старая библиотека не получит обновлений безопасности, а при следующем pacman -Syu её всё равно заменят. Правильный путь, пересборка пакета.
Нет, но удобно. Утилита находит бинарники, собранные против удалённых библиотек, и экономит время на поиске сломанных пакетов вручную.
Официальные пакеты собираются и тестируются мейнтейнерами Arch, AUR-пакеты сообществом, а собираются на твоей машине. Поэтому AUR-пакеты чувствительнее к обновлениям библиотек. Про выбор между AUR-хелперами читай в статье «yay vs paru: какой безопаснее».
ABI-поломки после обновления репозитория нормальная жизнь Arch Linux. Библиотека меняет soname, AUR-пакет, собранный под старую версию, перестаёт запускаться. Диагностика занимает минуту: ldd или readelf -d покажут, какой библиотеки не хватает. Лечение, пересборка пакета под новую версию, поиск свежего форка в AUR или совместимая библиотека вроде ncurses5-compat-libs. А чтобы не попадать в эту ловушку, следи за новостями перед крупными апдейтами и пересобирай AUR-пакеты после обновления системы.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии