Назад | Перейти на главную страницу

gnupg 'libgpg-error.so.0 информация о версии недоступна'

Я пытаюсь скомпилировать gnupg-2.1.0 для Debian Wheezy, я скачал и скомпилировал необходимые библиотеки (libgpg-error-1.17, libgcrypt-1.6.2, libksba-1.3.2, libassuan-2.1.3, и pth-2.0.7 в таком порядке) через ./configure, make, make install. Затем я добавил /usr/local/lib к /etc/ld.so.conf а затем побежал ldconfig чтобы gnupg мог найти библиотеки.

Gpupg компилируется нормально, но при попытке запустить либо ./agent/gpg-agent или ./g10/g Меня приветствует эта ошибка:

alpha@virtual:~/gnupg-2.1.0$ ./agent/gpg-agent --version
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by ./agent/gpg-agent)
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by /usr/local/lib/libgcrypt.so.20)
./agent/gpg-agent: relocation error: ./agent/gpg-agent: symbol gpgrt_set_alloc_func, version GPG_ERROR_1.0 not defined in file libgpg-error.so.0 with link time reference

ldd ./agent/gpg-agent производит

root@virtual:/home/alpha/gnupg-2.1.0# ldd ./agent/gpg-agent
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by ./agent/gpg-agent)
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by /usr/local/lib/libgcrypt.so.20)
        linux-gate.so.1 =>  (0xb7750000)
        libgcrypt.so.20 => /usr/local/lib/libgcrypt.so.20 (0xb7698000)
        libgpg-error.so.0 => /lib/i386-linux-gnu/libgpg-error.so.0 (0xb7694000)
        libassuan.so.0 => /usr/lib/i386-linux-gnu/libassuan.so.0 (0xb7681000)
        libnpth.so.0 => /usr/local/lib/libnpth.so.0 (0xb767d000)
        libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb7664000)
        libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb74ff000)
        librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb74f6000)
        /lib/ld-linux.so.2 (0xb7751000)

Почему возникает эта ошибка и как ее исправить?

разрешение

Решено добавлением / usr / local / lib в LD_LIBRARY_PATH через export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH} и echo /usr/local/lib > /etc/ld.so.conf.d/local.conf

Основная причина проблемы

Ошибка возникает из-за того, что во время компиляции выполняется правильный поиск /usr/local/lib path перед поиском системного пути по умолчанию, поэтому во время связывания все символы разрешаются. Однако во время выполнения ваш /usr/local/lib путь не ищется до уже существующего /lib/i386-linux-gnu поэтому он находит библиотеку с одинаковым именем в последнем каталоге перед желаемой библиотекой в /usr/local/lib.

Решение, простая версия: путь поиска в глобальной библиотеке (с оговоркой)

Самый простой вариант - вставить /usr/local/lib в твоем LD_LIBRARY_PATH переменная окружения или /etc/ld.so.conf config затем запустите ldconfig. Для "быстрого" решения вам нужно /usr/local/lib прежде всего.

Однако это неприятный момент, вы делаете не хотите заставить все ваши программы искать /usr/local/lib перед путем к системной библиотеке (например: /lib/i386-linux-gnu) - это увеличивает вероятность того, что вы вызовете конфликт версий с системной библиотекой, используемой другой программой, предоставляемой вашей системой или менеджером пакетов, и вызовете сбой системной программы. Это означает «делать все правильно», вы не хотите использовать LD_LIBRARY_PATH, LD_PRELOAD или /etc/ld.so.conf чтобы заставить ваш путь поиска. (По факту, LD_PRELOAD следует избегать вне разработки)

Решение, стабильная версия: Обновите ELF RPATH

Вместо этого при компиляции собственных версий приложений вы можете использовать LD_RUN_PATH переменная окружения (gnu ld & gold) или настройка LDFLAGS к -Wl,-rpath /usr/local/lib для управления внутренним путем поиска в библиотеке ваших двоичных файлов (включая зависимости разделяемых библиотек .so)

Так, например, вы можете запустить следующее, чтобы настроить свою библиотеку:

export LD_RUN_PATH=/usr/local/lib
./configure --prefix=/usr/local <--yourflags>
make install

Мой опыт использования этой техники был на HP-UX, где chatr утилита покажет вам встроенный rpath (и флаг ссылки +b вместо -rpath). readelf или objdump вероятно, покажет rpath в linux.

патчелф утверждает, что может обновлять rpath в существующих двоичных файлах на Linux x86, но сам я не тестировал его.

У меня были те же проблемы с Ubuntu (12, 14 и 16, Gnome и Xfce, совершенно разные машины ...), и я скомпилировал все с нуля. Интересно, совсем не помогает. те же ошибки: требуется версия 2, нет связи с pinentry и так далее.

Убрал старую 1.4 - глупая ошибка! Они предназначены для сосуществования (1.x и 2.x).

На самом деле решение было таким: установите gnupg2 с помощью интерфейса командной строки Ubuntu:

sudo apt-get install gnupg2 

сделал свою работу. Со всеми 4 машинами и всеми версиями. Так просто, так круто. Работает как шарм :-) РЕШЕНО (по крайней мере, на моем зоопарке инсталляций)