Запуск elf файлов linux

Поиск нужных зависимостей для запуска 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 грузит зависимости и проверяет их наличие.

проблема не в исправности приложения, а в том что на вашей машине и машине сборки разные версии библиотек (эта отвечает за загрузку/выгрузку динамических библиотек), потому даже если вы начнете подсовывать библиотеки с компа, на котором собиралось приложение, скорее всего ничего путного не выйдет. Выхода три:

  • установить виртуалку с точно такой же системой как на машине сборки.
  • пересобрать приложение из исходников на вашей
  • пересобрать приложение в режиме статической линковки
Читайте также:  Red hat linux all versions

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-версии понадобилось к тому списку добавить еще пару десятков. Вот сейчас пишу, а он мне поет.

проблема не в исправности приложения, а в том что на вашей машине и машине сборки разные версии библиотек (эта отвечает за загрузку/выгрузку динамических библиотек), потому даже если вы начнете подсовывать библиотеки с компа, на котором собиралось приложение, скорее всего ничего путного не выйдет. Выхода три:

установить виртуалку с точно такой же системой как на машине сборки. пересобрать приложение из исходников на вашей пересобрать приложение в режиме статической линковки

Читайте также:  Linux активность сетевой карты

Спасибо за совет! Но проблема оказалась не в этом, не совпадали версии 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 

Источник

Оцените статью
Adblock
detector