1

У меня есть приложение Eclipse RCP, которое я хочу запустить в среде Linux с несколькими установленными gtks.

Есть ли способ выбрать версию gtk, для которой я могу запустить приложение?

Linux вкус: openSUSE
Оконный менеджер: iceWM
Установленные версии gtk+: 1.2.10 и 2.2.1

1 ответ1

1

Это может быть возможно. Вы можете проверить общие библиотеки, загруженные вашей программой, с помощью команды ldd: например,

  # ldd /usr/sbin/openvpn
    linux-vdso.so.1 =>  (0x00007ffffb5fe000)
    liblzo2.so.2 => /lib/x86_64-linux-gnu/liblzo2.so.2 (0x00007fc3dc936000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc3dc719000)
    libpkcs11-helper.so.1 => /usr/lib/x86_64-linux-gnu/libpkcs11-helper.so.1 (0x00007fc3dc4ff000)
    libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fc3dc2a1000)
    libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fc3dbec5000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc3dbcc0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc3db8f8000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc3dce22000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc3db6df000)

Здесь показаны все библиотеки, запущенные openvpn. Библиотеки, чье имя заканчивается на .so.N, где N - это одна цифра (любая единичная цифра) - это ссылки на реальные библиотеки. Возьмите libz.so.1 в качестве примера:

 root@rasal:/lib/x86_64-linux-gnu# find / -type f -name 'libz.so.1*' -print
 /lib/x86_64-linux-gnu/libz.so.1.2.8
 /lib/i386-linux-gnu/libz.so.1.2.8

 root@rasal:/lib/x86_64-linux-gnu# ls /lib/x86_64-linux-gnu/libz.so.*
 /lib/x86_64-linux-gnu/libz.so.1  /lib/x86_64-linux-gnu/libz.so.1.2.8

 root@rasal:/lib/x86_64-linux-gnu# file /lib/x86_64-linux-gnu/libz.so.*
 /lib/x86_64-linux-gnu/libz.so.1:     symbolic link to `libz.so.1.2.8'
 /lib/x86_64-linux-gnu/libz.so.1.2.8: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x42bce97e9a0f7a78fcdb3b79d11f67b02abc522c, stripped

Команда ldd показывает, к чему разрешает загруженная библиотека libz.so.1 (кстати, это называется soname общей библиотеки), а следующие команды находят библиотеку и показывают, что soname на самом деле является ссылкой на реальную библиотеку название.

Вы можете надеяться определить, какая разделяемая библиотека загружена, изменив эту ссылку.

К этому есть определенное количество предостережений, наиболее важным из которых является то, что, в то время как вы, как правило, безопасны при замене различных минорных версий одной и той же основной версии (например, используя libz.so.1.2.8 вместо libz.1.1. 6) хорошо, в то время как замена версий, различающихся по их старшему номеру (первое число, следующее за этим), невозможна. Согласно странице tldp.org,

Программы, когда они внутренне перечисляют необходимые им разделяемые библиотеки, должны указывать только нужное им имя.

Это означает, что вы не сможете заменить две версии одной общей библиотеки, принадлежащие разным основным версиям.

В любом случае, я предлагаю выше ссылку для дальнейшего уточнения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .