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 путь к правильной версии этой библиотеки, но я хз, как это правильно сделать  ;). Главное, что цель достигнута.
Надеюсь, данная заметка пригодится товарищам по несчастью.