LINUX.ORG.RU

Скомпилять libSDL с минимумом зависимостей

 , , , ,


0

1

Я решил компилять опенсорсное ПО с glibc 2.5, но с новыми либами. Так бинарники будут запускаться в бóльшем количестве дистрибутивов Linux. Взял CentOS 5.10 x86 и x86_64, начал эксперимент на Syobon Action (Neko Mario). Скомпилял на 32 битах, создал каталог libдля зависимостей, сделал run.sh и файлы .desktop и значков.

Неожиданно я заметил что libSDL с сайта http://www.libsdl.org/ (а SDL_image, sound, mixer, net и ttf отсюда: http://www.libsdl.org/projects/) имеет гораздо меньшее количество зависимостей, чем дистрибутивный (кроме того, он последней версии):

ldd /usr/lib64/libSDL-1.2.so.0.11.4 
        linux-vdso.so.1 =>  (0x00007fff3327c000)
        libm.so.6 => /lib64/libm.so.6 (0x00002b8b13126000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00002b8b133a9000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b8b135ae000)
        libc.so.6 => /lib64/libc.so.6 (0x00002b8b137ca000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b8b12c43000)

Красиво, не правда ли? При этом иксы, OSS и ALSA библиотека умеет, но не «прибита гвоздями» к ним. Вероятно что используется dlopen.

Когда я начал собирать 64-битный бинарник выяснилось что крутой libSDL с сайта:

# rpm -ivh SDL-1.2.15-1.x86_64.rpm
error: Failed dependencies:
        libc.so.6(GLIBC_2.14)(64bit) is needed by SDL-1.2.15-1.x86_64

Хотя 32-битный установился. Налажали немного. Пересобрал из SRPM-ки и всем доволен. Кроме этого:

checking for OSS audio support... yes
checking for dmedia audio support... no
checking for ALSA CFLAGS... 
checking for ALSA LDFLAGS...  -lasound -lm -ldl -lpthread
checking for libasound headers version >= 0.9.0... found.
checking for snd_ctl_open in -lasound... yes
-- dynamic libasound -> libasound.so.2
checking for artsc-config... /usr/bin/artsc-config
checking for aRts development environment... yes
-- dynamic libartsc -> libartsc.so.0
checking for esd-config... /usr/bin/esd-config
checking for ESD - version >= 0.2.8... yes
-- dynamic libesd -> libesd.so.0
checking for pkg-config... /usr/bin/pkg-config
checking for PulseAudio 0.9 support... no
checking audio/audiolib.h usability... no
checking audio/audiolib.h presence... no
checking for audio/audiolib.h... no
checking for AuOpenServer in -laudio... no
checking for NAS audio support... no
checking for X... libraries /usr/lib64, headers 
checking whether -R must be followed by a space... neither works
checking for gethostbyname... yes
checking for connect... yes
checking for remove... yes
checking for shmat... yes
checking for IceConnectionNumber in -lICE... yes
-- dynamic libX11 -> libX11.so.6
-- dynamic libX11ext -> libXext.so.6
checking for X11/extensions/Xrandr.h... yes
-- dynamic libXrender -> libXrender.so.1
-- dynamic libXrandr -> libXrandr.so.2
checking for framebuffer console support... yes
checking for getpagesize... yes
checking for PlayStation 2 GS support... no
checking for PlayStation 3 Cell support... no
checking for libVGL support... no
checking for wscons support... no
checking for OpenGL (GLX) support... yes
checking for Linux 2.4 unified input interface... yes
checking for Touchscreen library support... no
checking for hid_init in -lusbhid... no
checking usb.h usability... yes
checking usb.h presence... yes
checking for usb.h... yes
checking libusb.h usability... no
checking libusb.h presence... no
checking for libusb.h... no
checking for hid_init in -lusb... no
checking for usbhid... no
checking for pthreads... yes
checking for recursive mutexes... yes
checking for pthread semaphores... yes
checking for sem_timedwait... yes
checking linux/version.h usability... yes
checking linux/version.h presence... yes
checking for linux/version.h... yes
checking for GCC -Wall option... yes
checking for necessary GCC -Wno-multichar option... no
configure: creating ./config.status

А пульса желательна. Не вопрос - пересобрал с ней. Теперь ldd такой:

# ldd /usr/lib64/libSDL-1.2.so.0.11.4 
        linux-vdso.so.1 =>  (0x00007fff5c376000)
        libm.so.6 => /lib64/libm.so.6 (0x00002b82846b8000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00002b828493b000)
        libpulse-simple.so.0 => /usr/lib64/libpulse-simple.so.0 (0x00002b8284b40000)
        libpulse.so.0 => /usr/lib64/libpulse.so.0 (0x00002b8284d4d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b8284f9b000)
        libc.so.6 => /lib64/libc.so.6 (0x00002b82851b8000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b82841d2000)
        libcap.so.1 => /lib64/libcap.so.1 (0x00002b8285511000)
        librt.so.1 => /lib64/librt.so.1 (0x00002b8285715000)
        libSM.so.6 => /usr/lib64/libSM.so.6 (0x00002b828591f000)
        libICE.so.6 => /usr/lib64/libICE.so.6 (0x00002b8285b29000)
        libX11.so.6 => /usr/lib64/libX11.so.6 (0x00002b8285d44000)
        libXau.so.6 => /usr/lib64/libXau.so.6 (0x00002b8286051000)
        libXdmcp.so.6 => /usr/lib64/libXdmcp.so.6 (0x00002b8286253000)

