Как запустить динамически скомпилированный 32 -битный двоичный файл x86 в системе amd64 -бит Guix?

Хм... эта замена Vi не работает ни в одном редакторе Vi, в котором я пробовал. Вы, вероятно, имели в виду :%s/\\\n/ /g, который будет работать в Vim, но не в Vi.


$ sed '/\\$/{N;s/\\\n/ /;}' file
line 1 line 2
line 3
line 4 line 5

Определяет, заканчивается ли текущая строка обратной косой чертой, и если да, то добавляет следующую строку.(sedдобавляет между ними символ новой строки ), заменяет обратную косую черту и новую строку символом пробела.

Это не удастся, если в конце двух последовательных строк есть обратная косая черта. Для этого используйте что-то вроде

sed ':top;/\\$/{N;s/\\\n/ /;btop;}' file

Здесь, если была обработана строка с обратной косой чертой, код возвращается к началу.

Аннотированная версия последнего sedсценария:

:top;             # define label "top"
/\\$/{            # the line ends with backslash
    N;            # append next line to pattern space with embedded newline
    s/\\\n/ /;    # substitute backslash and newline with space
    btop;         # branch to "top"
}
                  # (implicit print)
0
26.07.2020, 03:40
1 ответ

Одна из проблем с запуском двоичных файлов в системе Guix заключается в том, что они не знают о фактическом расположении библиотек. Они хотят использовать глобально -установленные библиотеки, но guix установил их только в магазине. Есть два решения :создать среду, в которой двоичный файл может найти библиотеки, или исправить двоичный файл, чтобы найти библиотеки.

Для обоих решений необходимо знать, какие библиотеки вам понадобятся. Попробуйте это(lddиз пакета glibc):

$ ldd my-binary
linux-vdso.so.1 (0x00007ffe80da9000)
    libdl.so.2 => not found
    libc.so.6 => /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/libc.so.6 (0x00007f7651b77000)
    /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/ld-linux-x86-64.so.2 (0x00007f7651d3b000)

Теперь вы знаете, какие файлы библиотек необходимы. Отметьте их и найдите пакеты, которые нужны, помимо glibc, для запуска пакета.

с контейнером

Первое решение требует от вас создания контейнера, в котором вы предоставляете доступ к библиотекам и двоичным файлам в глобальном расположении. Обратите внимание, как мы используем -s i686-linuxдля создания среды для этой архитектуры вместо среды по умолчанию.

PROFILE=$(guix environment -C -N --ad-hoc glibc... -s i686-linux -- bash -c 'echo $GUIX_ENVIRONMENT')
guix environment -C -N --ad-hoc glibc... -s i686-linux --expose=$PROFILE/lib=/lib --expose=$PROFILE/lib=/lib64

Первая строка создает переменную PROFILE, содержащую путь к профилю, который мы создаем для среды. Он запускает команду echo и сразу же существует. Использование одинарных кавычек необходимо, так как не нужно, чтобы bash из вне среды расширял переменную. Вторая команда фактически позволяет вам войти в среду. Если программе требуется графический дисплей, вам нужно будет поделиться/раскрыть больше вещей.

с накладкой

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

быстро и грязно

Быстрый и грязный способ — построить каждую зависимость, которую вы отметили ранее, вот так (для glibc):

$ guix build glibc -s i686-linux
/gnu/store/9728x9zhj8d3zlyzsjpz342jpccrgkgd-glibc-2.31

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

Теперь с patchelf (из пакета patchelf):

patchelf --set-interpreter /gnu/store/...-glibc-.../lib/ld-linux.so.2
patchelf --set-rpath /gnu/store/...-glibc-.../lib:/gnu/store/.../lib:/gnu/store/.../lib:...

это устанавливает интерпретатор на ld -linux.so.2 (для 32 бит )и rpath, который является путем поиска динамических библиотек. Это должен быть разделенный двоеточием -список каталогов, в которых расположены требуемые библиотеки.

Этот метод относительно быстрый, но грязный, так как он не регистрирует никакого корня gc, и вам придется повторять его снова каждый раз, когда вы обновляете guix или запускаете сборщик мусора.

с помощью пакета

Последняя возможность — создать определение пакета для вашего двоичного файла, в котором будет зарегистрирована информация о зависимостях, и вы также можете использовать этот метод для установки двоичного файла в свой профиль. Вы можете использовать binary-build-systemв nonguix:https://gitlab.com/nonguix/nonguix

Недостатком этого метода является то, что он копирует двоичный файл в хранилище, а двоичный файл может быть большим. Но использование определения пакета более -оправдано в будущем, так как вы всегда можете собрать его снова и обновить пакет. Система бинарной сборки, по сути, выполняет приведенные выше команды patchelf за вас более декларативным способом. Вы можете определить пакет таким образом:

(package
  (name "my-binary")
  (version "version")
  (source (local-file "/home/..."))
  (build-system binary-build-system)
  (arguments
   `(#:patchelf-plan
     `(("my-binary" ("libc" "gcc:lib"...)))
     #:install-plan
     `(("my-binary" "bin/"))))
  (inputs
   `(("gcc:lib",gcc "lib")))); note how the first string must match the one in
                              ; patchelf-plan. libc is already implicitely defined

Затем вы можете собрать этот пакет с чем-то вроде:

guix build -s i686-linux -f my-package.scm
2
18.03.2021, 23:17

Теги

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