История изменений
Исправление ZenitharChampion, (текущая версия) :
saahriktu, можешь помочь? Я создавал баг, но моего английского не хватило, чтобы грамотно его описать. В итоге, его закрыли как Invalid.
Давай мысленно перенесёмся в 2007. Есть 32-битные дистрибутивы Linux, и там в /usr/lib
находятся 32-битные либы. А в 64-битных есть нюанс в зависимости от того, на RPM ли пакетах базируется дистр, или на DEB
В Debian и Ubuntu:
/usr/lib32
и /usr/lib
В Fedora Core и openSUSE:
/usr/lib
и /usr/lib64
Два разных подхода! В Ubuntu в /usr/lib
лежат 64-битные либы, а в Fedora Code в /usr/lib
лежат 32-битные!
./configure
от SDL это нормально обрабатывает, когда ищет все зависимости: ALSA, ESD, arts, x11. Затем в SDL 1.2 добавили поддержку PulseAudio, и для этой либы не всё работает корректно. Эта библиотека отлично обнаруживается, если в /usr/lib
лежат 64-битные либы. А если там 32-битные либы (а система 64-битная) то... тоже отлично обнаруживается, но есть нюанс
./configure
всё-таки обнаруживает libpulse, но линкуется с этой либой не при помощи dlopen()
, а как обычно... Вот беру я CentOS 6. Теперь, если скомпилировать libSDL без неё, то ldd выглядит так:
linux-vdso.so.1 (0x00007fff571fe000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd76e2a6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fd76e0a1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd76de85000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd76dad8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd76e873000)
А если с ней:
linux-vdso.so.1 => (0x00007ffff2990000)
libm.so.6 => /lib64/libm.so.6 (0x00002b5419bd9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b5419e5c000)
libpulse-simple.so.0 => /usr/lib64/libpulse-simple.so.0 (0x00002b541a061000)
libpulse.so.0 => /usr/lib64/libpulse.so.0 (0x00002b541a26e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b541a4bc000)
libc.so.6 => /lib64/libc.so.6 (0x00002b541a6d9000)
/lib64/ld-linux-x86-64.so.2 (0x00000031d0e00000)
libcap.so.1 => /lib64/libcap.so.1 (0x00002b541aa32000)
librt.so.1 => /lib64/librt.so.1 (0x00002b541ac36000)
libSM.so.6 => /usr/lib64/libSM.so.6 (0x00002b541ae40000)
libICE.so.6 => /usr/lib64/libICE.so.6 (0x00002b541b04a000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x00002b541b265000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x00002b541b572000)
libXdmcp.so.6 => /usr/lib64/libXdmcp.so.6 (0x00002b541b774000)
strings libSDL-1.2.so.0 | 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 !!! New dependency
libX11.so.6
libXext.so.6
libXrender.so.1
libXrandr.so.2
libGL.so.1
Таким образом, libpulse становится комбо-брейкером, ломающим всю динамическую линковку! Причина - в том, что Icculus (один из разработчиков SDL) добавлял поддержку «Пульсы» в поздние 00-е. Icculus в 2005 перешёл со Slackware на Ubuntu. А все остальные зависимости были добавлены в годы, когда Red Hat был популярнее Ubuntu, и поэтому 64-битные зависимости обрабатывались корректно на нём.
Я проверил: в 64-битном CentOS зашёл в /usr/lib
(там 32-битные либы) и сделал симлинки libpulse.so
и libpulse-simple.so
на 64-битные. И тогда вывод ./configure
изменился:
Было:
...
-- 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... yes
checking audio/audiolib.h usability... no
...
Стало:
...
-- 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... yes
-- dynamic libpulse-simple -> libpulse-simple.so.0
checking audio/audiolib.h usability... no
...
Получился бинарник, в котором libpulse тоже стал подгружаться при помощи dlopen()
Можешь посмотреть, и по возможности исправить? Ссылку на страницу бага я давал выше...
Исправление ZenitharChampion, :
saahriktu, можешь помочь? Я создавал баг, но моего английского не хватило, чтобы грамотно его описать. В итоге, его закрыли как Invalid.
Давай мысленно перенесёмся в 2007. Есть 32-битные дистрибутивы Linux, и там в /usr/lib
находятся 32-битные либы. А в 64-битных есть нюанс в зависимости от того, на RPM ли пакетах базируется дистр, или на DEB
В Debian и Ubuntu:
/usr/lib
и /usr/lib32
В Fedora Core и openSUSE:
/usr/lib
и /usr/lib64
Два разных подхода! В Ubuntu в /usr/lib
лежат 64-битные либы, а в Fedora Code в /usr/lib
лежат 32-битные!
./configure
от SDL это нормально обрабатывает, когда ищет все зависимости: ALSA, ESD, arts, x11. Затем в SDL 1.2 добавили поддержку PulseAudio, и для этой либы не всё работает корректно. Эта библиотека отлично обнаруживается, если в /usr/lib
лежат 64-битные либы. А если там 32-битные либы (а система 64-битная) то... тоже отлично обнаруживается, но есть нюанс
./configure
всё-таки обнаруживает libpulse, но линкуется с этой либой не при помощи dlopen()
, а как обычно... Вот беру я CentOS 6. Теперь, если скомпилировать libSDL без неё, то ldd выглядит так:
linux-vdso.so.1 (0x00007fff571fe000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd76e2a6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fd76e0a1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd76de85000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd76dad8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd76e873000)
А если с ней:
linux-vdso.so.1 => (0x00007ffff2990000)
libm.so.6 => /lib64/libm.so.6 (0x00002b5419bd9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b5419e5c000)
libpulse-simple.so.0 => /usr/lib64/libpulse-simple.so.0 (0x00002b541a061000)
libpulse.so.0 => /usr/lib64/libpulse.so.0 (0x00002b541a26e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b541a4bc000)
libc.so.6 => /lib64/libc.so.6 (0x00002b541a6d9000)
/lib64/ld-linux-x86-64.so.2 (0x00000031d0e00000)
libcap.so.1 => /lib64/libcap.so.1 (0x00002b541aa32000)
librt.so.1 => /lib64/librt.so.1 (0x00002b541ac36000)
libSM.so.6 => /usr/lib64/libSM.so.6 (0x00002b541ae40000)
libICE.so.6 => /usr/lib64/libICE.so.6 (0x00002b541b04a000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x00002b541b265000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x00002b541b572000)
libXdmcp.so.6 => /usr/lib64/libXdmcp.so.6 (0x00002b541b774000)
strings libSDL-1.2.so.0 | 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 !!! New dependency
libX11.so.6
libXext.so.6
libXrender.so.1
libXrandr.so.2
libGL.so.1
Таким образом, libpulse становится комбо-брейкером, ломающим всю динамическую линковку! Причина - в том, что Icculus (один из разработчиков SDL) добавлял поддержку «Пульсы» в поздние 00-е. Icculus в 2005 перешёл со Slackware на Ubuntu. А все остальные зависимости были добавлены в годы, когда Red Hat был популярнее Ubuntu, и поэтому 64-битные зависимости обрабатывались корректно на нём.
Я проверил: в 64-битном CentOS зашёл в /usr/lib
(там 32-битные либы) и сделал симлинки libpulse.so
и libpulse-simple.so
на 64-битные. И тогда вывод ./configure
изменился:
Было:
...
-- 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... yes
checking audio/audiolib.h usability... no
...
Стало:
...
-- 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... yes
-- dynamic libpulse-simple -> libpulse-simple.so.0
checking audio/audiolib.h usability... no
...
Получился бинарник, в котором libpulse тоже стал подгружаться при помощи dlopen()
Можешь посмотреть, и по возможности исправить? Ссылку на страницу бага я давал выше...
Исходная версия ZenitharChampion, :
saahriktu, можешь помочь? Я создавал баг, но моего английского не хватило, чтобы грамотно его описать. В итоге, его закрыли как Invalid.
Давай мысленно перенесёмся в 2007. Есть 32-битные дистрибутивы Linux, и там в /usr/lib
находятся 32-битные либы. А в 64-битных есть нюанс в зависимости от того, на RPM ли пакетах базируется дистр, или на DEB
В Debian и Ubuntu:
/usr/lib
и /usr/lib32
В Fedora Core и openSUSE:
/usr/lib
и /usr/lib64
Два разных подхода! В Ubuntu в /usr/lib
лежат 64-битные либы, а в Fedora Code в /usr/lib
лежат 32-битные!
./configure
от SDL это нормально обрабатывает, когда ищет все зависимости: ALSA, ESD, arts, x11. Затем в SDL 1.2 добавили поддержку PulseAudio, и для этой либы не всё работает корректно. Эта библиотека отлично обнаруживается, если в /usr/lib
лежат 64-битные либы. А если там 32-битные либы (а система 64-битная) то... тоже отлично обнаруживается, но есть нюанс
./configure
всё-таки обнаруживает libpulse, но линкуется с этой либой не при помощи dlopen()
, а как обычно... Вот беру я CentOS 6. Теперь, если скомпилировать libSDL без неё, то ldd выглядит так:
linux-vdso.so.1 (0x00007fff571fe000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd76e2a6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fd76e0a1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd76de85000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd76dad8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd76e873000)
А если с ней:
linux-vdso.so.1 => (0x00007ffff2990000)
libm.so.6 => /lib64/libm.so.6 (0x00002b5419bd9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b5419e5c000)
libpulse-simple.so.0 => /usr/lib64/libpulse-simple.so.0 (0x00002b541a061000)
libpulse.so.0 => /usr/lib64/libpulse.so.0 (0x00002b541a26e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b541a4bc000)
libc.so.6 => /lib64/libc.so.6 (0x00002b541a6d9000)
/lib64/ld-linux-x86-64.so.2 (0x00000031d0e00000)
libcap.so.1 => /lib64/libcap.so.1 (0x00002b541aa32000)
librt.so.1 => /lib64/librt.so.1 (0x00002b541ac36000)
libSM.so.6 => /usr/lib64/libSM.so.6 (0x00002b541ae40000)
libICE.so.6 => /usr/lib64/libICE.so.6 (0x00002b541b04a000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x00002b541b265000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x00002b541b572000)
libXdmcp.so.6 => /usr/lib64/libXdmcp.so.6 (0x00002b541b774000)
strings libSDL-1.2.so.0 | 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 !!! New dependency
libX11.so.6
libXext.so.6
libXrender.so.1
libXrandr.so.2
libGL.so.1
Таким образом, libpulse становится комбо-брейкером, ломающим всю динамическую линковку! Причина - в том, что Icculus (один из разработчиков SDL) добавлял поддержку «Пульсы» в поздние 00-е. Icculus в 2005 перешёл со Slackware на Ubuntu. А все остальные зависимости были добавлены в годы, когда Red Hat был популярнее Ubuntu, и поэтому 64-битные зависимости обрабатывались корректно на нём.
Я проверил: в 64-битном CentOS зашёл в /usr/lib
(там 32-битные либы) и сделал симлинки libpulse.so
и libpulse-simple.so
на 64-битные. И тогда вывод ./configure
изменился:
Было:
...
-- 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... yes
checking audio/audiolib.h usability... no
...
Стало:
...
-- 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... yes
-- dynamic libpulse-simple -> libpulse-simple.so.0
checking audio/audiolib.h usability... no
...
Получился бинарник, в котором libpulse тоже стал подгружаться при помощи dlopen()
Можешь посмотреть, и по возможности исправить? Ссылку на страницу бага я давал выше...