Не является динамическим исполняемым файлом
У меня есть 32-битное приложение (называемое uclsyn), которое я получил от профессора астрономии. Мне удалось запустить его на CentOS год назад, но теперь, когда я настраиваю новую CentOS VM, она не будет работать, и я не могу понять, почему. Он продолжает возвращаться с «Killed».
Это обмен в командной строке:
На машине, которая запускается, «ldd ./uclsyn_linux» возвращает весь список зависимостей. Я нашел пакеты, которые предоставляют эти общие библиотеки, и все они, похоже, установлены.
Необходимые пакеты
- libSM-1.1.0-7.1.el6.i686
- libX11-1.3-2.el6.i686
- libgcc-4.4.6-3.el6.i386
- Glibc-2.12-1.47.el6_2.9.i686
- libuuid-2.17.2-12.4.el6.i686
- libXau-1.0.5-1.el6.i686
- Есть также куча библиотек, локальных для приложения, которое я проверил и уже установлен.
Моя среда
CentOS работает под VirtualBox
Ошибка здесь состояла в том, что на VirtualMachine не хватило оперативной памяти. Запуск strace ./programname показал, что программа была убита так же, как она начала работать, перед загрузкой любой из библиотек. Увеличение объема доступной памяти гарантировало, что программа может работать.
Полезные ответы
Были некоторые полезные ответы от других, а именно @slm, которые предоставили полезные команды для проверки наличия каждой из библиотек и @lgeorget, предлагающих попробовать команду strace .
У меня просто была проблема с 32-битным двоичным, решение было:
apt-get install gcc-multilib
Можете ли вы опубликовать некоторые из библиотек, с которыми она ссылается (из исходной системы)? Вам просто нужно установить некоторые недостающие библиотеки.
Как правило, в системе CentOS это просто вопрос запуска команды yum:
Вы можете работать в обратном направлении из исходной системы:
На этом выходе вы можете увидеть, где моя копия /bin/ls собирает общие .so-библиотеки, например, librt.so.1 , которые находятся здесь: /lib64/librt.so.1 .
Зная это, в исходной системе вы можете запустить эту команду, чтобы выяснить, какой пакет предоставляет эта библиотека:
Таким образом, пакет называется glibc-2.13-2.x86_64 . Поэтому, чтобы установить его, вы сделаете следующее:
Ответ на ваш вопрос: вы пытаетесь запустить приложение, которое было скомпилировано для GNU / Linux год назад, и вы пытаетесь запустить его с новыми библиотеками, которые могут быть несовместимы или недоступны.
На данный момент у вас есть два варианта. Если вы можете перекомпилировать его (что я сомневаюсь, если я хорошо понимаю ваше дело), он будет запущен, потому что он будет повторно связан с совместимыми библиотеками. В противном случае вы можете попытаться создать своего рода песочницу, например VM, использующую старую версию библиотек GNU, для запуска приложения.
try readelf -l uclsyn_linux Запрос интерпретатора программы скажет вам, что вам не хватает.
Скачал линуховый клиент для фотохостинга photofile. В архиве исполняемый файл. Пытаюсь запустить.
Как это понять, файл есть, но его вдруг нет? Или это какая-то защита, предотвращающая от запуска чего не попадя? Дистрибутив - Debian
ему там может чего надо еще? посмотри ldd photofile что говорит? есть ли у тебя все что нужно?
Похоже, ему твоя glibc не нравится
а что если это файл скормить gdb? может он чего больше скажет?
Ну надо же, они что в Сети фуфло распространяют.
Хотя такая же штука была когда я пытался запустить скачанный с офиц. сайта firefox. Подозрительно всё это.
А ты с архитектурой не промахнулся?
ппц, линуксоиды скачивают и запускают бинарники. Куда катится мир?
А это не баш-скрипт ли часом? (:
Текстовым редактором откройте.
Так бывает, когда неправильно shabang указан.
а чмод + икс не нужно сделать?
>Так бывает, когда неправильно shabang указан.
тогда обычно bad interpreter говорят вроде перед No such file or directory
>а чмод + икс не нужно сделать?
>а чмод + икс не нужно сделать?
-rwxr-xr-x 1 sunny sunny 10771230 Май 19 2008 photofile
ну проглядел, чо
думаешь noexec? там ошибка другая была бы емнип.
file photofile
head -n 1 photofile
>Ну надо же, они что в Сети фуфло распространяют.
Пока что видно только что ты «в Сети фуфло распространяешь»
Это плохой файл, не исполняемый. Удалите его.
лддэхни его и посмотри какой библиотеки нехватает.
>Как это понять, файл есть, но его вдруг нет? Или это какая-то защита, предотвращающая от запуска чего не попадя? Дистрибутив - Debian
Ну видимо файл запускается, shell читает sha-bang, там написано /bin/bash, запускается /bin/bash ./photfile, но вот эта команда почему-то не видит этого файла. Попробуйте напрямую:
Ну и сам файл поглядите. (xxd | head и file)
Покажи file photofile
А заодно uname -a
Не, лучше наверное не показывай.
Дай угадаю - у тебя amd64?
А ты запускаешь на ней 32-битный бинарник, отсюда проблемы.
Копай в эту сторону.
и оно покажет что к чему и почему.
Судя по размеру, вряд ли
Ygor писал
file photofile
и оно покажет что к чему и почему.
HomeUser писал
Дай угадаю - у тебя amd64? А ты запускаешь на ней 32-битный бинарник, отсюда проблемы. Копай в эту сторону.
У меня на самом деле процессор AMD AM2+ 64 двухядерный. И система вся архитектуры amd64. Но вроде как бы 32-битные программы должны без проблем запускаться на 64-битной платформе, всегда так было. Вот 32-битный skype запускается.
А readelf что показывает? Признаёт этот файл исполняемым?
Попробуйте скормить этот файл /lib/ld-linux* с разными параметрами.
Например, /lib/ld-linux* --list ./photofile
>for GNU/Linux 2.2.5
Может, в этом дело?
Под /lib/ld-linux вы это имели в виду?
Пишет, что какая-то ошибка. И что это означает?
> И что это означает?
Рядом, случаем, нету другого ld-linux? Если нет, поищите в репозитории пакет для совместимости с 32-битными приложениями (странно, почему же skype работает?)
Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:
Спасибо за ваш ответ. Я выполнил команду, которую вы сказали Agent86, но у меня тот же результат. Я также скачал файл .deb, но есть проблема. Я не знаю, в чем проблема этой игры.
Пожалуйста, подтвердите, используете ли вы 64-битную установку (это наиболее распространенный случай для этой проблемы).
Вероятно, вы пытаетесь запустить 32-разрядный двоичный файл в 64-разрядной системе, в которой не установлена 32-разрядная поддержка.
- Файл не существует. Я предполагаю, что вы проверили, что файл существует (возможно, потому что оболочка завершает его).
- Файл с таким именем существует, но это свисающая символическая ссылка.
- Файл существует, и вы даже можете прочитать его (например, команда file shank-linux-120720110-1-bin отображает что-то вроде «ELF 32-битный исполняемый файл LSB…»), и все же, когда вы пытаетесь выполнить его, вам говорят, что файл не существует.
Команда file скажет вам, что это за двоичный файл. За некоторыми исключениями, вы можете запустить только двоичный файл для архитектуры процессора, для которой предназначен ваш выпуск Ubuntu. Основным исключением является то, что вы можете запускать 32-битные (x86, aka IA32) двоичные файлы в 64-битных (amd64, aka x86_64) системах.
Поскольку в 11.10 (oneiric) появилась поддержка multiarch , вы все равно можете установить ia32-libs , но вы можете выбрать более детальный подход, которого достаточно получить (плюс любую другую необходимую библиотеку). libc6-i386
Спасибо за отличный ответ, Жиль. Хотя я еще не сталкивался с этой проблемой (пока!), Я оставил ваш ответ для дальнейшего использования.
Спасибо за исчерпывающий ответ! Файл bin, который я скачал, был единственным, доступным в этом формате (bin). Так что я думаю, что это хорошо для всех архитектур. Я также скачал файл .deb для моей архитектуры (64 бита), но с другой ошибкой. На данный момент я думаю, что на игру влияют некоторые ошибки, или я не могу установить эту игру. Сейчас я пытаюсь загрузить libc6-i386 и все еще пытаюсь установить его. Я напишу снова, если будут значительные изменения. Спасибо за ваше время.
@Francesco Пожалуйста, опубликуйте решение! Это может помочь другим людям, пытающимся запустить Shank на Ubuntu. Это нормально, чтобы ответить на свой вопрос .
Вы можете использовать, ldd чтобы проверить, если вы пропустили библиотеку. ldd kgio_ext.so может сказать что-то подобное libruby.so.2.3 => not found среди других
64-битные системы Ubuntu Multiarch
Следуйте этому ответу, только если вывод file file-name показывает,
Для того, чтобы запустить 32 - битный исполняемый файл в 64 битном мульти-арочной системы Ubuntu, вы должны добавить i386 архитектуру , а также вы должны установить libc6:i386 , libncurses5:i386 , libstdc++6:i386 эти три библиотеки пакетов.
Я бы использовал sudo для последней команды: запуск 32-битного двоичного файла (так что очевидно, что он не скомпилирован вами или Ubuntu), поскольку sudo может быть рискованным. (ну, даже не как root, восхищенно)
Следует отметить, что если вы используете CentOS или RedHat, этот ответ не применяется. Был скинут на несколько часов из-за этого.
Установив deb для 32-битной системы, я понял, что мне не хватает некоторых библиотек (в дополнение к ia32-libs и libc6). Сначала я решил эту проблему, дав следующую команду:
Тогда я получил еще одну ошибку:
Очевидно, что эти библиотеки были правильно установлены. Не вдаваясь в детали, мне пришлось связывать библиотеки вручную. Тогда я понял, что через Synaptic можно было бы также проще установить следующие пакеты:
Надеюсь это кому-нибудь пригодится. Если вам нужна дополнительная помощь или более подробная информация, пожалуйста, не стесняйтесь связаться со мной.
После установки libc6: i386 все начинает улучшаться .
Чтобы завершить работу, вам может понадобиться определить и установить дополнительные библиотеки по одной за раз .
Чтобы расширить ответ @Gilles, есть как минимум три сценария, приводящие к этой ошибке:
Категории проблем с загрузчиком:
Загрузчик исполняемого файла не существует. Вы можете проверить это с помощью команды file и посмотреть, существует ли загрузчик. Например
Обратите внимание interpreter /lib64/ld-lsb-x86-64.so.3 ; если этот файл не существует, вам необходимо установить его. Для данного конкретного загрузчика 16.04 ответ оказался sudo apt-get install lsb .
Проблемы с загрузчиком скрипта (см. Этот ответ ).
Загрузчик не существует может быть из-за несоответствия 32/64 бит или по другой причине. Могут быть и другие ошибки загрузчика, о которых я не знаю.
ldd – это утилита командной строки Linux, которая используется в том случае, если пользователь хочет знать зависимости от общей библиотеки исполняемого файла или даже библиотеки разделяемой библиотеки.
Библиотека представляет собой набор ресурсов, таких как подпрограммы / функции, классы, значения или спецификации типов.
Существует два типа библиотек:
Статические библиотеки: статические библиотеки для полных программ, которые не зависят от запуска внешних библиотек. Особенностью статически связанных программ является то, что они работают без установки каких-либо предварительных условий. Статическая библиотека заканчивается расширением * .a, и эти библиотеки включены (отдельная копия) в программы, для которых требуются ее функции.
Динамические библиотеки: динамические библиотеки для небольших программ по размеру. Эти библиотеки заканчиваются расширением .so. Еще одна особенность использования динамической компоновки при запуске многих программ. Она может использовать одну копию библиотеки, а не занимать память многими копиями одного и того же кода , Таким образом, последние программы используют динамическое связывание. В этой статье мы рассмотрим команды ldd, которые используются для управления разделяемыми библиотеками.
1) Отобразить зависимости команды
Мы будем отображать зависимости команды cp.
3) Отображение неиспользуемых прямых зависимостей команды
Мы можем отобразить неиспользуемые прямые зависимости команды cp с использованием опции -u.
Добавить комментарий Отменить ответ
Эта простая однострочная программа для Powershell выведет текущее время работы вашего компьютера. Вывод показан в несколько столбцов, но может быть выведен и в одну строку. PS C:\Users\Windows 11> (get-date) - (gcim Win32_OperatingSystem).LastBootUpTime Days : 0 Hours : 0 Minutes : 41 Seconds : 27 Milliseconds : 915 Ticks : 24879150105 TotalDays : 0.0287953126215278.
Ошибка 504 gateway time-out возникает тогда, когда Nginx не может получить ответ от службы достаточно долго. Например, от PHP-FPM. Nginx и PHP-FPM Наиболее распространенной причиной этой ошибки является совместная работа Nginx и PHP-FPM. В случае очень медленных PHP-скриптов Nginx выдает тайм-аут шлюза 504, когда не ожидает ответа в течение 30 секунд (по умолчанию). Чтобы избавиться.
17 сентября 2021 года произошло событие, всколыхнувшее кинематографический мир. На платформе Netflix появился корейский сериал “Игра в кальмара”. Всего пары недель ему хватило для того, чтобы выйти на первые позиции по популярности не только на Родине, но и в Соединенных Штатах, России. Оценить сюжет сериал можно не только просмотром, но и игрой squid game challenge скачать которую.
Я думаю, что лучший выбор как сервер, ОС является CentOS даже при том, что Redhat лучше! CentOS является производной от Redhat, это получает Redhat, изменил его немного (на изменении в ядре) и распределил под именем CentOS. Таким образом, эти два - то же. Большое преимущество на CentOS состоит в том, что ее свободной и большим преимуществом Redhat является его обширная и долговременная поддержка. Таким образом, если Вы хотите установить сеть для малого бизнеса или чего-то, что подобный CenOS является лучшим, но если Вы ищете сервер ОС, которая может обработать крупномасштабную или корпоративную сеть, лучшее, кажется, Redhat, Но помнить, что Redhat RHEL является дорогим.
о SUSE: OpenSUSE хорош, мощен, устойчив, безопасен, свободен, ориентирован на сети (!!) но весь уровень понижаются по сравнению с этими упомянутыми выше двумя.
о Ubntu (полученный из Debian): Это испытывает недостаток во всех функциях, которые должен иметь сервер!
Ошибка здесь происходила из-за не наличия достаточного количества RAM на VirtualMachine. Выполнение strace ./programname обозначенный, что программа закрывалась так же, как она начала работать, прежде, чем загружать любую из библиотек. Увеличение суммы доступной RAM гарантировало, что программа могла работать.
Полезные ответы
Были некоторые полезные ответы от других а именно, @slm, кто обеспечил полезные команды, чтобы проверить, что каждая из библиотек существовала, и @lgeorget кто, предлагая попытку strace команда.
Обычно в системе CentOS это - просто вопрос выполнения вкусной команды как так:
Можно работать назад от исходной системы как так:
В том выводе Вы видите где моя копия /bin/ls берет общие .so библиотеки для, говорит пример, librt.so.1 , который, оказывается, расположен здесь: /lib64/librt.so.1 .
Зная это, в исходной системе, можно выполнить эту команду для выяснения то, что пакет обеспечивает этой библиотеке:
Таким образом, пакет называют glibc-2.13-2.x86_64 . Таким образом для установки его Вы сделали бы это:
Большое спасибо за справку. Я добираюсь далее. Обновили мой вопрос еще с некоторой информацией теперь, если бы Вы хотите обновить свой ответ с тем же, это очень ценилось бы. :) – Carl 08.05.2013, 14:44
Да я сделал. Они были все установлены за исключением libuuid.i686, который является теперь, но у меня все еще есть та же проблема. – Carl 08.05.2013, 15:36
Ответ находится в Вашем вопросе: Вы пытаетесь запустить приложение, которое было скомпилировано для GNU/Linux один год назад, и Вы пытаетесь выполнить его с новыми библиотеками, которые не могут быть совместимыми или больше доступными.
На данном этапе у Вас есть два варианта. Если можно перекомпилировать его (относительно которого я сомневаюсь, если я пойму хорошо случай), то это будет работать, потому что это будет повторно связано с совместимыми библиотеками. Иначе Вы могли попытаться создать своего рода песочницу, VM, работающий со старой версией библиотек GNU, например, запустить приложение в.
Это не корректно. Программа статически связана, никакие библиотеки по хост-системе не будут ссылаемыми. В то время как ABI может все еще вызвать несовместимость, это маловероятно между незначительными версиями ядра Linux (принимающий ту же архитектуру). – ckhan 08.05.2013, 06:37
К сожалению, перекомпиляция не является опцией здесь. Я получил его работающий на другой системе просто таким же образом, я пробую здесь, но по некоторым причинам, на этот раз этому не нравится он. – Carl 08.05.2013, 16:11
Это неправильно. Изменение адресов не имеет значения вообще. Удаляемые функции или другие повреждения ABI происходят в главных версиях библиотеки (которые редки), в этом случае, Вы получили бы ошибку при загрузке libfoo2, если у Вас нет libfoo2 установленным, есть ли у Вас установленный libfoo3. – psusi 08.05.2013, 17:23
Хорошо, хороший для знания. Я думал, что любое изменение в библиотеке могло повредить соединение. Я в настоящее время выполняю хинду, и я часто должен перекомпилировать обратные зависимости, когда я обновляю библиотеку, таким образом, я не думал, связываясь, было настолько стойким к изменениям библиотеки. – lgeorget 08.05.2013, 17:43
У меня просто была проблема с 32-разрядным двоичным файлом, решение было:
Синтаксис и параметры
Команда ldd выводит зависимости общих объектов. Синтаксис команды:
Мы можем использовать команды ldd с опциями
- -v: вывести всю информацию.
- -d: перемещение данных процесса.
- -r: данные процесса и перемещение функций.
- -u: вывод неиспользуемых прямых зависимостей.
5) ldd со стандартной исполняемой командой
Когда мы пытаемся выполнить ldd со стандартной командой, например ls, нам нужен полный путь к динамическому исполняемому файлу.
Мы видим, что ldd утверждает, что он не может найти ls.
Но с абсолютным путем ldd работал нормально.
2) Отобразить зависимости команды с деталями
Мы будем отображать зависимости команды cp с более подробной информацией, используя опцию -v.
4) Работа только с динамическими исполняемыми файлами
Мы выведем ldd только для динамических исполняемых файлов с использованием опции -r.
7) ldd с отсутствующей зависимостью
Мы можем использовать команду ldd, когда исполняемый файл выходит из строя из-за отсутствующей зависимости.
Как только мы обнаружили недостающую зависимость, мы можем установить ее или обновить кеш командой ldconfig.
Мы будем выполнять перемещение и сообщать о любых недостающих объектах (только ELF), набрав команду ниже.
Мы будем выполнять перемещение для объектов и функций данных и сообщать о любых недостающих объектах или функциях (только для ELF), набрав команду ниже.
Общие библиотеки
Когда мы создаем программу, нам нужно много фрагментов кода, которые кто-то написал для выполнения обычных или специализированных функций в наших целях.
Эти фрагменты кода хранятся в разделяемых библиотеках.
Чтобы использовать их, мы связываем их с нашим кодом либо при создании программы, либо при запуске программы.
6) Установите, что данный исполняемый демон поддерживает TCP Wrapper
Чтобы определить, поддерживает ли данный исполняемый демона TCP Wrapper или нет, выполните следующую команду.
Результат показывает, что демон OpenSSH (sshd) поддерживает TCP Wrapper.
Читайте также: