LINUX.ORG.RU

Запустить приложение, слинкованое с новый libc на старом дистрибутиве


0

0

Есть бинарь приложения, динамически слинкованный с libc 2.11:

/lib/i686/libc.so.6: version `GLIBC_2.11' not found

а в дистрибутиве лежит 2.10. Обновлять дистрибутив не вариант, пересобирать приложение похоже тоже проблематично.

Есть какая-нибудь стандартная методология по решению проблемы такого рода? - например попробовал скачать пакет с нужной libc из более новой версии дистрибутива, распаковал недалеко, прописал LD_LIBRARY_PATH, но все как-то начало сегфолтиться - есть вообще смысл тратить время на дальнейшие эксперименты или дохлый номер?

★★★★★

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

Поддерживаю - хочу готовый набор библиотек для поддержки последнего стандарта LSB, когда распаковываешь в /usr/lib - и операционная система 2000 года запускает все бинарники 2012-го!

Что я пока выяснил. Заменить libstdc++.so.6 проще всего - более того, многие проприетарные программы несут эту библиотеку с собой. DooM III на случай если в системе libstdc++.so.5, а более новые приложения - на случай, если в системе GCC 4.2, а надо GCC 4.3.

libc.so.6 просто так не перенести - оказывается, это не одна библиотека, а много маленьких. Её можно скомпилировать статически, забаненный aho даже говорил мне, что её невозможно скомпилировать статически полностью. Совершенно неожиданно я обнаружил, что игра Atom Zombie Smasher из Humble Bundle несёт с собой бинарник libc.so.6, и он занимает не 20 Кб, а 1.3 Мб, и он позволяет запускать игру на любой системе! Как сделать это самому - вопрос.

ZenitharChampion ★★★★★
()

Наверное помимо libc придётся много других зависимых библиотек тащить и скармливать с помощью LD_LIBRARY_PATH, раз сегфолтится. Либо в чрут поставить новую версию дистра и запускать приложение из этого чрута. Или в этом же чруте собрать приложение статически, вариантов секса немало.

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

Наверное помимо libc придётся много других зависимых библиотек тащить и скармливать с помощью LD_LIBRARY_PATH, раз сегфолтится

поиграл с ldd, вытащил все нужные библиотеки - теперь:

./mpide-libs/libc.so.6: symbol __libc-enable_secure, version GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference

Этот ld-linux.so.2 похоже какой-то волшебный - я его тоже вытащил в каталог с либами, но для него ldd всегда указывает на /lib/ld-linux.so.2 - напирмер:

] ls
ld-linux.so.2  libc.so.6  libm.so.6  libz.so.1
] ldd libm.so.6 
        /lib/ld-linux.so.2 (0xf76d7000)
        linux-gate.so.1 (0xf76f7000)
        libc.so.6 (0xf7531000)

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

Этот ld-linux.so.2 похоже какой-то волшебный

Верно, это загрузчик библиотек.

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

Как сделать это самому - вопрос.

Почитай как собирается тулчейн в современных версиях LFS. Вопросы отпадут сразу же.

imul ★★★★★
()

Помимо чрута можно ещё контейнер использовать. Но, для этого нужно будет менять ядро.

imul ★★★★★
()

Собрал в этом дистре glibc 2.11 из исходников (т.е. по идее проблем с ld-linux.so.2 быть не должно) - все скомпилялось, но при выведении ее через LD_LIBRARY_PATH вперед все опять сегфолтится - чего им может не хватать? вроде в обратную сторону должна быть какая-то совместимость?

bender ★★★★★
() автор топика

для вас, страдальцы из будущего, зашедшие в этот тред из поисковика.

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

буквально через пару-тройку недель после этого поста в толксах объявили о такой замечательной штуке как CDE (это не античный оконный менеджер солярки):

http://www.pgbovine.net/cde.html

CDE (Code, Data, and Environment packaging) is a tool that automatically packages up everything required to execute a Linux command on another computer without any installation or configuration. A command can range from something as simple as a command-line utility to a sophisticated GUI application with 3D graphics. The only requirement is that the other computer have the same hardware architecture (e.g., x86) and major kernel version (e.g., 2.6.X) as yours. CDE allows you to easily run programs without the dependency hell that inevitably occurs when attempting to install software or libraries.

CDE is easy to use: Simply prepend any Linux command (or series of commands) with 'cde', and CDE will execute that command, monitor its actions, and automatically copy all files it accesses (e.g., executables, dynamically linked/loaded libraries, plug-ins, scripts, configuration/data files) into a package within your current working directory. Now you can transfer that CDE package to another computer and run that same command without installing anything. In short, if you can run a set of Linux commands on your computer, then CDE enables others to run it on theirs.

You can use CDE to:

1. easily share prototype software 2. try out software in non-native environments 3. perform reproducible research 4. deploy applications to cluster or cloud computing 5. submit executable bug reports 6. package up class programming assignments

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

Yes, cde solves glibc incompatibility problems since it wraps up glibc in the package too!

Попробовать его на моем юскейсе уже не привелось - подвернулась возможность обновить дистр в требуемом месте.

мечу как «решено», но со знаком вопроса

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