2

У меня есть 64-битная версия Ubuntu Linux. Недавно мне дали старый скомпилированный бинарный файл, который использовался на старом удаленном сервере, который, я думаю, был дистрибутивом Redhat 2007 года.

Как и следовало ожидать, двоичный файл не работает из-за несовместимости библиотек. Только бинарный отстой и НЕ ДОЛЖЕН быть портативным. Тем не менее, я все еще застрял только с двоичным файлом, и мне нужно запустить его. Таким образом, мой вопрос заключается в том, как решить (болезненную) проблему выяснения того, какие библиотеки ожидает двоичный файл, поиска этих библиотек и принуждения программы использовать их. Какова правильная стратегия для этого?

Я приведу вам конкретный пример моего бинарного файла, который запускается, но сразу завершается ошибкой с сообщением об ошибке.

datab2txt: relocation error: /lib64/libnss_files.so.2: symbol __rawmemchr, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference

Меня интересует стратегия диагностики этого, так как я ожидаю, что если я решу эту проблему (найдя старую версию glibc??) может быть еще больше библиотек для решения.

Какова лучшая стратегия для решения этой проблемы? Я предполагаю, что мне нужно определить необходимые библиотеки (как?), Найти их и заставить программу использовать их (как? переопределение LD_LIBRARY_PATH?)

Спасибо!

Редактировать: использование ldd datab2txt дает ошибку not a dynamic executable . Ухх .. что это значит?

Кроме того, я запустил файл и получил:

% file datab2txt

datab2txt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.4.0, not stripped

4 ответа4

0

Теоретически, использование chroot должно помочь при запуске программного обеспечения - одна из ситуаций, для которых он предназначен, - запускать неподдерживаемое старое программное обеспечение с неподдерживаемым интерфейсом ABI - вам, вероятно, понадобится старый ящик, чтобы скопировать необходимые библиотеки или найти и найти Соберите необходимые библиотеки самостоятельно.

0

У вас есть статический двоичный файл. В целом это означает, что все библиотеки скомпилированы, и бинарный файл не имеет внешних зависимостей. Однако есть исключение, если программа использует библиотеку NSS (libnss).

С https://gcc.gnu.org/ml/gcc/1998-12/msg00083.html:

{AJ} NSS (для подробностей просто введите `info libc" Name Service Switch ") не будет работать должным образом без разделяемых библиотек. NSS позволяет использовать различные сервисы (например, NIS, файлы, базы данных, hesiod), просто изменив один файл конфигурации (/etc/nsswitch.conf) без перепривязки каких-либо программ. Единственным недостатком является то, что теперь статические библиотеки должны иметь доступ к общим библиотекам. Это прозрачно обрабатывается библиотекой GNU C.

Вы увидите следующее предупреждение, если программа использует NSS и вы пытаетесь компилировать его статически

> gcc t.c -Wall -static -o hostname -DWITH_NSS
/tmp/cco4Lcky.o: In function `main':
t.c:(.text+0x66): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

Я не уверен, что есть простой способ решить эту проблему, если у вас есть только двоичный файл. Конечно, вы можете найти дистрибутив Linux с более старым glibc.

0

Идентификация библиотек производится с помощью ldd . Найти их - еще одна проблема, но попробуйте покопаться на packages.ubuntu.com для старых версий Ubuntu. Затем вы смотрите на распаковку пакетов вручную и установку общих объектов в их собственный выделенный каталог (или дерево каталогов, если необходимо) и использование LD_LIBRARY_PATH для указания на них. (Примечание: использование apt-get или dpkg не сработает, и если вы попытаетесь решить проблему, вы можете сломать вашу систему. Просто не надо.)

0

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

ldd -v /path/to/binary

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