Как мне поддерживать отдельный (более новый) стек glibc / gcc /… как не-root в Linux

10

Наш вычислительный кластер работает с очень старой версией CentOS со старым ядром (2.6.18) и, конечно, старыми библиотеками и двоичными файлами. Поскольку обновление всего этого требует много работы на всех узлах, это не вариант.

Я пытаюсь скомпилировать и использовать программу, которая требует C++11и, следовательно, более новые версии gcc(и / или clang). Поскольку я вообще не хочу возиться с системой, я хочу сделать это как пользователь без полномочий root в некотором локальном дереве каталогов.

Проблема в том, что gccтребуется более новый, glibcчем тот, который присутствует на машине (ах). Следовательно, мне нужно сохранить отдельную, более новую версию glibcв моем локальном lib/дереве, вероятно, как описано здесь .

Где я потерял это, как я «жёстко» дорожки моей местной LIBS во все необходимых двоичных файлах, то есть gcc, и g++т.д.? Установка LD_LIBRARY_PATH в моё локальное lib/дерево заставляет все системные двоичные файлы больше не работать ( ELF file OS ABI invalid), потому что они хотят использовать мои новые libm.so/, для libc.soкоторых они не были скомпилированы.

Итак, подведем итоги: как правильно поддерживать новый локальный стек разработки (содержащий glibcи gccт. Д.) Параллельно старой системе, не возиться с правами root?

В качестве дополнительного вопроса: настройка LD_LIBRARY_PATH публикуется как решение по всей SE, когда дело доходит до разделения glibc. Для меня это вызывает ошибки выше, когда я пытаюсь выполнить любой двоичный файл системы (например ls). Как так? Я сделал что-то не так или это намеченное поведение?

janoliver
источник

Ответы:

10

У вас есть в основном три варианта:

  1. Используйте обертку вокруг ваших библиотек, которая установит LD_LIBRARY_PATHсоответствующим образом и затем выполнит нужную библиотеку - что-то вроде:

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. link with -rpath( -Wl,rpath), который добавляет путь поиска для динамического компоновщика в двоичный файл (см. также ответ SO - он также упоминает обертку).

  3. Вам не понравится читать это: обновите ваш кластер (обратите внимание на «ваш»). Это должно быть сделано один день или другой, так почему бы не сегодня. «Не вариант» является в большинстве случаев немного сильным. Другие пользователи, вероятно, имеют такие же проблемы.

Что касается старых двоичных файлов, имеющих проблемы - двоичные файлы имеют встроенный динамический компоновщик. И старый динамический компоновщик не понимает более новый ABI. Попробуйте вызвать двоичные файлы , как это: path/to/your/ld-linux-<arch>.so binary.

Сборка GCC: вы всегда можете попробовать выполнить экспорт CFLAGSв среде сборки GCC, но я уверен, что они распространяются. Скрипты сборки различных дистрибутивов могут дать вам некоторые подсказки (например: для openSUSE посмотрите строку 1880 в файле .spec ).

peterph
источник
Привет, Петер, спасибо за ответ. Я предпочитаю вариант 2. Однако как мне жестко закодировать rpath, например, в gcc, без необходимости изменять Makefile и т. Д.? Что касается обновления кластера: это, конечно, в нашей повестке дня, но сейчас слишком много людей используют его, чтобы оправдать более длительные простои. Кроме того, для его обновления мы снова будем нанимать компанию, которая изначально его создала. Никто в нашей группе не обладает достаточными знаниями и опытом для этого.
Январь
Для GCC см. Обновление моего ответа. Для обновления кластера моя личная рекомендация - найти внутреннего (или хотя бы долгосрочного внешнего) гуру. Обычно это дешевле и гибче в долгосрочной перспективе, чем просто полностью отдать его на аутсорсинг. Наиболее важным преимуществом является получение знаний через взаимодействие между системным администратором и пользователями.
Петер
Как небольшая исследовательская группа в безнадежно недофинансированной немецкой научной системе, мы, к сожалению, не можем нанять кого-то для этой задачи или потратить время сами. Возможно, вы правы, что в долгосрочной перспективе это может окупиться, но сейчас бюджеты слишком ограничены для чего-то подобного. Это недостаток не быть в компании. ;)
janoliver
Получить студентов IT / CS из вашего университета - хороший может даже быть в состоянии использовать его для его / ее диссертации бакалавра / магистра. А что касается финансов: будьте рады, что вы находитесь в Германии, а не в одном из ваших восточных соседей (возможно, за исключением Австрии). :)
Петер
В качестве альтернативы переходу -rpath( -Wl,rpath) к компоновщику, компоновщик также добавит пути из LD_RUN_PATHпеременной среды в путь поиска
rakslice