170 похожих чатов

Тема, когда современный компилятор С++, запущенный на свежем дистрибутиве линукс

порождает бинарник с зависимостью от более свежей glibc, чем готов накатить себе админ заказчика. Немного затронута, но не раскрыта. Варианты, которые мы опробовали:
1. собирать на древнем дистрибутиве старым компилятором (ибо новому тоже какая-то нужна glibc не из древних)
2. вручную ковыряться внутри бинарника - искать, за какой новый символ тот зацепился, чтобы убрать
3. запускать собранное ПО в докер-контейнере или еще как-то виртуализовать
4. линковать всё статически (всю толпу, которая есть в проекте)
Может еще какой забыл, но все они в той или иной мере ущербные. Кто-то может предложить более интересное решение? Насколько я понимаю, такого варианта, как в винде - ссыпать всё необходимое в один каталог, ни в каком дистрибутиве Линукса пока что не предлагается. Загрузчик все равно будет изо всех сил пытаться взять старую системную glibc.

51 ответов

77 просмотров

https://github.com/wheybags/glibc_version_header

а насколько древняя целевая libc?

а вообще тема подробно раскрыта в https://www.youtube.com/watch?v=Z7WuUhPJ-cU

а чем вариант 4 концептуально отличается от виндового "ссыпать всё в один каталог"?

Ignat Loskutov
https://github.com/wheybags/glibc_version_header

Уже 4 года не обновлялось 😞

Ignat Loskutov
https://github.com/wheybags/glibc_version_header

оно сломалось вроде для какой-то более-менее последней glibc, там какие-то новые символы появились для которых просто так версию не переназначить

ursoft- Автор вопроса
Vlad
а насколько древняя целевая libc?

glibc 2.17 в ALterOS - пока что отпинались, сказав, что 2012 год староват для нас

загрузчик можно тоже таскать с собой и запускать явно ./ld.so my_program

Ignat Loskutov
загрузчик можно тоже таскать с собой и запускать я...

нет, нельзя загрузчик тесно связан с ядром

Самое надёжное решение: собирать с sysroot, в котором будут заголовки и системные .so-шки целевой системы

артем λ
Самое надёжное решение: собирать с sysroot, в кото...

ну кстати flatpak есть, там glibc своя тащится в рантайме

quyse
ну кстати flatpak есть, там glibc своя тащится в р...

glibc гарантирует прямую совместимость, софт собранный со старой версией запустится с новой

>> 3. запускать собранное ПО в докер-контейнере или еще как-то виртуализовать Докер — это не виртуализация, так что если есть подходящий базовый контейнер с долгосрочной поддержкой (или вы сами можете такой собрать и поддерживать), то это самый простой и удобный вариант, как по мне

артем λ
Самое надёжное решение: собирать с sysroot, в кото...

Так, кстати, устроен Android NDK, да и вообще многие кросс-тулчейны

артем λ
glibc гарантирует прямую совместимость, софт собра...

это да, но вроде обсуждаем случай наоборот, когда софт собирается с новой glibc, а запускается со старой

Ofee Oficsu
>> 3. запускать собранное ПО в докер-контейнере ил...

Тут есть проблема, что под старый контейнер может не оказаться новой версии компилятора (в бинарном дистрибутиве). Потому что никто не собрал =)

quyse
это да, но вроде обсуждаем случай наоборот, когда ...

Лично я в такой ситуации линкую статически, а символы glibc форсирую, как ссылку кидали выше. Меньше динамических зависимостей — меньше проблем

артем λ
Лично я в такой ситуации линкую статически, а симв...

я раньше использовал эти заголовки, но оно сломалось с какой-то версии

Ignat Loskutov
можно, не связан

тесно связан с версией libc, так что нужно таскать строго той же версии

артем λ
Тут есть проблема, что под старый контейнер может ...

Мой личный опыт подсказывает, что собрать (когда это возможно) новый компилятор под старым дистрибутивом сильно проще, чем кросскомпилировать под старый, так что я бы попробовал в начале такой вариант

quyse
я раньше использовал эти заголовки, но оно сломало...

Там ребята поменяли реализацию CRT, так что только sysroot

