LINUX.ORG.RU
ФорумGames

bit.trip.runner-1.0 просит нереального


0

1

Скачал bit.trip.runner-1.0, который я приобрёл вместе с Humble Bundle. Запускаю:

zenitur@linux-athlon64x2:~/bit.trip.runner-1.0/bit.trip.runner> ./bit.trip.runner
./bit.trip.runner: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./bit.trip.runner)
zenitur@linux-athlon64x2:~/bit.trip.runner-1.0/bit.trip.runner> gcc --version
gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]

Не беда, я знаю как поступить. Скачиваю последний libstdc++46-4.6.2_20111026-1.1.4.x86_64.rpm и распаковываю в каталог с игрой:

zenitur@linux-athlon64x2:~/bit.trip.runner-1.0/bit.trip.runner> LD_LIBRARY_PATH=. ./bit.trip.runner
./bit.trip.runner: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libstdc++.so.6)

Ух ты, а это что за ошибка? Я наивно полагал, что если дистрибутив соответствует последнему стандарту LSB, то его libc ну точно всё запускает. А тут - вон оно что, не хочет.

P.S. Что вообще за мода такая: собирать игры в GCC, который день выпуска игры был ну вообще свежим? Может ещё собирать их с библиотеками из Gentoo ~x86 ~amd64, и с gcc-4.7-9999?

P.P.S. Проблемность ситуации в том, что здесь libc просто так не поставишь. Нужно статически собранный в 1 мегабайт, а в дистрибутивах - динамически собранный с кучей маленьких файлов в разных местах системы. В связи с этим вопрос: где взять статическую сборку всех библиотек, с которыми система Linux полностью соответствует стандарту LSB последней редакции?

★★★★★

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

то же хотелось написать, но пршёл вчера мимо ;)

anonymous
()

>Проблемность ситуации в том, что здесь libc просто так не поставишь. Нужно статически собранный в 1 мегабайт

Wrong.

$ file /lib/libc.so.6 
/lib/libc.so.6: symbolic link to `libc-2.13.so'

Но ты можешь статично собрать свежий glibc в отдельный слот(не в отдельный префикс), гента же.

Lighting ★★★★★
()

export LD_LIBRARY_PATH=блаблабла

Отца русской демократии не спасут, если скажем взять эту либс и куда нить распаковать?

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

Т.е. ты щитаешь что даже LD_PRELOAD не поможет?

Вот тут щитают по другому:

В этом случае нам поможет переменная окружения LD_PRELOAD. С ее помощью мы можем указать имя библиотеки, которая должна быть загружена прежде всех остальных библиотек, используемых приложением (даже раньше, чем библиотека libc).

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

п-ц

man 2 execve:

If the executable is a dynamically linked ELF executable, the interpreter named in the PT_INTERP segment is used to load the needed shared libraries. This interpreter is typically /lib/ld-linux.so.1 for binaries linked with the Linux libc 5, or /lib/ld-linux.so.2 for binaries linked with the glibc 2.

теперь-то улавливаешь?
ядро запускает ld.so; оно не ипёт ни о каких переменных окружения, кот-е реализованы в юзерспейсе
этот интерпетатор потом читает твои переменные окружения
по твоей ссылке писано гандоном, чья мать шлюха

anonymous
()
Ответ на: комментарий от Ygor

Статья впервые опубликована в журнале Linux Format

а, ну всё ясно

anonymous
()
Ответ на: комментарий от nutz

> Страдай, засранец

В каком смысле страдать? Что я сделал неправильно? У этой игры не существует ни RPM, ни DEB-пакета. Но тема даже не об этом: я был уверен, что libc имеет обратную совместимость, и если libc.so.6 в системе есть, то он может запустить любую программу, зависящую от libc.so.6. А оказывается, обратной совместимости нет, об этом и тема.

Я был уверен, что только libstdc++.so.6 плохой-нехороший, и часто несовместим сам с собой, а libc.so.6, как какой-нибудь libpng.so.12, если уж есть в системе, то программа, зависящая от неё, заработает. Игру кстати запустил: нашёл статическую сборку libc6.so.6.

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

> Но ты можешь статично собрать свежий glibc в отдельный слот(не в отдельный префикс), гента же.

Не гента:

zenitur@linux-athlon64x2:~/bit.trip.runner-1.0/bit.trip.runner> gcc --version
gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]

Но и здесь тоже можно так сделать. Однако не хочется: здесь же основная версия GCC - 4.5, а не 4.6. Следовательно, все новые программы будут компилироваться в GCC 4.6. Следовательно, я не смогу компилировать свои RPM-пакеты, потому что они не будут запускаться дома. Кроме того, не уверен, что для openSuSE предыдущей версии 11.4 существует RPM-пакеты с GCC 4.6, поэтому придётся устанавливать из SRPM.

Поэтому я лучше так, с помощью LD_LIBRARY_PATH до двух библиотек последних версий, libc6.so.6 и libstdc++.so.6. Работает без извращений даже в openSuSE 10.2 2006 года.

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

> export LD_LIBRARY_PATH=блаблабла

Отца русской демократии не спасут, если скажем взять эту либс и куда нить распаковать?

Проблема в том, что libc это сотни маленьких библиотек по несколько килобайт каждая, если верить словам забаненного aho. Поэтому этот трюк работает только с libstdc++.so.6, а libc6.so.6 нужен скомпилированный статически. Его проблемно найти.

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