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

3 ответа

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

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

Решение, простая версия: Глобальный путь поиска в библиотеке (с предупреждением)

Простая версия - вставить /usr/local/lib в вашем LD_LIBRARY_PATH переменная окружения или /etc/ld.so.conf конфиг потом запусти 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.

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

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

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

Решение на самом деле было следующее: установите gnupg2 с Ubuntu CLI:

sudo apt-get install gnupg2 

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

Что касается меня, в далеком прошлом я собрал и установил /usr/local(lib and bin), который стал тенью новой версии. Легко решить, проверив /usr/local на наличие теневых исполняемых файлов и библиотек, а затем запустив ldconfig и hash -r.

Другие вопросы по тегам