Ofee Oficsu
Мой личный опыт подсказывает, что собрать (когда э...

Кстати так и делаем. Вполне рабочая схема.

ursoft- Автор вопроса
Ofee Oficsu
>> 3. запускать собранное ПО в докер-контейнере ил...

У нас уже куча докер-образов с разными версиями и источниками б-к, мы в них тесты гоняем, довольно успешно. Но overhead у докера все же ненулевой.

Ofee Oficsu
>> 3. запускать собранное ПО в докер-контейнере ил...

вопрос определения, Таненбаум например склонен виртуализацией называть примерно что угодно

ursoft
У нас уже куча докер-образов с разными версиями и ...

>> Но overhead у докера все же ненулевой Под какой ОС? Потому что под Linux запуск в контейнере принципиально не отличается от нативного запуска процесса

ursoft- Автор вопроса
Ofee Oficsu
>> Но overhead у докера все же ненулевой Под како...

Когда я одновременно запускаю 26 нативных процессов с тестами в Linux, они заполняют собой примерно 32 GB ОЗУ. Аналогичные 26 докер-образов - примерно 48 GB. И где-то 10% медленнее. Но всё равно, лично мне этот вариант очень нравится тем, что почти нет причин для отказов.

quyse
оно сломалось вроде для какой-то более-менее после...

pthread переехал в glibc, в частности, тоже сталкивался, пришлось костылить

ursoft- Автор вопроса
артем λ
Тут есть проблема, что под старый контейнер может ...

В контейнере мы запускаем наше ПО, не компилятор.

ursoft
Когда я одновременно запускаю 26 нативных процессо...

Рост памяти объясним — в каждом контейнере своя версия рантайма/зависимостей, которые, скорее всего, не удаётся шарить между процессами. Но это буквально то, зачем нужен докер. Скорее всего, запустив 26 процессов в одном образе, ваш результат не будет отличаться от нативного запуска. И скорость... Наверное, падение производительности связано как раз с тем, что ресурсы не шарятся, чем с накладными расходами от докера

Alexander Karaev
pthread переехал в glibc, в частности, тоже сталки...

посмотрел свои записи, для меня оно сломалось на glibc 2.33, там что-то намутили с новыми символами для stat, fstat

quyse
посмотрел свои записи, для меня оно сломалось на g...

Там тоже ломалось, но чинилось относительно легко

А вот если бы существовала headers-only версия стандартной библиотеки то подобных проблем просто не существовало бы - просто скачиваешь исходники стандартной библиотеки в репозиторий с проектом и дальше просто инклудишь нужный хедер, например #include "./libs/std/vector" и всё - теперь можно юзать в коде std::vector и никаких проблем со сборкой, линковкой, конфликтов с предустановленными в ОС бинарниками и т.д

Богдан
А вот если бы существовала headers-only версия ста...

Плюс это еще работало бы быстрее так как компилятор либо сможет либо заинлайнить функции стандартной библиотеки прямо в код либо заоптимизировать вызовы (так как ему не нужно придерживаться ABI)

Богдан
Плюс это еще работало бы быстрее так как компилято...

И ещё ОС тоже собирать вместе с приложением. Зачем тратить ресурсы на call'ы в библиотеке?

Богдан
?

Общая для разных приложений

Богдан
и в чем проблема?

Ну так она больше не будет общей

Dmitriy [Отпуск]
И ещё ОС тоже собирать вместе с приложением. Зачем...

А я кстати всерьез рассматриваю такой вариант. Если у меня на сервере будет работать только одно приложение (база данных) то зачем спрашивается тратится на сискол вызовы (да еще с переключением контекста) если можно статически слинковать приложение с ядром линукса (когда компилятор сможет даже заинлайнить сисколы прямо в код) ?

Богдан
А я кстати всерьез рассматриваю такой вариант. Есл...

например, чтобы при краше приложения по-прежнему иметь работоспособную систему…

Богдан
А я кстати всерьез рассматриваю такой вариант. Есл...

чтобы если упало, так точно ничего не собрать: ни логи, ни корку, ни метрики

Богдан
А я кстати всерьез рассматриваю такой вариант. Есл...

Не забудьте про свой ASIC под конкретную задачу, выйдет ещё эффективнее!)

Богдан
А я кстати всерьез рассматриваю такой вариант. Есл...

Опять 25. Вам не надоела эта тема? Дайте номер вашего дилера — я хочу такой же травы!

Dmitriy [Отпуск]
Не забудьте про свой ASIC под конкретную задачу, в...

компиляция и статическая линковка в FPGA битстрим

Dmitriy [Отпуск]
Не забудьте про свой ASIC под конкретную задачу, в...

Кстати я тут недавно смотрел на возможности fpga-решений для реализации базы данных. К сожалению ни одна fpga плата не поддерживает то количество dimm-слотов оперативной памяти которую поддерживают современные x64 материнки. Вот например такая материнка (https://www.supermicro.com/en/products/motherboard/h13ssh) поддерживает 24 планки памяти (а если несколько сокетов то вообще 64 планки - https://www.supermicro.com/en/products/motherboard/x13qeh+) Ничего подобного среди fpga-плат не найти.

Богдан
А я кстати всерьез рассматриваю такой вариант. Есл...

Если всерьез рассматриваешь, то в случае когда на сервере будет крутиться только одно приложение - линукс не нужен. Любая оська не нужна.

Богдан
А я кстати всерьез рассматриваю такой вариант. Есл...

Тебе не нужно ядро линукса в таком случае, includeos хватит.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта