24 дек. 2009 г.

VirtualBox + libfontconfig + undefined symbol: FT_Select_Size

Дано: Debian Sid/Squeeze, Virtualbox-3.1.
Задача:
VirtualBox: supR3HardenedMainGetTrustedMain: dlopen("/usr/lib/virtualbox/VirtualBox.so",) failed: /usr/lib/libfontconfig.so.1: undefined symbol: FT_Select_Size
Такая вот шняга при запуске вибокса. Убил на ее решение практически целый день, перерыв кучу форумов и перепробовав кучу рецептов, а также по всякому напереустанавливав как сам Виртуалбокс (третью и вторую версии, из репозитория и вручную), так и всё, что хоть как то связано с libfontconfig. В ход был даже пущен strace (хоть я и не особо умею им пользоваться).
Решение выгуглилось неожиданно и в треде, не связанном с вопросами виртуализации.
Итак, причина данной ошибки в том, что бинарник Virtualbox'a получает по запросу не ту версию библиотеки libfreetype, которую ему надобно. А так как без libfreetype.so.6 не может работать libfontconfig.so.1, то он и валит вышеозначенный error. Это удалось проследить следующим образом:
~$ ldd /usr/lib/libfontconfig.so.1
linux-gate.so.1 => (0xb7f56000)
libfreetype.so.6 => /usr/local/lib/libfreetype.so.6 (0xb7ea8000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7e93000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7e6c000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7d25000)
/lib/ld-linux.so.2 (0xb7f57000)
Вывод ldd гласит, что необходимая для работы libfontconfig'a библиотека libfreetype.so.6 находится в /usr/local/lib/, тогда как "родная" дебиановская libfreetype (что из пакета libfreetype6) устанавливается в /usr/lib. Не знаю, откуда взялась сабжевая версия... Скорее всего, при одной из ранних компиляций какого-то иного софта. Это уже не важно. В итоге, так как
 ~$ ls -l /usr/local/lib/libfreetype.so.6
lrwxrwxrwx 1 root staff 35 Дек 24 17:23 /usr/local/lib/libfreetype.so.6 -> libfreetype.so.6.3.6
, а
~$ ls -l /usr/lib/libfreetype.so.6
lrwxrwxrwx 1 root root 21 Дек 24 17:07 /usr/lib/libfreetype.so.6 -> libfreetype.so.6.3.22
, из-за такого несхождения версий ошибка и случалась.
Таким образом, если мы проделаем следующие действия:
~$ sudo -s
~# rm /usr/local/lib/libfreetype.so /usr/local/lib/libfreetype.so.6
~# ln -s /usr/lib/libfreetype.so.6.3.22 /usr/local/lib/libfreetype.so.6
~# ln -s /usr/lib/libfreetype.so.6.3.22 /usr/local/lib/libfreetype.so
~# ldconfig
, то Virtualbox порадует нас своим окном принятия лицензии =). Конечно, можно было сделать иначе - удалить из /usr/local/lib/ все упоминания о некорректной версии libfreetype'a, и переназначить через ldconfig путь к правильной версии этой библиотеки, но я хз, как это правильно сделать  ;). Главное, что цель достигнута.
Надеюсь, данная заметка пригодится товарищам по несчастью.

5 комментариев:

  1. Спасибо! Очень вовремя нашел вашу статью.

    ОтветитьУдалить
  2. Спасибо! Помогло!

    ОтветитьУдалить
  3. Решение описанной проблемы, а конкретно вот эта строчка
    ln -s /usr/lib/libfreetype.so.6.3.22 /usr/local/lib/libfreetype.so.6
    помогла запустить так же VLC и cedega которые прежде не запускались.

    Самое интересное, что сообщения об ошибке VirtualBox и VLC выдавали разное.
    Если
    VirtualBox: supR3HardenedMainGetTrustedMain: dlopen("/opt/VirtualBox/VirtualBox.so",) failed: /usr/lib/libfontconfig.so.1: undefined symbol: FT_Select_Size

    То
    VLC media player 1.1.8 The Luggage (revision exported)
    Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
    Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
    [0x806714c] main libvlc: Запуск vlc с интерфейсом по умолчанию. Используйте 'cvlc' для запуска vlc без интерфейса.
    [0x80e2964] main interface error: option qt-volume-complete does not exist
    [0x80e2964] skins2 interface error: no suitable dialogs provider found (hint: compile the qt4 plugin, and make sure it is loaded properly)
    [0x80e2964] skins2 interface error: cannot instanciate qt4 dialogs provider
    [0x806714c] main libvlc error: interface "default" initialization failed

    И вот как интересно можно было догадаться, из сказанного, что VLC не устраивает месторасположения файла
    libfreetype.so.6.3.22, ведь именно создание символьной ссылки исправило ситуацию.

    Еще раз спасибо за вашу запись :)

    ОтветитьУдалить
  4. Да, соглашусь, со стороны vlc не докопаться. С другой стороны, ругань упорно идет на интерфейс (хоть и cvlc запускается), поэтому, возможно, копая туда, пытаясь уйти от ошибок qt4 dialogs, косвенно заделось бы и это библиотечное недоразумение.

    ОтветитьУдалить