Рейтинг:12

Почему двоичный файл сборки 21.10 несовместим с установкой 21.04?

флаг cn

Я не понимаю, почему бинарник, построенный на 21.10, несовместим с системой 21.04.

Бинарный файл связан с libc.so.6 который также доступен в версии ОС 21.04.

Тот же двоичный файл в системе 21.10:

$ ldd turboledzd
    Linux-vdso.so.1 (0x00007ffdc2595000)
    libhidapi-hidraw.so.0 => /lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 (0x00007fdd64057000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd63e2f000)
    libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007fdd63e06000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdd64085000)

И в системе 21.04:

$ ldd turboledzd 
./turboledzd: /lib/x86_64-linux-gnu/libc.so.6: версия `GLIBC_2.34' не найдена (требуется ./turboledzd)
    линукс-vdso.so.1 (0x00007fff9c570000)
    libhidapi-hidraw.so.0 => /lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 (0x00007f37ec402000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f37ec216000)
    libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f37ec1ed000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f37ec423000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f37ec1cb000)

Мой вопрос:

Если libc.so.6 от 21.04 не совместим с libc.so.6 с 21.10, затем почему не называется libc 21.10 libc.so.7 вместо?

Или, лучше, почему он не связан с чем-то, что называется libglibc.so.2.34 - если это зависимость?

N0rbert avatar
флаг zw
Используйте версию 20.04 LTS, если вы хотите, чтобы ваше приложение работало долго и без проблем.
marcelm avatar
флаг cn
_"Или, лучше, почему он не связан с чем-то под названием libglibc.so.2.34"_ — Как вы думаете, как это поможет? В обоих случаях программа не запустится, пока вы не установите обновленный glibc.
флаг cn
tl;dr: Да, это глупый беспорядок. Если бы это было не так, это не был бы линукс. Для сравнения, представьте, как глупо было бы, если бы программа, которую вы скомпилировали в Windows 10 20H2, не работала в Windows 10 20H1.
флаг cn
@ user541686: это не относится к Linux; это результат общего наследия AT&T Unix и Linux.В частности, `libc` рассматривается как часть ОС. В Windows `MSVCRT*.DLL` является частью Visual Studio, а не Windows, и несколько версий могут сосуществовать. Другие компиляторы для Windows также могут поставлять свои собственные библиотеки. Сам Windows API строго версионирован в своем SDK, по крайней мере, с Windows 95.
Рейтинг:25
флаг us

Если libc.so.6 от 21.04 не совместим с libc.so.6 с 21.10, затем почему не называется libc 21.10 libc.so.7 вместо?

libc.so является такой же основной библиотекой, как и они. Почти все зависит от него. Одна из целей glibc — обеспечить обратную совместимость — программу, которая могла бы работать со старыми версиями. libc.so.6 должен (обычно) также нормально работать с более новой версией. Однако, если вы нажмете сонейм на libc.so.7 только потому, что вы добавили какую-то новую функцию, то все из этих ранее созданных программ потребуется перестройка без уважительной причины. По-настоящему не было крупный перерыв в API для glibc, чтобы гарантировать это еще.

Я не понимаю, почему бинарник, построенный на 21.10, несовместим с системой 21.04.

Я не вижу никого, кто бы гарантировал вперед совместимость (это то, что вы ожидаете от 21.04, имея возможность запускать что-то с 21.10) - почему вы ожидаете этого, если не принимаете меры предосторожности для ее обеспечения?

флаг st
Glibc был в библиотеке версии 6 с тех пор, как я занимаюсь Linux, если я правильно помню.
muru avatar
флаг us
Похоже, что с [1997 года, когда закончился раскол Linux libc/glibc](https://man7.org/linux/man-pages/man7/glibc.7.html).
Bram avatar
флаг cn
Итак, никогда не собирайте ничего в новой системе, если вы хотите распространять бинарный файл? Как я могу использовать новую ОС для создания двоичных файлов, которые также работают в старых ОС?
Incomputable avatar
флаг cn
@Bram, вы можете придерживаться набора функций, который предоставляет самая старая библиотека в ваших дистрибутивных ОС.
Bram avatar
флаг cn
@Incomputable Я не использую никаких новых функций. Я просто использую новую ОС для компиляции.
Guntram Blohm avatar
флаг cn
Вот почему я держу виртуальную машину Fedora 12 старше 10 лет (может быть и Ubuntu 10.04, но я перешел на Ubuntu только с 14.04); любой небольшой инструмент, который я создаю для собственного использования, компилируется там и работает на каждой машине, на которую я его копирую, независимо от того, насколько он старый или новый.
Ruslan avatar
флаг bv
@Bram да, просто не компилируйте его в более новой системе, чем ваша самая старая цель, а также не используйте GCC новее, чем поддерживает эта цель, по крайней мере, для кода C++, потому что `libstdc++.so` будет иметь точно такую ​​​​же проблему. .
Ruslan avatar
флаг bv
@Incomputable это непросто с glibc/libstdc++, потому что при компоновке вы автоматически используете последнюю версию ABI, поддерживаемую этими библиотеками, например `GLIBC_2.34` в OP, и это требуется для того, чтобы окончательный двоичный файл присутствовал в загружаемой библиотеке. при запуске. Может быть, есть какая-то магия компоновщика, чтобы сделать иначе, но я не знаю об этом.
флаг cn
@Bram «Как я могу использовать новую ОС для создания двоичных файлов» - докер очень помогает в подобных ситуациях. Например, вы можете использовать образ `ubuntu:20.04`, сопоставить исходный каталог внутри него и собрать там двоичные файлы. Избавляет вас от установки отдельного glibc/кросскомпиляции.
флаг cn
@viraptor Было бы полезно объяснить, что можно делать без Docker. Эта проблема старая, но Docker появился только в 2013 году.
флаг cn
@ user541686 без него ответ болезненный и слишком длинный для комментариев. «Google, чтобы узнать об установке нескольких наборов инструментов и кросс-компиляции» — самый короткий указатель.
capr avatar
флаг cn
Разработчики Linux просто не могут понять, зачем кому-то создавать двоичный файл, который должен работать на более старой системе. И у них были _десятилетия_, чтобы понять такие простые вещи, и они до сих пор этого не понимают.
muru avatar
флаг us
@capr, а что тебе мешает?
capr avatar
флаг cn
Версионные символы @muru glibc «функция» и отсутствие в gcc опции совместимости «min-version» (как в OSX).
muru avatar
флаг us
@capr ах, но сборка для более старых версий - это решенная проблема - даже 7-8 лет назад, когда я баловался упаковкой, pbuilder и тому подобное уже были зрелым рабочим процессом. В наши дни с Docker это еще проще. Я не специалист по macOS, поэтому не знаю, есть ли в macOS эквиваленты для *тех*.
capr avatar
флаг cn
@muru тот факт, что вы рекомендуете мне строить с помощью Docker, то есть все еще на более старой Linux, только то, что теперь она находится на виртуальной машине, показывает именно непонимание проблемы, о которой я говорил. В старом Linux у вас есть старый gcc! Это совсем не то, что вы хотите. Это просто хак. Это противоположность инженерии.
muru avatar
флаг us
@capr да, с Docker вы также можете легко создать образ со своим старым glibc и новым GCC. Все, что я вижу здесь, это отсутствие интереса к использованию хорошо известных, понятных решений и вместо этого просто нытье, когда все не так, как $MY_FAVOURITE_OS.
capr avatar
флаг cn
@muru, так что, возвращаясь к вашему первоначальному вопросу, что меня «останавливает» от этого, так это нежелание собирать виртуальную машину и создавать всю цепочку инструментов компилятора, и, если не делать этого, я «ною», понял.
Рейтинг:13
флаг us

Согласно с пакеты.ubuntu.com, 21.04 использует glibc 2.33, тогда как 21.10 использует glibc 2.34, которые не полностью совместимы.

Однако у вас должна быть возможность собрать двоичные файлы для Ubuntu 21.04 из исходного кода.

Если исходный код не интерпретируется, вам обычно нужно собирать бинарные пакеты отдельно для разных версий Ubuntu. Панель запуска может автоматизировать это для вас.

почему libc 21.10 вместо этого не называется libc.so.7?

Это решение могут принять только разработчики glibc.

флаг cn
Я думаю, это решение может принять дистрибьютор, но оно, скорее всего, вызовет гораздо больше путаницы и несовместимости, чем решит... И если вы действительно хотите систему с несколькими версиями glibc, вам, вероятно, потребуется иметь версию ld -linux.so... что должно быть отражено в бинарных файлах для такой системы, что сделает их несовместимыми практически ни с чем другим...
Рейтинг:2
флаг ph

Термин для Google - это «версия символа glibc».

Как это введение объясняет, glibc содержит несколько версий каждого символа, которые менялись с течением времени, и поэтому libc.so.6 содержит все версии glibc от 2.0 до той версии, которая указана.

Когда вы связываете с ней новую библиотеку или двоичный файл, вы используете .час файлы и экспортированные символы для новейших версий символов.

Что касается доступа к старым символам, на StackOverflow есть вопрос с именем Как я могу сделать ссылку на конкретную версию glibc?, но поскольку все ваши другие зависимости, скорее всего, тоже будут связаны с новейшими символами, гораздо проще просто использовать Docker или chroot для работы с более старыми версиями системы, потому что вы, вероятно, создадите ее с нуля, если не сделаете этого.

Разработчики Python фактически поддерживают контейнеры Docker с именами много линукс... специально для создания надежной основы для создания колес (распространяемых двоичных пакетов) для пакетов Python с скомпилированными компонентами.

Я считаю, что подход Windows ближе к объединению нескольких четко определенных профилей и призыву ко всем авторам предварительно скомпилированных библиотек предлагать сборки, ориентированные на более старые профили. (С оговоркой, что вы должны исходить из того, что должен быть бесплатноd той же единицей компиляции, что и маллокэто потому, что PE не имеет глобальных символов, и разные библиотеки могут зависеть от разных версий распределителя со своими собственными статический переменные и семантические различия.)

флаг cn
**Windows** действительно имеет несколько четко определенных профилей и по-прежнему документирует их до NT 4.0: https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt. Но это ничего не говорит о `malloc/free`; это не функции Windows. Windows использует `HeapAlloc`/`HeapFree`, и для этого требуется только, чтобы вы использовали одну и ту же кучу для обоих.
флаг ph
@MSalters Независимо от того, используете ли вы Win32 API или POSIX API, моя точка зрения заключалась в том, что в документации Microsoft, которую я читал, было очень отношение «Если это сломается, вы сохраните части» к выделению в одном артефакте сборки и освобождению в другом... только не проси меня найти его снова. Это была эра WinXP, и с тех пор Microsoft перетасовала свои URL-адреса и изменила тему MSDN.
флаг cn
В документации Microsoft по MSVC были такие предупреждения — компилятор, конечно же, реализует `malloc`.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.