Поиск нужных зависимостей для запуска ELF файла
Не получается запустить бинарный файл скомпилированный из qt.
Пробовал запускать через интерпретатор ld-linux-x86-64.so.2 получил — cannot open shared object file. Подскажите, как можно узнать, какие библиотеки и зависимости нужны для запуска файла?
chmod +x binary.elf, но это дикость, обычно такое не нужно.
как можно узнать, какие библиотеки и зависимости нужны для запуска файла?
chmod +x binary.elf, но это дикость, обычно такое не нужно.
не запускает так. у меня файл без разширения, небольшая программа, которую нужно протестировать
как теперь понять, какие библиотеки установлены у меня, а какие нет?
как теперь понять, какие библиотеки установлены у меня, а какие нет?
(not found) значит не установлена
Скорее всего надо пересобирать приложение, вангую версии библиотек не совпадают.
(not found) значит не установлена
нету такого, все установлены. из-за чего еще может не запускаться?
Скорее всего надо пересобирать приложение, вангую версии библиотек не совпадают.
нет такой возможности, я тестирую это приложение, и оно точно работает.
нету такого, все установлены. из-за чего еще может не запускаться?
Может она через dlopen грузит зависимости и проверяет их наличие.
проблема не в исправности приложения, а в том что на вашей машине и машине сборки разные версии библиотек (эта отвечает за загрузку/выгрузку динамических библиотек), потому даже если вы начнете подсовывать библиотеки с компа, на котором собиралось приложение, скорее всего ничего путного не выйдет. Выхода три:
- установить виртуалку с точно такой же системой как на машине сборки.
- пересобрать приложение из исходников на вашей
- пересобрать приложение в режиме статической линковки
Silerus ★★★★ ( 15.02.21 20:29:01 MSK )
Последнее исправление: Silerus 15.02.21 20:29:50 MSK (всего исправлений: 1)
Может она через dlopen грузит зависимости и проверяет их наличие.
можешь подсказать, как я могу это проверить? если честно я полный 0 в линуксе
Тестирую на тех системах, где должно работать. Если нет – заводи багу разработчикам.
Собрать не только бинарь, но и опакетить его, указав в зависимостях нужные библиотеки и их версии.
Хммм.
Не получается запустить бинарный файл скомпилированный из qt.
Для начала попробуйте chmod +x you_file . Вы точно знаете где лежит этот самый you_file? Можете ещё заодно глянуть что за файл через file you_file , а то может оказаться что с самим по себе запускаемым файлом какой-нибудь косяк, типа он для другой архитектуры изначально собран.
Проверить какие библиотеки нужны можно:
- ldd you_file Это наиболее прямой путь.
- nm you_file Это более извилистый путь. Показываются символы (имена функций) в библиотеках.
- ltrace you_file Это позволяет перехватить библиотечные вызовы (какая библиотека и в какой момент вызывается).
- strace you_file Это более извилистый путь, т.к. перехватывает по большей части системные вызовы (сисколлы) к ядру Linux.
P.S. ptrace, dtrace, dtruss не обсуждаем, т.к. это сравнительно редкие на практике «звери».
Moisha_Liberman ★★ ( 15.02.21 22:57:59 MSK )
Последнее исправление: Moisha_Liberman 15.02.21 23:01:19 MSK (всего исправлений: 2)
Запусти с трейсами динамического линкера
env LD_DEBUG=all LD_DEBUG_OUTPUT=ld.trace ./program
Тупо в лоб, запускаешь в терминале, программа сообщает, нет libxxx.so, добавляешь. Запускаешь….
Реальная история. Много лет пользовался mplayer, даже забыл уже, где я его взял, таскал из системы в систему. Был он 32битный. Решил запустить его в 64битной системе. Чисто в академических целях так и делал. Запускаю, читаю на что жалуется, добавляю, пишу враппер. Запускаю… Пришлось добавить порядка двухсот библиотек. Mplayer заработал. Для GUI-версии понадобилось к тому списку добавить еще пару десятков. Вот сейчас пишу, а он мне поет.
проблема не в исправности приложения, а в том что на вашей машине и машине сборки разные версии библиотек (эта отвечает за загрузку/выгрузку динамических библиотек), потому даже если вы начнете подсовывать библиотеки с компа, на котором собиралось приложение, скорее всего ничего путного не выйдет. Выхода три:
установить виртуалку с точно такой же системой как на машине сборки. пересобрать приложение из исходников на вашей пересобрать приложение в режиме статической линковки
Спасибо за совет! Но проблема оказалась не в этом, не совпадали версии qt, у меня стояла 5, нужна была 5.9 и выше. на 5.9 заработало
Как «запустить» приложение в ELF формате в Ubuntu?
Разработчик выложил старую версию своего приложения, скачав этот файл без расширения, я решил узнать, в каком он формате. Просмотрев его я обнаружил, что он в ELF формате. Как запустить, либо установить это приложение в Ubuntu?
Просто напрямую взять и запустить, двойным кликом мыши или введя путь к этому файлу в терминале. Только не забудьте выставить файлу права, разрешающие его запуск
1 ответ 1
ELF (англ. Executable and Linkable Format — формат исполнимых и компонуемых файлов) — формат двоичных файлов, используемый во многих современных UNIX-подобных операционных системах, таких как FreeBSD, Linux, Solaris и др.
и из пьесы «мещанин во дворянстве» мольера:
Журден. Скажите на милость! Сорок с лишком лет говорю прозой — и невдомек!
да, большая часть программ (и библиотек) в ряде операционных систем сохраняются в файлах в формате elf . в этом можно убедиться, например, с помощью программы file (вывод разбит на строки для удобства обозрения):
$ file /bin/ls /bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6461a544c35b9dc1d172d1a1c09043e487326966, for GNU/Linux 3.2.0, stripped
если мы скопируем этот файл в текущий каталог без сохранения битов исполнимости:
то и запустить его просто по имени не сможем:
$ ./ls bash: ./ls: Permission denied $ ls -l ls -rw-r--r-- 1 user user 147176 Jan 16 20:40 ls
надо либо добавить бит исполнимости (хотя бы для вас — владельца файла):
$ chmod u+x ls $ ./ls -l ls -rwxr--r-- 1 user user 147176 Jan 16 20:40 ls
либо напрямую вызвать загрузчик (указан в выводе программы file как interpreter ):
$ chmod -x ls $ /lib64/ld-linux-x86-64.so.2 ./ls -l ls -rw-r--r-- 1 user user 147176 Jan 16 20:40 ls