Як я можу підтримувати окремий (новіший) стек glibc / gcc /… як некореневий в Linux


10

Наш обчислювальний кластер виконує дуже стару версію CentOS, зі старим ядром (2.6.18) і, звичайно, старими libs and binaries. Оскільки для оновлення всієї справи потрібна велика робота над усіма вузлами, це не варіант.

Я намагаюся скласти і використовувати програму, яка вимагає C++11і тому новіші версії gcc(та / або clang). Оскільки я взагалі не хочу возитися з системою, я хочу це зробити як некорінний користувач у якомусь локальному дереві каталогів.

Проблема полягає в тому, що gccпотрібна нова glibcверсія, ніж та, яка присутня на машинах. Отже, мені потрібно підтримувати окрему, новішу версію glibcсвого місцевого lib/дерева, ймовірно, як описано тут .

Де я втратив це, як я «жорстко» доріжки моєї місцевої LIBS в усі необхідних довічних файлах, тобто gcc, і g++т.д.? Якщо встановити LD_LIBRARY_PATH на моє локальне lib/дерево, змушує всі системні бінарні файли більше не працювати ( ELF file OS ABI invalid), оскільки вони хочуть використовувати моє нове libm.so/ libc.soпроти якого вони не були складені.

Таким чином, щоб обернути його: Що таке правильний спосіб підтримувати новий, локальний стек розвитку (що містить glibc, і gccт.д.) паралельно до старої системи , НЕ байдикували як корінь?

Як побічне запитання: налаштування LD_LIBRARY_PATH розміщується як рішення по всьому SE, коли мова йде про окремі glibc. Для мене це спричиняє помилки вище, коли я намагаюся виконати будь-яку бінарну систему (наприклад ls). Як це? Я зробив щось не так або це задумана поведінка?

Відповіді:


10

У вас є три варіанти:

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

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. посилання з -rpath( -Wl,rpath), що додає шлях пошуку динамічного лінкера у двійковий (див. також відповідь ТАК - він також згадує обгортку).

  3. Вам не подобається читати цей: оновити свій кластер (зверніть увагу , акцент на «ваш»). Це доведеться робити день чи інший, то чому б не сьогодні. "Не варіант" у більшості випадків трохи сильний. Інші користувачі, мабуть, мають ті самі проблеми.

Що стосується старих бінарних файлів, які мають проблеми - бінарні файли мають вбудований в них динамічний лінкер. І старий динамічний лінкер не розуміє новішого ABI. Спробуйте викликати виконавчі файли , як це: path/to/your/ld-linux-<arch>.so binary.

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


Привіт, Петерф, дякую за відповідь. Я вважаю за краще варіант 2. Однак як би я жорстко кодував rpath, наприклад, у gcc, не змінюючи Makefile тощо? Що стосується оновлення кластеру: це, звичайно, є на нашому порядку денному, але зараз занадто багато людей використовують його для виправдання триваліших простоїв. Також для його оновлення ми знову будемо найняти компанію, яка її створила спочатку. У нашій групі немає нікого, хто має для цього достатньо знань та досвіду.
янолівер

Для GCC див. Оновлення моєї відповіді. Для оновлення кластерів моя особиста рекомендація - отримати внутрішнього (або принаймні довгострокового зовнішнього) гуру. Зазвичай це дешевше і гнучкіше в довгостроковій перспективі, ніж просто його аутсорсинг повністю. Найважливішою перевагою є отримання знань додому через взаємодію адміністратора системи та користувачів.
петерф

Як невелика дослідницька група в безнадійно недофінансованій німецькій науковій системі, ми, на жаль, не в змозі когось найняти для цього завдання або вкласти час самостійно. Ви можете мати рацію, що в перспективі це може окупитися, але зараз бюджети занадто обмежені на щось подібне. Це мінус не бути в компанії. ;)
Янолівер

Приймайте студентів з ІТ / КС у своєму університеті - хороший може навіть використовувати його для своєї дисертації бакалавра / магістра. А щодо фінансів: радійте, що ви перебуваєте в Німеччині, а не в одному зі своїх східних сусідів (можливо, за винятком Австрії). :)
петерф

Як альтернатива передачі -rpath( -Wl,rpath) до лінкера, лінкер також додасть шляхи від LD_RUN_PATHзмінної середовища до шляху пошуку
rakslice
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.