LINUX.ORG.RU

Помогите приготовить особый GCC

 


0

2

Попробовал запустить разные версии Tor Browser в CentOS 5 (старый комп). В версиях 1.x нормальный Firefox, но Vidalia и Bundled-либы:

Launching Tor Browser Bundle for Linux in /home/username/tor-browser_ru
./App/vidalia: /lib/libc.so.6: version `GLIBC_2.7' not found (required by ./App/vidalia)
./App/vidalia: /lib/libc.so.6: version `GLIBC_2.9' not found (required by /home/username/tor-browser_ru/Lib/libQtGui.so.4)
./App/vidalia: /lib/libc.so.6: version `GLIBC_2.10' not found (required by /home/username/tor-browser_ru/Lib/libQtNetwork.so.4)
./App/vidalia: /lib/libc.so.6: version `GLIBC_2.9' not found (required by /home/username/tor-browser_ru/Lib/libQtCore.so.4)
./App/vidalia: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /home/username/tor-browser_ru/Lib/libcrypto.so.0.9.8)

Exited cleanly. Goodbye

Это фатальная ошибка, которую, тем не менее, можно починить с помощью patchelf.

В версиях 2.x это починили, но одновременно сломали Firefox:

./firefox-bin: /usr/lib/gcc/i586-pc-linux-gnu/4.1.1/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /home/username/tor-browser_ru/App/Firefox/libxul.so)

Это не фатальная ошибка, которая чинится подстановкой правильного libstdc++.so.6 (что я и сделал и запустил программу)

---

А вопрос в следующем. Существует Red Hat Toolset, позволяющий установить в CentOS 5 и 6 - GCC 4.7, 4.8 и 4.9. Я воспользовался этим тулсетом, чтобы скомпилировать Firefox, Qt5 и PCSX2 для старых дистров.

Когда Qt5 успешно докомпилировался, я решил положить libstdc++.so.6 вместе с софтиной, чтобы она работала в системе без всяких там тулсетов. И вдруг:

$ strings libQt5*.so.5.3.2 | grep LIB
GLIBC_2.3
GLIBC_2.0
GLIBC_2.2
GLIBC_2.1
GLIBCXX_3.4
GLIBC_2.1.2
GLIBC_2.4
GLIBC_2.1.3
GLIBC_2.3.3
GLIBC_2.3.2
QT_NO_GLIB
QT_NO_THREADED_GLIB
LD_LIBRARY_PATH
GLIBC_2.0
GLIBC_2.1
GLIBC_2.1.3
GLIBCXX_3.4
GLIBC_2.0
GLIBCXX_3.4
GLIBC_2.3
GLIBC_2.1
GLIBC_2.2.4
GLIBC_2.1.3
LD_LIBRARY_PATH
GLIBC_2.0
GLIBC_2.1.3
GLIBCXX_3.4
GLIBC_2.0
GLIBC_2.1.3
GLIBCXX_3.4
GLIBCXX_3.4
GLIBC_2.0
GLIBC_2.1.3
GLIBC_2.0
GLIBC_2.1
GLIBC_2.1.2
GLIBC_2.1.3
GLIBCXX_3.4

Волшебный GCC 4.7 собрал либу так, что она просто-напросто не требует новый C++ Runtime. А когда я собирал GCC вручную (в Debian), это требовалось.

Как собрать GCC таким образом? Какой ключ сборки включить (вот список)? Вот SPEC-файл gcc48.spec из CentOS 5: http://paste.org.ru/?sh8vyt

★★★★★

Последнее исправление: ZenitharChampion (всего исправлений: 4)

И ещё вопрос по Patchelf

У меня система с KDE3 (кстати, зацените потребление памяти с включенным браузером: http://s31.postimg.org/9gndw4ewr/boost_deps3.png 262 Мб из 502. С выключенным, если кому-нибудь интересно, 65). Я решил побыть тулкитофобом, и вместо Firefox попользоваться opera-10.11.gcc4.shared.qt3.i386.rpm. Однажды наступил день, когда перестал работать https. Пришло время обновляться.

Opera 12.16 сказала что она хочет GLIBC 2.8. Открыл http://distrowatch.com/fedora, узнал что пакет с этой версией можно найти в Fedora 9. Скачал glibc-2.8-3.i686.rpm. Распаковал. Следуя инструкции, пропатчил Opera:

patchelf opera

Запускаю:

LD_LIBRARY_PATH=/home/build/glibc_2.8/lib LD_PRELOAD='/home/build/glibc_2.8/lib/ld-linux.so.2' OPERA_DIR=/usr/share/opera ./opera

Эм... Мне теперь всегда так запускать? Можно ли это как-нибудь упростить?

P.S. Установил в Opensuse 13.2 с KDE3 (https://en.opensuse.org/KDE3) - opera-10.11.gcc4.shared.qt3.i386.rpm . На пару минут установил (сделать скрин). Вдруг я заметил, что https работает. Вот зе фак? Может, в CentOS нужно какой-то пакет в системе обновить?

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 2)

Это зависит не от компилятора, а от того, с какими библиотеками он линкует твои бинарники и шаредлибы. Вон lsbcc/lsbc++ из LSB SDK вообще обертки на шелле, которые вызывают системный gcc (который может быть любым) так, чтобы бинарники линковались с LSB-шными stub-библиотеками. В результате бинарник зависит от контролируемого набора версионных символов glibc и stdlibc++.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

Когда я зашёл в /opt/devtoolset-1.1, там вместо libstdc++.so.6 лежал текстовый файл. Похоже, всё так, как ты и рассказываешь!

А вот так я делал в Debian:

tar xf gmp-6.1.0.tar.xz
cd gmp-6.1.0
CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/mnt/data/gcc-4.9
make -j9
make install
cd ..

tar xf mpfr-3.1.3.tar.xz
cd mpfr-3.1.3
./configure --prefix=/mnt/data/gcc-4.9 --with-gmp=/mnt/data/gcc-4.9
make -j9
make install
cd ..

tar xf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure --prefix=/mnt/data/gcc-4.9 --with-gmp=/mnt/data/gcc-4.9 --with-mpfr=/mnt/data/gcc-4.9
make -j9
make install
cd ..

tar xf ppl-1.1.tar.xz
cd ppl-1.1
./configure  --prefix=/mnt/data/gcc-4.9 --with-gmp-prefix=/mnt/data/gcc-4.9
make -j9
make install
cd ..

make -j9
make install
cd ..

tar xf gcc-4.9.3.tar.bz2
cd gcc-4.9.3
mkdir objdir
cd objdir
export LD_LIBRARY_PATH=/mnt/data/gcc-4.9/lib:$LD_LIBRARY_PATH
../src/gcc-4.5.3/configure --prefix=/mnt/data/gcc-4.9 --enable-languages=c,c++,lto --with-gmp=/mnt/data/gcc-4.9 --with-mpfr=/mnt/data/gcc-4.9 --with-mpc=/mnt/data/gcc-4.9 --with-ppl=/mnt/data/gcc-4.9

Получается, нужно просто удалить файл и скопировать вместо него из CentOS? Я сомневаюсь. Мне кажется что всё упадёт

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 1)

Как-то мне это напоминает предыдущую тему :) Сделано, скорее всего, аналогичным же образом, просто линкуют ещё статическую библиотеку с тем кодом (может даже она в g++ -v ... будет видна отдельно).

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Да, я решил пересоздать тему. Написал более доходчиво, и получил ответ почти сразу

> Сделано, скорее всего, аналогичным же образом, просто линкуют ещё статическую библиотеку с тем кодом

Есть мнение, что лучше положить shared-библиотеки в архив с программой, чем линковать статически. Потому что в случае обнаружения проблем безопасности, либы можно удалить или обновить.

Проверю твоей командой! :-)

ZenitharChampion ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.