Переопределение библиотек Linux для исторических бинарных инструментов
У меня есть 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 ответа
Идентификация библиотек производится с ldd
, Найти их - еще одна проблема, но попробуйте покопаться на packages.ubuntu.com
для старых версий Ubuntu. Затем вы смотрите на распаковку пакетов вручную и установку общих объектов в их собственный выделенный каталог (или дерево каталогов, если необходимо) и использование LD_LIBRARY_PATH
указать на них. (Примечание: использование apt-get
или же dpkg
не будет работать, и если вы попытаетесь решить проблему, вы можете сломать вашу систему. Просто не надо.)
У вас есть статический двоичный файл. В целом это означает, что все библиотеки скомпилированы, и бинарный файл не имеет внешних зависимостей. Однако есть исключение, если программа использует библиотеку 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.
Теоретически, использование chroot должно помочь при запуске программного обеспечения - одна из ситуаций, для которых он предназначен, - запускать неподдерживаемое старое программное обеспечение с неподдерживаемым интерфейсом ABI - вам, вероятно, понадобится старый ящик, чтобы скопировать необходимые библиотеки или найти и найти и Соберите необходимые библиотеки самостоятельно.
Вам повезло, есть команда для определения, какие библиотеки нужны бинарным, с ожидаемыми версиями:
ldd -v /path/to/binary