Запуск двоичного файла ubuntu в CentOS с установленными всеми общими библиотеками приводит к ld SIGSEGV

Я пытаюсь получить двоичный файл, скомпилированный на Ubuntu, для запуска на CentOS 7 (как 64-битный, так и один хост, другой vm).

До сих пор я скопировал двоичный файл со всеми общими библиотеками. Я больше не получаю недостающую библиотечную ошибку, но хороший ld SIGSEGV

Program received signal SIGSEGV, Segmentation fault. 0x00007ffff5d67681 in ?? () Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6.x86_64 (gdb) where #0 0x00007ffff5d67681 in ?? () #1 0x00007fffffffe3f0 in ?? () #2 0x00007ffff7decdd4 in _dl_check_map_versions () from /lib64/ld-linux-x86-64.so.2 #3 0x00007ffff7de08a3 in dl_main () from /lib64/ld-linux-x86-64.so.2 #4 0x00007ffff7df2aee in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2 #5 0x00007ffff7dde4a4 in _dl_start () from /lib64/ld-linux-x86-64.so.2 #6 0x00007ffff7dddb08 in _start () from /lib64/ld-linux-x86-64.so.2 #7 0x0000000000000001 in ?? () #8 0x00007fffffffe8bb in ?? () #9 0x0000000000000000 in ?? () 

У меня есть источник, но мне едва удалось скомпилировать и протестировать на ubuntu, поскольку он полагается на некоторые библиотеки, которые построены из исходного кода, опробованы на centOS, но версия g ++ старше и не поддерживает c ++ 11. После установки версии devtools теперь я получаю другие ошибки, но, похоже, это другой вопрос.

Так что я могу сделать, чтобы пройти эту ошибку? Будет ли это в конечном итоге работать таким образом? Каков самый простой способ передать что-то из Ubuntu в CentOS?

2 Solutions collect form web for “Запуск двоичного файла ubuntu в CentOS с установленными всеми общими библиотеками приводит к ld SIGSEGV”

Я бы предложил не делать этого. Обычно проще создавать двоичные файлы для разных дистрибутивов в процессе создания пакета дистрибутива. В CentOS, который будет использовать rpmbuild .

Поскольку вы имеете дело с виртуальными машинами, было бы гораздо более тривиально настраивать инструменты сборки CentOS 7 VM +, а затем создавать конструкцию пакета.


Наблюдения пользователя от исходного распределения

Я обычно не прыгаю на подножку и не редактирую ответы других людей, но я нахожу, что заработал свою репутацию здесь медленно, но верно, помогая людям понять разницу между распределением на основе источника, из которых 3 основных:

  1. Linux от Scratch
  2. Gentoo
  3. Slackware

и бинарное распределение, из которых два основных:

  1. Debian
  2. Redhat / Fedora

На данный момент существует только 1 крупное гибридное распределение (между источником и двоичным):

  1. Arch Linux

Независимо от того, нравится ли Linux пользователям или нет, все остальные дистрибутивы Linux являются дочерьми одного из этих 6 родителей. С учетом сказанного мы переходим к следующему пункту, который:

Невозможно смешивать программное обеспечение от исходного распределения с помощью программного обеспечения в двоичном распределении


Знание этого также означает, что, если вы не знаете, что делаете, вы не должны компилировать один пакет из источника в двоичном дистрибутиве . Существуют исключения из этого правила:

  1. Необходимый пакет не существует в вашем репозитории дистрибутивов / tree / etc (это была причина OP для его вопроса).
  2. Вы не можете найти более новую версию необходимого пакета в вашем репозитории / дереве / etc – см. Bullet 9 .

Почему у ОП возникает проблема

