Зависит ли файл, указанный как «не динамический исполняемый файл» от «ldd», от других библиотек?

9

Просто убедившись, что я правильно понял - я звоню

ldd /path/to/executable

и он возвращает «не динамический исполняемый файл». Это означает, что это не зависит от других библиотек, правильно? Если так, значит ли это, что его можно перенести в другую коробку Ubuntu, не беспокоясь о зависимостях?

Джейсон
источник

Ответы:

3

Правильно, но есть что учитывать.

Из lddсправочной страницы:

ldd не работает с общими библиотеками a.out.

ldd не работает с некоторыми чрезвычайно старыми программами a.out, которые были созданы до того, как поддержка ldd была добавлена ​​в выпуски компилятора. Если вы используете ldd в одной из этих программ, программа попытается запустить ее с argc = 0, и результаты будут непредсказуемыми.

Эрик Карвалью
источник
3
Другая причина может заключаться в том, что двоичный файл был создан для 32-разрядной системы, но вы проверяете его в 64-разрядной системе.
Фердинанд Прантл
@FerdinandPrantl Если он построен для 32-битных, lddвсе равно печатает 32-битные зависимости.
Кальмарий
@ Calmarius, это не так, если у вас нет базовой 32-битной libgcc1. Только что проверено на новой установке Ubuntu Server: вам нужно установить libgcc1: i386, чтобы ldd был доволен 32-битными двоичными файлами.
Фальстаф
1

@ Calmarius верен, это происходит, если вы рассматриваете 32-битный exe, даже без базовых 32-битных библиотек.

Я пытаюсь обновить свою систему (новая версия Ubuntu 16.04 от 12.04), мне нужно установить старую 32-битную примирительную службу avserver, которая требует ia32-libs(больше не доступна). Это означает, что оба dpkgи apt-getнедовольны (что бы я ни делал, это побуждает меня apt-get -f install, и если я запускаю это, он настаивает на том, чтобы удалить пакет службы), и моя служба не запускается.

Чтобы доказать, что это связано с отсутствием 32-битных библиотек, я установил мою старую систему (Ubuntu 12.04, с ia32-libsи 32-битными библиотеками) /sda2. Обеспечение /opt(содержащее мой 32-битный двоичный файл) смонтировано /sda2/opt, я могу, chroot /sda2а lddзатем работает как задумано.

Чтобы это исправить, я мог бы вручную установить все зависимые библиотечные пакеты с: i386 (arch). Однако я решил вместо того, чтобы попытаться выяснить, какие у меня были зависимости, я установил Wine (который в основном 32-битный, и поэтому устанавливает базовые библиотеки и загрузку, которая мне не очень нужна, но я согласен с этим).

Чтобы исправить dpkgи apt-get, я отредактировал /var/lib/dpkg/status, нашел пакет для моего сервиса и удалил ia32-libs. Сейчас dpkgи apt-getрады

Что сделано, lddрадостно сообщает: - root@withnail:/opt/<service path># ldd avserver linux-gate.so.1 => (0xf77a6000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf778f000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7772000) libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf776b000) libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf7752000) libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xf7720000) libktssl.so.1.0.0 => /opt/<service path>/libktssl.so.1.0.0 (0xf76cb000) libktcrypto.so.1.0.0 => /opt/<service path>/libktcrypto.so.1.0.0 (0xf756b000) libktz.so.1 => /opt/<service path>/libktz.so.1 (0xf7558000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf754f000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73d8000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7383000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7366000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71af000) /lib/ld-linux.so.2 (0x565b1000)

sibaz
источник
Установка Wine - очень умный способ получить все 32-битные библиотеки, которые вам нужны!
Псита