Я пытаюсь упаковать мой бинарный файл и все его общие библиотеки в архив. Я хочу, чтобы пользователь только извлекал архив, чтобы заставить двоичный файл работать. Исполняемый файл запускается с помощью сценария оболочки, где я задаю для LD_LIBRARY_PATH путь к общей библиотеке, содержащийся в архиве.
В первый раз я хотел, чтобы он работал на дистрибутиве RHEL 6.7, поэтому я скомпилировал свой бинарный файл с этим дистрибутивом, и когда я тестировал его, он работал хорошо.
Проблема в том, что теперь я должен заставить его работать на RHEL 7.2 (и поддерживать RHEL 6.7 в рабочем состоянии), и когда я запускаю бинарный файл, он не работает … он вылетает внутри функции glibc (isspace без мусора в аргументе) ,
Я вижу, что за этими двумя релизами RHEL изменилась версия glibc.
В общих библиотеках, которые содержатся в архиве, не было общей библиотеки glibc, поэтому я попытался добавить ее, и теперь я получил следующую ошибку:
./XXX: ���:ELF: zR: Error 892688562
Кажется, что это ошибка ELF (многословно присутствует каждый раз, когда я ее запускаю), я проверяю все свои общие библиотеки, и они являются библиотеками x64 (например, двоичными) …
Я не хочу компилировать на RHEL 7.2, потому что у меня много зависимостей, и я не хочу компилировать все это, а также мне легче поддерживать одну версию.
Я перепробовал много вещей, таких как Statifier и Ermine, которые оба работают, но у первого есть ошибка, и ей нужно отключить рандомизацию расположения адресного пространства, а второе — условно-бесплатное, и я предпочитаю бесплатное решение. Я также попробовал CDE, который также работает, но он генерирует такой большой пакет, это немного беспорядок …
Почему с таким решением это работает, а с моим домашним решением это не работает? Что я не делаю хорошо?
Спасибо за чтение,
Я надеюсь, что у кого-то есть решение для меня, потому что я долго ищу …
РЕДАКТИРОВАТЬ :
Я нашел решение, прежде чем мой сценарий оболочки был похож на:
# Binary location
LOCATION=$(dirname $0)
# Shared libraries directory
BINDIR=${LOCATION}/bin/
# Define LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${BINDIR}:${LD_LIBRARY_PATH}
# Launch binary
${LOCATION}/XXX $*
Я изменился на:
# Binary location
LOCATION=$(dirname $0)
# Shared libraries directory
BINDIR=${LOCATION}/bin/
# Changed shared library default location and launch binary
${BINDIR}/ld-linux-x86-64.so.2 --library-path ${BINDIR} ${LOCATION}/XXX $*
Я не очень понимаю, почему, но это работает, кто-то может объяснить мне, пожалуйста? (ld-linux-x86-64.so.2 пришел из дистрибутива RHEL 6.7)
Я не очень понимаю, почему, но это работает, кто-то может объяснить мне, пожалуйста?
Это объяснили Вот. Ваше решение упоминается как «явный вызов загрузчика» Вот.
Кстати, это неправильно: ${LOCATION}/XXX $*
Вы должны сделать это вместо этого:
${LOCATION}/XXX "$@"
(Ваш вариант не будет правильно обрабатывать аргументы со встроенными пробелами.)
Других решений пока нет …