Технически говоря, нет никакой разницы в использовании пакета и создании из исходного кода, когда дело доходит до финального пакета, т. Е. Если вы можете успешно построить пакет и он работает, никто не будет винить вас в этом. Вы должны помнить, что, когда вы это делаете, инструменты, которые вы использовали для создания вашего приложения в одном бинарном дистрибутиве, больше, чем версии инструментов, доступных в другом бинарном дистрибутиве. То, что видит OP, – это дельта или изменение между старым и новым пакетами. Дельта или изменение вызваны службой поддержки пакетов и ОС каждой ОС, будь то один из 6 выше, или дети, выбирая, какой пакет они будут отмечать стабильными для своей ОС. Как только пакет выбран в двоичном дистрибутиве, в большинстве случаев он заморожен до следующей версии, если не обнаружен критический ошибка .

Распространение на основе источника, с другой стороны, может выбрать обновление элементов, как только появятся новые источники, тем самым исправление ошибок «на лету».

Это почему у ОП возникают проблемы

График выпуска и цикл обновления для Ubuntu решили использовать новые версии Build Toolchain , прежде чем CentOS их уложила. Поскольку CentOS построен на стабильности, Build Toolchain может не обновляться до следующей крупной версии . Таким образом, OP столкнулся с проблемой, подобной этому , потому что Ubuntu Build Toolchain поддерживает C ++ 11, а CentOS не работает до тех пор, пока не будут устранены все несоответствия версий, а позже возникнут проблемы с использованием нескольких менеджеров пакетов.

Что должен был сделать ОП

  1. Определены инструменты сборки, доступные для системы, в которой будет находиться пакет. В этом случае это будет CentOS. Вот страница о том, как правильно их установить . Согласно списку в предыдущей ссылке, этот компилятор поддерживает C ++ 11. Как очень опытная догадка несоответствие версии OP происходит либо в binutils либо в libtool Binutils зависит от glibc, а libtool зависит от binutils, поэтому libtool косвенно зависит от glibc Я не буду объяснять, почему почти каждый пакет в любой системе косвенно зависит от glibc знайте, что это так.
  2. Если Build Toolchain после правильной установки не поддерживал C ++ 11, OP был бы вынужден использовать C ++ 98 для облегчения проблемы, с которой он сталкивается сейчас.
  3. Обновив Build Toolchain в шаге 1 выше, OP теперь должен скомпилировать исходный код в CentOS VM и исправить / исправить по мере необходимости. Если OP требует пакет, он должен использовать rpmbuild, как предполагает этот пост, поскольку это основной менеджер пакетов для виртуальной машины, где находится пакет. Yum НЕ является менеджером пакетов. Yum IS – зависимый резольвер

Рекомендации

  1. Список дистрибутивов Linux
  2. Поддержка C ++ 0x / C ++ 11 в GCC
  3. Новости, статус и обсуждение стандартного C ++

Решение и выводы

Основываясь на предыдущих ответах, вот решение, которое я закончил.

1. Скопируйте исходный код

Скопируйте исходный код на виртуальную машину или другую машину. Я использовал:

 scp -R /host/path/to/src/ user@remoteHost:/remote/build/path/ 

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

2. Установите зависимости (инструменты libs / build)

Вернутая виртуальная машина на базовую установку (centOS7 мин) и обновила инструменты, используемые для создания моего приложения на основе проб и ошибок (поиск yum, установка, попытка сборки)

 yum -y update yum -y install boost-* #probably could have used only boost-devel yum -y install glibc-utils yum -y install gcc-c++ yum -y install git yum -y install libtool yum -y install zlib-devel yum -y install ncurses-devel yum -y install make yum -y install cmake yum -y install openssl-devel yum -y install libssh2-devel ... 

Если ваш проект зависит от (более новых) библиотек, недоступных в репозитории ОС, установите из источника:

