[devel] libalsa (FAILED mplayer.git=1.0-alt35.29311.1)

Sergey Vlasov vsu на altlinux.ru
Вс Май 17 19:20:03 MSD 2009


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_*, для которых
была установлена неправильная версия, они будут падать.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20090517/6e555184/attachment.bin>


Подробная информация о списке рассылки Devel