Здравствуйте. Допустим, я делаю проприетарную программу для Linux. Хочу, чтобы она запускалась на как можно большем количестве дистрибутивов, распространяю в виде tar.gz с каталогом файлов программы. С какими параметрами нужно компилировать программу? При этом её нельзя распространять как статическую сборку, потому что зависит от OpenGL, и потому что тогда она включит в себя старый glibc с уязвимостями безопасности.
Первая проблема - в зависимостях. Вот игра gish: официальный бинарник, и бинарник, скомпилированный мной на основе открытого исходного кода:
zenitur@athlon_neo ~/gish153 $ ldd gish
linux-gate.so.1 =>
libGL.so.1 => /usr/lib32/opengl/ati/lib/libGL.so.1
libSDL-1.2.so.0 => /usr/lib32/libSDL-1.2.so.0
libopenal.so.1 => /usr/lib32/libopenal.so.1
libvorbis.so.0 => /usr/lib32/libvorbis.so.0
libogg.so.0 => /usr/lib32/libogg.so.0
libvorbisfile.so.3 => /usr/lib32/libvorbisfile.so.3
libc.so.6 => /lib32/libc.so.6
libm.so.6 => /lib32/libm.so.6
libpthread.so.0 => /lib32/libpthread.so.0
libXext.so.6 => /usr/lib32/libXext.so.6
libgcc_s.so.1 => /lib32/libgcc_s.so.1
libdl.so.2 => /lib32/libdl.so.2
librt.so.1 => /lib32/librt.so.1
/lib/ld-linux.so.2
libX11.so.6 => /usr/lib32/libX11.so.6
libxcb.so.1 => /usr/lib32/libxcb.so.1
libXau.so.6 => /usr/lib32/libXau.so.6
libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6
zenitur@athlon_neo ~/gish153 $ ldd gish64
linux-vdso.so.1 =>
libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0
libpthread.so.0 => /lib/libpthread.so.0
libopenal.so.1 => /usr/lib/libopenal.so.1
libGLU.so.1 => /usr/lib/libGLU.so.1
libGL.so.1 => /usr/lib64/opengl/ati/lib/libGL.so.1
libSM.so.6 => /usr/lib/libSM.so.6
libICE.so.6 => /usr/lib/libICE.so.6
libX11.so.6 => /usr/lib/libX11.so.6
libXext.so.6 => /usr/lib/libXext.so.6
libvorbis.so.0 => /usr/lib/libvorbis.so.0
libvorbisfile.so.3 => /usr/lib/libvorbisfile.so.3
libpng14.so.14 => /usr/lib/libpng14.so.14
libz.so.1 => /lib/libz.so.1
libc.so.6 => /lib/libc.so.6
libm.so.6 => /lib/libm.so.6
libasound.so.2 => /usr/lib/libasound.so.2
libaudio.so.2 => /usr/lib/libaudio.so.2
libggi.so.2 => /usr/lib/libggi.so.2
libaa.so.1 => /usr/lib/libaa.so.1
libdl.so.2 => /lib/libdl.so.2
libcaca.so.0 => /usr/lib/libcaca.so.0
/lib64/ld-linux-x86-64.so.2
librt.so.1 => /lib/librt.so.1
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6
libgcc_s.so.1 => /lib/libgcc_s.so.1
libuuid.so.1 => /lib/libuuid.so.1
libxcb.so.1 => /usr/lib/libxcb.so.1
libogg.so.0 => /usr/lib/libogg.so.0
libXt.so.6 => /usr/lib/libXt.so.6
libXau.so.6 => /usr/lib/libXau.so.6
libncurses.so.5 => /lib/libncurses.so.5
libXxf86vm.so.1 => /usr/lib/libXxf86vm.so.1
libgii.so.1 => /usr/lib/libgii.so.1
libXxf86dga.so.1 => /usr/lib/libXxf86dga.so.1
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6
libgg.so.1 => /usr/lib/libgg.so.1
libncursesw.so.5 => /lib/libncursesw.so.5
libglut.so.3 => /usr/lib/libglut.so.3
zenitur@athlon_neo ~/gish153 $
Разница есть. Первый бинарник зависит от небольшого количества библиотек, и все они есть в любой системе. Второй запустится только на моей системе.
Часто те библиотеки, без которых никак, но которые есть не у всех, кладутся либо рядом с игрой:
zenitur@athlon_neo /usr/games/braid $ ldd braid
linux-vdso.so.1 =>
libpthread.so.0 => /lib/libpthread.so.0
libCg.so => /usr/games/braid/libCg.so
libCgGL.so => /usr/games/braid/libCgGL.so
libGL.so.1 => /usr/lib64/opengl/ati/lib/libGL.so.1
libSDL-1.2.so.0 => /usr/games/braid/libSDL-1.2.so.0
libstdc++.so.6 => /usr/games/braid/libstdc++.so.6
libm.so.6 => /lib/libm.so.6
libgcc_s.so.1 => /usr/games/braid/libgcc_s.so.1
libc.so.6 => /lib/libc.so.6
/lib64/ld-linux-x86-64.so.2
libXext.so.6 => /usr/lib/libXext.so.6
libdl.so.2 => /lib/libdl.so.2
libX11.so.6 => /usr/lib/libX11.so.6
libxcb.so.1 => /usr/lib/libxcb.so.1
libXau.so.6 => /usr/lib/libXau.so.6
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6
zenitur@athlon_neo /usr/games/braid $
Либо в каталог libs, и игра запускается не бинарником, а скриптом запуска LD_LIBRARY_PATH=./libs game:
zenitur@athlon_neo ~/NewSupaplex $ ldd NewSupaplexX
linux-vdso.so.1 =>
libclanApp.so.1 => not found
libclanGL.so.1 => not found
libclanGUI.so.1 => not found
libclanDisplay.so.1 => not found
libclanCore.so.1 => not found
libclanSignals.so.1 => not found
libbass.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6
libm.so.6 => /lib/libm.so.6
libgcc_s.so.1 => /lib/libgcc_s.so.1
libc.so.6 => /lib/libc.so.6
libGL.so.1 => /usr/lib64/opengl/ati/lib/libGL.so.1
libpthread.so.0 => /lib/libpthread.so.0
/lib64/ld-linux-x86-64.so.2
libXext.so.6 => /usr/lib/libXext.so.6
libX11.so.6 => /usr/lib/libX11.so.6
libxcb.so.1 => /usr/lib/libxcb.so.1
libdl.so.2 => /lib/libdl.so.2
libXau.so.6 => /usr/lib/libXau.so.6
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6
zenitur@athlon_neo ~/NewSupaplex $ cat run.sh
#!/bin/sh
export LD_LIBRARY_PATH=./Lib:/usr/local/lib:$LD_LIBRARY_PATH
exec ./NewSupaplexX $*
zenitur@athlon_neo ~/NewSupaplex $ cd Lib/
zenitur@athlon_neo ~/NewSupaplex/Lib $ ls
libbass.so libclanGL.so.1 libjpeg.so.62
libclanApp.so.1 libclanGUI.so.1 libpng12.so.0
libclanCore.so.1 libclanGUIStyleSilver.so.1
libclanDisplay.so.1 libclanSignals.so.1
zenitur@athlon_neo ~/NewSupaplex/Lib $
Minimum Requirements
Operating System: 2.2.x or better Linux kernel with glibc-2.1 or later and X-Windows (XFree86 3.3.x or later)
Processor: 1.0 GHz x86 Processor
Memory: 256 MB
Disc Space: 3.7 GB
CD Rom: 1 x DVD Rom
Graphics Card: Hardware Accelerated 3D Graphics card with 32 MB video memory
Sound Card: OSS or ALSA Compatible
Java. Тоже один пакет rpm/deb, и работает везде. Тот что deb не знаю где, а rpm скомпилирован в SuSE 9. В дистрибутиве 2000 года конечно не запустится, но можно сказать, что запускается в любом. OpenOffice.org. Я когда-то заказывал диск с ним, тогда ещё amd64 не был повсеместен, как и deb, и на нём лежал пакет RPM, который работал везде. Сейчас всё так же, только добавились deb и x86_64.
Как вообще это осуществляется? Что почитать? Есть же какие-то статьи, старые и новые, в том числе и на русском языке. Я не нашёл. Решил спросить здесь. Хотелось бы так же попрактиковаться, и сделать сборку какой-либо свободной Linux-овой программы, которая запустится везде. Хочется знать тонкости: когда-то в Mandrake с новым ядром 2.6 у меня сбоили маленькие линуксовые гонки из Интернета (я думал что из-за ядра, хотя я наверное не прав). А недавно в теме про игру Jasper кто-то писал о проблемах с glibc 2.4. Я так понял, что запустилось, но с ошибками в работе. Хочу попрактиковаться: взять исходник Linux-овой программы с определённым набором зависимостей, и сделать из неё бинарник, который запустится во всех дистрибутивах, не применяя статическую линковку. В крайнем случае положить необходимые библиотеки в архив, и я не знаю как это сделать.