LINUX.ORG.RU

Сообщения sweeper

 

Слинкованная со статическими и динамическими библиотеками прога странно себя ведет

Есть некая проприетарная программа, которую нужно раздавать в виде бинарников. 95% ее пользователей работают под Ubuntu и Fedora, там проблем нет. Оставшиеся работают на чем угодно: от Pardus до Gentoo. Предполагается, что они получат статически слинкованную версию.

Однако здесь появляются проблемы. После выяснения того факта, что glibc не нужно включать в статический бинарник, было решено собрать нечто вроде полу-статика, то есть включить в состав бинарника статические версии большинства прикладных библиотек. Аналогичным образом собирается skype. В качестве платформы для сборки был выбран Debian-5 (i386), там большинство необходимых библиотек имеется как в .so, так и в .a.

Полученный бинарник был перенесен под Ubuntu-9.10 (i386) чисто с экспериментальными целями. Дальше начались фокусы. Если запустить программу просто так, она падает, выдав сообщение

Gtk-Message: Failed to load module "canberra-gtk-module": libcanberra-gtk-module.so: cannot open shared object file: No such file or directory
Segmentation fault
При этом никаких упоминаний о канберре я в бинарнике не вижу. И библиотека эта в системе есть. Далее, при попытке запустить этот бинарник под отладчиком:
Gtk-Message: Failed to load module "canberra-gtk-module": libcanberra-gtk-module.so: cannot open shared object file: No such file or directory

Program received signal SIGSEGV, Segmentation fault.
0x00535645 in xcb_writev () from /usr/lib/libxcb.so.1
Интересно, что libxcb была включена при линковке как статическая. Значит, при запуске происходит то же, что и с glibc - то есть, статическая glibc внутри бинарника не получает управления, вместо этого всё равно вызывается имеющаяся в системе динамическая glibc. Разумеется, мне стало интересно, кто же вызвал динамическую libxcb. Однако тут меня ждал сюрприз. Программа запускается и нормально работает, будучи вызвана из-под ltrace или strace! Причем в их диагностике нет ни слова о канберре и libxcb — похоже, на этот раз вызвался статик.

Собственно, вопросы. Расскажите, вдруг кто-нибудь знает о таком эффекте — почему он происходит (характер «подземного стука» вроде описал). Ну и как бороться, собственно...

sweeper
()

RSS подписка на новые темы