Например, мне нужен завиток, построенный с помощью c-ares и обновленной клиентской библиотеки mysql.

 #mysqlclient if [[ -z $(ldconfig -p | grep libmysqlclient) ]] then mkdir -p "${INSTALL_PREQ_PATH}/lib/mysql/"; cd "${INSTALL_PREQ_PATH}lib/mysql/" wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm yum -y localinstall mysql-community-release-el7-5.noarch.rpm sudo yum install mysql-community-client sudo yum install mysql-community-devel fi #c-ares if [[ -z $(ldconfig -p | grep libcares) ]] then mkdir -p "${INSTALL_PREQ_PATH}lib/libcares/" cd "${INSTALL_PREQ_PATH}lib/libcares/" git clone git://github.com/bagder/c-ares.git cd c-ares ./buildconf ./configure make sudo make install ldconfig fi #libcurl if [[ -z $(ldconfig -p | grep libcares) ]] then mkdir -p "${INSTALL_PREQ_PATH}lib/libcurl/" cd "${INSTALL_PREQ_PATH}lib/libcurl/" wget http://curl.haxx.se/download/curl-7.39.0.tar.gz tar -xvzf curl-7.39.0.tar.gz cd curl-7.39.0 ./configure --enable-ares --with-libidn --with-zlib --disable-ipv6 make sudo make install ldconfig fi 

Obs: каждая сборка поставляется с собственными зависимостями и добавлена ​​к шагу выше.

3. Установлена ​​зависимость Foreach, проверьте ее работоспособность и проверьте, не сломалось ли что-либо

Проверьте, загружены ли библиотеки системой:

 ldconfig # update library cache ldconfig -p | grep libcurl # check for library 

В моем случае библиотеки были установлены в папку / usr / local / lib /, которая по умолчанию не включена в пути поиска построителя ссылок. Чтобы исправить это:

 echo "/usr/local/lib/">/etc/ld.so.conf.d/local.conf #add lib search path ldconfig #reload library cache 

Также проверьте, работают ли другие программы, которые используют эту общую библиотеку. В моем случае установка завитка сломала yum, поскольку она отсутствовала ssh и ssl, исправить:

 rm /etc/ld.so.conf.d/local.conf #remove the new libs search path ldconfig #reload yum install openssl-devel #install ssl dependency yum install libssh2-devel #install ssh dependency cd "${INSTALL_PREQ_PATH}lib/libcurl/" #go to libcurl source path ./configure --enable-ares --with-libidn --with-zlib --disable-ipv6 --with-ssl --with-libssh2 # configure build with ssl and ssh make #compile sudo make install #install binary, libs and headers echo "/usr/local/lib/">/etc/ld.so.conf.d/local.conf #add lib search path ldconfig #reload library cache 

4. Создайте свою программу

В моем случае я использовал тот же самый компилятор, который я использовал на ubuntu, gcc-c ++ (g ++). Если он не работает:

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

Другие примечания:

  • Запишите свои шаги, желательно в сценарии bash, чтобы вы могли повторить попытку или (повторно) установить на другой компьютер.
  • Это нехороший совет для производственной машины, запуск испытаний в другом месте.
  • Если вы используете виртуальную машину, сделайте снимки, в противном случае резервное копирование и всегда будьте готовы к сбою
  • Не принимайте мой совет, это то, что сработало для меня, это может не сработать для всех и может быть плохим выбором для других случаев. Я не эксперт, просто пишу, чтобы помочь другим нообам вроде меня 🙂
  • Не удается загрузить окна после установки ubuntu
  • Не удалось скачать видео с YouTube
  • Почему logrotate генерирует пустые файлы журнала при использовании двух подстановочных знаков в пути журнала?
  • Монитор, показывающий тот же рабочий стол дважды
  • Записывайте нажатия клавиш через ssh и сможете воспроизводить их
  • Ограничение сеанса для сервера OpenSSH на Ubuntu Desktop 7.10
  • Как перенести файл в / usr / local в Ubuntu?
  • Получить идентификатор сеанса X
  • Терминал Gnome не будет автозаполнен
  • Мониторинг автоматического обнаружения Ubuntu
  • Что я должен ожидать, если переключиться с Ubuntu на openSuse
  • Linux и Unix - лучшая ОС в мире.