Одна возможность состоит в том, чтобы загрузить вспомогательные библиотеки, которые вам нужно в «частном» месте, а затем изменить заголовки вашей программы для поиска этого местоположения.
Мимические ваша целевая среда
- Установите виртуальную машину на собственной машине работает тот же CentOS строить, как хостинговой компании. Это означает тот же выпуск CentOS и ту же архитектуру процессора. (
cat /etc/*-release
должен предоставить вам одну информацию, uname -a
предоставит вам другую информацию. В частности, вы хотите убедиться, что у вас есть аналогичная версия библиотеки C, /lib/libc.so.?
должна быть исполняемой и предоставить вам некоторые сведения о используемой библиотеке C .)
- Установите необходимые пакеты с помощью YUM на свой виртуальный хост.
- Убедитесь, что ваш исполняемый файл работает.
Выяснить, что целевая среда отсутствует
Выполнить ldd /usr/bin/your-app
, чтобы получить список библиотек, к которому он относится. В частности, для очистки списка: ldd/usr/bin/your-app | cut -d '(' -f 1 | cut -d '>' -f 2 | sed -e 's, [\ t], g' | sort | uniq> my-required-libs
Log на удаленный сервер и скопировать файл через, а затем запустить что-то вроде:
#/бен/ш
недостающого ЛИЭСА для Lib в $ (< моего-требуемые-ЛИЭС) сделать if [-f "$ lib"] then echo "OK $ lib" else echo "NO $ lib" эхо «$ Lib» >> недостающей ЛИЭС фи сделано
missing-libs
Копия обратно на свой виртуальный хост и mkdir
папку с именем, например, ~/my-app/lib
; затем cp $(<missing-libs) /home/myself/my-app/lib
ВНИМАНИЕ, что вы будет необходимость создания этой точный путь на вашем виртуальном хостинге, включая имя пользователя и так далее - так что если ваша директория для записи на общем хосте /home/myself
убедитесь, что этот каталог находится под /home/myself
на виртуальном хосте.
Alter RPATH исполняемого файла, чтобы указать на другое место
библиотеки Найдите исполняемый файл приложения и изменять свои заголовки с помощью chrpath
(вы, возможно, потребуется yum install chrpath
в виртуальной машине, так как это является необычным программа нужна):
chrpath --list/USR/бен/ваш-приложение
Если отчеты любой существующий RPATH, то вы будете хотеть PREPEND путь ~/мое приложение/LIB к тому, что RP ATH с :
- например, если chrpath --list
показано /usr/lib/my-app/plugins
, вы можете использовать /home/myself/my-app/lib:/usr/lib/my-app/plugins
. В более обычном случае просто используйте --replace
с именем каталога, в который вы скопировали необходимые библиотеки.
chrpath --replace ~/мое-приложение/Библиотека/USR/бен/ваше-приложение
Теперь скопируйте исполняемый файл с новым RPATH и каталогом полной поддержки библиотек к общему хосту.
Это все «дружественное» к многопользовательской настройке с общим хостингом, в отличие от других решений, например, chroot
тюрьмы.
В качестве альтернативы, создать LD_LIBRARY_PATH обертку
Если chrpath
не работает для настройки (например,чрезвычайно строги SELinux контексты), вы можете быть в состоянии пропустить chrpath
шаг и вместо того, чтобы сделать что-то вроде:
mv ~/my-app/bin/my-app ~/my-app/bin/my-app.real
и сделать сценарий оболочки, как
#!/bin/sh
export LD_LIBRARY_PATH=/home/myself/my-app/lib
exec /home/myself/my-app/bin/my-app.real
... и заменить имя исходного Binary с этим скрипт.
Обратите внимание, что теоретически вы можете заменить практически любую библиотеку таким образом, но когда библиотеки требуют файлов данных в определенных местах (например, /etc
) или динамически вызывают подбиблиотеки из системных местоположений (например, /usr/lib64
), вы можете столкнуться с переписывать их с новыми путями в своих сценариях ./configure
или редактировать их источники способами, которые, вероятно, не стоят усилий во всех, кроме самых экстремальных случаях.
EG: Вещи, которые недружелюбны к перемещению таким образом: libc
и подключаемые модули аутентификации.
Я уже много лет использую VM, и даже тогда это был только VMWare (кратко) и Virtualbox. Разве VM не будет использовать кучу ресурсов? Наверное, есть какое-то решение VM, о котором я не знаю. Я думал о чем-то вроде [docker] (https://www.docker.io/), но похоже, что ему тоже нужно sudo. Почему вы говорите, что «chroot» будет недружественным для этого (кроме того, что он нуждается в sudo, так что это не сработает)? – user137369
Я был успешным с вариантом этого решения, и это действительно помогло мне добраться туда. Спасибо – user137369
Извините, разъяснение, VM - это временная вещь на вашей локальной машине, если у вас нет запасной машины, которую вы можете использовать для макет-системы. И, да, 'sudo' - вот почему' chroot' было бы трудно использовать здесь, а также требовать, чтобы иногда искажалось приложение chroot'а из-за пределов тюрьмы – BRFennPocock