LINUX.ORG.RU

Почему не виден бинарник при попытке запуска?

 , ,


0

1

Прислали мне тут для теста 64-х битную сборку OpenSource-программы MyTetra:

http://webfiles.ru/files/45419173

Пробую ее запустить на Debian 64 bit:

xi@hs64:MyTetra_build_dp$ ls -l
итого 5400
drwxr-xr-x 2 xi xi    4096 ноя 13  2010 doc
drwxr-xr-x 2 xi xi    4096 апр 14  2016 iconengines
drwxr-xr-x 2 xi xi    4096 апр 14  2016 imageformats
drwxr-xr-x 2 xi xi    4096 ноя 17 21:00 lib
-rw-r--r-- 1 xi xi   35147 ноя  5  2010 license.txt
-rwxr-xr-x 1 xi xi 5462444 ноя 16 22:20 mytetra
-rwxr-xr-x 1 xi xi     149 окт 30  2010 mytetra.run
drwxr-xr-x 2 xi xi    4096 ноя 17 21:02 platforms
-rw-r--r-- 1 xi xi    1218 ноя 15 22:09 readme.txt

xi@hs64:MyTetra_build_dp$ ./mytetra.run
./mytetra.run: 8: ./mytetra.run: ./mytetra: not found

xi@hs64:MyTetra_build_dp$ ./mytetra
bash: ./mytetra: Нет такого файла или каталога


То есть, в каталоге есть файл mytetra и mytetra.run. Оба имеют флаги исполнения.

mytetra.run хотя бы запускается на исполнение, но не может из-под себя запустить бинарник mytetra. А сам бинарник mytetra вообще не видится даже при ручной попытке запуска. Первый раз такое вижу.

Я даже пробовал делать cat mytetra — содержимое бинарника вываливается на экран. То есть, файл есть и доступен. Но почему он не может запуститься самой операционкой?

★★★★★

Ответ на: комментарий от anonymous

Биты исполнения стоят, если ты не видишь.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Мне нужен запуск на чистой системе, без multiarch.

Ясно.

Придется все делать самому.

Как всегда :)

Удачи (без сарказма).

barti_ddu
()

Такая же фигня была Не хватало библиотек под 32 и 64 Не помню каких stdlib но могу врать Причем multiarch стоял, но все равно пока библиотеку не доставил Запуска не происходило.

sova ★★
()
Последнее исправление: sova (всего исправлений: 1)
Ответ на: комментарий от barti_ddu

Библиотек не хватает.

Не обязательно. Скорее всего поддержки i386 на хосте нет.

Ты не поверишь, но поддержка i386 на хосте как раз-таки заключается в наличии 32-битных библиотек (ну, и ядро тоже должно уметь x86, но если бы оно не умело, то ошибка была бы другой).

tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

но если бы оно не умело, то ошибка была бы другой).

Ошибка

Нет такого файла или каталога

равно далека от ядра и от наличия библиотек. Так что я присоединяюсь к недоумению топикстартера.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Такая фигня бывает, когда в бинарнике прописан ld.so, которого нет в системе. Например /lib/ld-linux.so.2 вместо /lib/ld-linux-x86-64.so.2

deadskif
()
Ответ на: комментарий от tiandrey

Ты не поверишь, но поддержка i386 на хосте как раз-таки заключается в наличии 32-битных библиотек

Под «поддержкой на хосте» имел ввиду elf интерпретатор. Ну да, ld.so- тоже библиотека :)

Когда не хватает динамических библиотек- это сразу видно по ошибке.

barti_ddu
()
Ответ на: комментарий от legolegs

Если ядру дают на исполнение динамически скомпонованный ELF, оно ищет соответствующий динамический компоновщик (ld.so, как правило). Если ядру дают на исполнение 32-битный динамический бинарник, а 32-битного динамического компоновщика нет, то тут и получается ошибка «file not found». Так что вот тебе прямое и явное отсутствие библиотек.

Если не веришь, попробуй переименовать/переместить /lib/ld-linux.so.2 и запустить что-нибудь динамическое 32-битное, например, тот же щкайп. Увидишь как раз ошибку «No such file or directory».

barti_ddu, позволь ещё немножко позанудствовать, ld.so всё же не интерпретатор (интерпретатор выполняет программу пооператорно, т.е. работает всё время, пока программа запущена), а именно динамический компоновщик - библиотеки в память запихал, адреса импортируемых символов прописал и передал управление в программу, на этом его работа заканчивается.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 3)

ну, начну с классики жанра: погляди на

$ readelf -a mytetra | grep interpreter

И спроси себя, есть ли хотя бы у тебя в системе динамический линкер для этого файла.

demidrol ★★★★★
()
Ответ на: комментарий от tiandrey

Хотя в ELF это всё же интерпретатором именуется, да. Видимо, тут в более общем смысле это слово используется - программа, которая запускает другую программу.

tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

ld.so всё же не интерпретатор (интерпретатор выполняет программу пооператорно, т.е. работает всё время, пока программа запущена), а именно динамический компоновщик

Мне привычнее «интерпретатор», «компоновщик» как-то больше ассоциируется с ld :)

$ readelf -l /bin/bash
...
Program Headers:
...
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
...

Но я особо и не спорю: компоновщик, так компоновщик.

barti_ddu
()
Ответ на: комментарий от legolegs

Ошибка

Нет такого файла или каталога

равно далека от ядра и от наличия библиотек

Правильно. Не найден интерпретатор/компоновщик (который разрешает библиотечные зависимости для запуска исполнимого файла) == «Нет такого файла или каталога».

deadskif прав: нужен определенный ld.so, а такого файла- нет :)

barti_ddu
()
Ответ на: комментарий от Dron

причём тут разрядность и невидимость файла?

Для amd64 и i386 разные ld.so. 32-х битного у ТС нет (отсюда «file not found»).

barti_ddu
()
Ответ на: комментарий от Dron

Притом что мнимая «невидимость файла» это самая частая ошибка разрядности на non-multiarch системах, поскольку ld-linux.so.* в «чистой» x86_64 отсутствуют.

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.