On Sun, May 17, 2009 at 06:07:08PM +0400, Sergey Vlasov wrote: > On Sun, May 17, 2009 at 10:12:09AM +0400, Alexey Tourbin wrote: > > После обновления libalsa что-то сломалось в symbol versioning. > > > > [at@altair ~]$ rpmpeek /ALT/archive/Sisyphus/2009/05/01/files/x86_64/RPMS/libalsa-1.0.19-alt1.x86_64.rpm readelf -aW ./usr/lib64/libasound.so.2 |grep -w snd_pcm_hw_params_get_channels > > 231: 00000000000519d0 31 FUNC GLOBAL DEFAULT 12 snd_pcm_hw_params_get_channels@ALSA_0.9 > > 233: 00000000000519c0 15 FUNC GLOBAL DEFAULT 12 snd_pcm_hw_params_get_channels@@ALSA_0.9.0rc4 > > [at@altair ~]$ rpmpeek /ALT/Sisyphus/files/x86_64/RPMS/libalsa-1.0.20-alt1.x86_64.rpm readelf -aW ./usr/lib64/libasound.so.2 |grep -w snd_pcm_hw_params_get_channels > > 493: 0000000000051080 15 FUNC WEAK DEFAULT 12 snd_pcm_hw_params_get_channels@@ALSA_0.9.0rc4 > > [at@altair ~]$ > > > > Похоже, что это связано не с изменениями в libalsa, а с изменениями > > в binutils. > > Скорее как раз в libalsa или libtool: > > http://git.altlinux.org/tasks/6474/build/1/x86_64/log > > checking for versioned symbols... grep: libtool: No such file or directory > ./configure: line 12212: test: too many arguments > ./configure: line 12215: test: -gt: unary operator expected > broken libtool - use libtool v1.4+; no versions На самом деле там несколько ошибок, одна из которых (сломавшаяся проверка версии libtool) вызвала проявление второй (неверная информация в Versions.in). Проверка в configure.in сейчас выглядит следующим образом: dnl Check for versioned symbols AC_MSG_CHECKING(for versioned symbols) AC_ARG_WITH(versioned, AS_HELP_STRING([--with-versioned], [shared library will be compiled with versioned symbols (default = yes)]), versioned="$withval", versioned="yes") if test "$versioned" = "yes"; then # it seems that GNU ld versions since 2.10 are not broken xres=$macro_version major=`echo $xres | cut -d . -f 1` minor=`echo $xres | cut -d . -f 2` pass=0 if test $major -eq 1 -a $minor -gt 3; then pass=1 else if test $major -gt 1; then pass=1 fi fi if test $pass -eq 1; then AC_DEFINE(VERSIONED_SYMBOLS,,[compiled with versioned symbols]) AC_MSG_RESULT(yes) else AC_MSG_RESULT(broken libtool - use libtool v1.4+; no versions) fi else AC_MSG_RESULT(no) fi AM_CONDITIONAL(VERSIONED_SYMBOLS, test x$versioned = xyes) (раньше xres=... был другой, там и происходили ошибки). При этом, если тест версии libtool не проходил, получалось, что AC_DEFINE(VERSIONED_SYMBOLS) не определялся, но на AM_CONDITIONAL(VERSIONED_SYMBOLS) это не влияло; в результате в src/Makefile.am в любом случае ставилось VSYMS = -Wl,--version-script=Versions При отсутствии AC_DEFINE(VERSIONED_SYMBOLS) в коде libalsa версии символов не назначаются при компиляции (см. include/alsa-symbols.h), в этом случае для каждого символа может существовать только одна версия, которая назначается в файле src/Versions.in при сборке разделяемой библиотеки. Однако для некоторых символов snd_pcm_sw_params_* (список в src/pcm/pcm.c, для них используется макрос OBSOLETE1) в src/Versions.in не прописана версия ALSA_0.9.0rc4, в результате при такой сборке для них по умолчанию назначается версия ALSA_0.9, что неправильно. Других изменений в ABI существовавших ранее функций в libalsa не было (только добавления новых функций), поэтому, если бы не эта ошибка в Versions.in, сборка без поддержки symbol versioning никак бы не проявилась (перестали бы работать только очень старые бинарники, собранные с древними версиями libalsa до 0.9.0rc4). В нормальной ситуации эта ошибка не проявляется, поскольку версии назначаются при компиляции через asm(".symver ..."). Пересобирать бинарники, собранные с неправильной версией libalsa, необходимо, иначе при вызовах функций snd_pcm_sw_params_*, для которых была установлена неправильная версия, они будут падать.