LINUX.ORG.RU

enable-stdcxx-compat

 


0

1

Правильно ли я понимаю, что параметр сборки GCC --enable-stdcxx-compat позволяет больше не класть libgcc_s.so.1 и libstdc++.so.6 вместе с программой?

Первое подозрение у меня возникло при сборке Ttyhlauncher в CentOS 5. Я компильнул Qt 5. Для этого понадобилось подключить репозиторий devtoolset, который позволил обновить GCC с 4.1 до 4.7. При этом готовые бинарники зависят от GLIBC 2.4 и C++ Runtime 4.1. Как так?!

Ну, я компильнул заодно Firefox 40, ./configure который хотел GCC 4.7 или новее. И готовый бинарь запускается в ванильной CentOS! Это очень круто!

Теперь я ищу как собрать GCC таким способом (потому что devtoolset - он только для CentOS. А мне надо для Debian).

★★★★★

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

stdc++compat.cpp:

This file adds the necessary compatibility tricks to avoid symbols with
version GLIBCXX_3.4.11 and bigger, keeping binary compatibility with
libstdc++ 4.3.
Т.е. это просто послабление требований к версии путём перекрытия реализации ряда символов в приложении.

По посту не понятно, есть ли GCC модифицированный для этого или это только хочется такой сделать (или и то и другое). Вообще это такой костыль для эмуляции forward compatibility получился, который, видимо, сделали в Mozilla. Я примерно говорю, так как сейчас этот флаг первый раз увидел и, не найдя его в своём GCC, решил поискать, откуда ноги растут.

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

> Т.е. это просто послабление требований к версии путём перекрытия реализации ряда символов в приложении.

Значит, не это. Бубу искать дальше...

> По посту не понятно, есть ли GCC модифицированный для этого

Есть. Для RHEL/CentOS 5 есть репозиторий devtoolset, в котором доступны новые GCC. Я взял оттуда 4.7. И вот компильнул я первую программу, решил приложить libstdc++.so.6, как это делает Icculus в своих портах игр. И вдруг увидел, что это не нужно! strings libQt5Core.so.5.4.2 | grep LIB выдал такие системные требования, как будто я компилировал системным компилятором! Я сначала не поверил, и попробовал запустить в свежеустановленной системе. Работает!

Тогда я попробовал скомпилировать Firefox 40. В Enterprise Linux 5 есть замечательные патчи для «отвязывания» от GTK 2.18, но от GCC 4.7 программа не «отвязана». GCC лежит прямо в SRPM-ке! Но я его проигнорировал, т.к. у меня уже установлено. Компильнул - и живучесть получившегося Firefox поражает воображение! Не нашлось ни одной версии Linux для этой архитектуры CPU, в котором не заработало!

Вот только моя основная система - Debian 6. GCC я там скомпилировал, и положил в userspace. И с результатам его компиляции приходится прикладывать libstdc++.so.6, чтобы на другом Debian 6 программа запустилась.

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

Есть же флаг -static-libstdc++. Результат в принципе будет тот же, что и при таскании libstdc++.so с собой, только оно будет в самом исполняемом файле.

xaizek ★★★★★
()

А может with-host-libstdcxx?

gcc-4.7.4> ./configure --help | grep std
--with-host-libstdcxx=L use linker arguments L to link with libstdc++ when

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