Блин, что так некрасиво? Как можно собрать libSDL с пульсой без жёсткой зависимости?

P.S. Бинарники на тестирование.

★★★★★

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

Тема интересна.

P.S. Бинарники на тестирование. P.P.S. Вот зе фак! Они хотят libpng.so.3. Откуда он вообще взялся?! Я его удалил и пересобрал libSDL, а он всё равно продолжает его хотеть! Кто сталкивался? Как чинить?

А посмотри, что выдаёт sdl-config --libs и sdl-config --static-libs. Ещё вариант - приложение использует libSDL_Image, который в свою очередь обязательно должен иметь зависимость от libpng.

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

Помогла пересборка RPM-пакета с libpng с опцией --without-libpng-compat. Сейчас пересобираю остальное.

По поводу основного вопроса дал надежды хелп к ./configure libSDL. --enable-pulseaudio и --enable-pulseaudio-shared. Второе не включено по дефолту, а у ALSA, например, включено. Попробовал. Ничего не изменилось.

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

Не помогла пересборка без libpng3, что-то её всё равно хочет :-( Пошёл гуглить команду грамотного грепа зависимостей /usr/lib от неё.

EXL, именно так и пробовал, оба параметра вместе.

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

Да не, бинарники были бы здоровенные.

Проблему нашёл и решил, нужно было пересобрать системный libpng без Legacy, а потом пересобрать SDL_image. Обновил ссылку на бинарник, можно тестировать и играть.

Только вот звука нет. Пишет:

./run.sh
Unable to init SDL_mixer: Couldn't open audio device: Device or resource busy

Честно говоря, у меня эта игра никогда не работала через ALSA, я стал это замечать когда эмуляцию OSS стали отключать в дистрибутивах Linux. Пересобрал SDL с --disable-oss, также позапрещал всякие там esd и arts. Оставил только ALSA. Всё равно не работает. Похоже что без правки исходника тут не обойтись.

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

Нет.

  --enable-pulseaudio     use PulseAudio [[default=yes]]
  --enable-pulseaudio-shared     dynamically load PulseAudio support [[default=yes]]

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

именно так и пробовал, оба параметра вместе.

Как-то странно у тебя получается. У меня нету таких зависимостей. Я конфигурировал SDL'ку так:

./configure --disable-pulseaudio --enable-pulseaudio-shared \
    --enable-x11-shared --disable-video-directfb --disable-input-tslib \
    --prefix=/home/exl/Projects/mySDL

В итоге:

exl@exl-Lenovo-G560e:~/SandBox/SDL-1.2.15 > ldd ./build/.libs/libSDL-1.2.so.0.11.4
        linux-vdso.so.1 =>  (0x00007fff151f7000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fca55c5e000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fca55a5a000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fca5583c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fca55474000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fca5621d000)

Как проверить, что пульса подгружается через dlopen?

EXL ★★★★★
()

Проверь мой бинарник на тестирование: Download x64. Собирал правда не на CentOS 5.

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

Проверить командой strings libSDL-1.2.so.0.11.4 | grep pulse. Только что проверил, пульсы нет. А ещё её нет в выводе ./configure, что окончательно убирает сомнения.

Решил оставить всё как есть. PulseAudio умеет ALSA-only программы. Только обидно что ну есть же поддержка, а воспользоваться не получается. Твой бинарник пока не попробовал.

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

Решено

Я не знаю как я это решил. Может, в репозитории EPEL обновили libpulse. Может, мейнтейнеры SDL почитывают ЛОР, и оперативно пофиксили исходный код! Может, когда я не стал явно уточнять, что libpulse мне нужен, он подцепился автоматически, и подцепился правильно. Теперь вывод такой:

$ ldd libSDL-1.2.so.0.11.4 
        linux-gate.so.1 =>  (0x009e0000)
        libm.so.6 => /lib/libm.so.6 (0x006a0000)
        libdl.so.2 => /lib/libdl.so.2 (0x00599000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x004ec000)
        libc.so.6 => /lib/libc.so.6 (0x00e3a000)
        /lib/ld-linux.so.2 (0x00adb000)
$ strings libSDL-1.2.so.0.11.4 | grep lib
libm.so.6
libdl.so.2
libpthread.so.0
libc.so.6
libSDL-1.2.so.0
libasound.so.2
libartsc.so.0
libesd.so.0
libpulse-simple.so.0
libX11.so.6
libXext.so.6
libXrender.so.1
libXrandr.so.2
libGL.so.1
/usr/X11R6/lib/X11/Metro/.version

Кстати, зацените мои сборки эмулятора PCSX2 и лаунчера Minecraft для сервера Ttyh, которые я положил сюда!

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