LINUX.ORG.RU

История изменений

Исправление 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()

Можешь посмотреть, и по возможности исправить? Ссылку на страницу бага я давал выше...