«Нет такого файла или каталога» в исполняемом файле, но файл существует, и ldd сообщает обо всех имеющихся библиотеках


13

Таким образом, любой другой командой исполняемый файл существует, но когда я пытаюсь его выполнить, он утверждает, что его там нет.

Это не специальный символ в имени, потому что я переименовал его в «кот». И кажется, что это бинарный файл для правильной архитектуры ... "кажется", я думаю, вопрос в том, что еще выдает сообщение об ошибке "ТАТА", кроме ... файла там нет, потому что он, очевидно, ЕСТЬ!

ldd xls

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m (Также мой дистрибутив - Debian wheezy.)

i686

файл xls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

ls -ld xls

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

Кот

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

время

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s

1
Как насчет LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Стефан Шазелас

1
Одна вещь об этом: он говорит, "su: "что кажется, что вы выполняете system()или что-то изнутри программы, и он говорит, что после этого он не suможет найти исполняемый файл в каталоге, в котором он находится. Что произойдет, если вы скопировать или символическую ссылку на это /binили что-то?
Братчли

Давайте попробуем objdump -j .interp -s ./zls. Я подозреваю, что будет список файла, который не существует.
Дероберт

Ответы:


20

Это похоже на отсутствующий загрузчик . Короткая история: ожидаемый программой динамический загрузчик отсутствует, и сообщения об ошибках в этом случае вводят в заблуждение. Поскольку я не думаю, что я обсуждал это раньше, позвольте мне объяснить соответствующую часть вывода ldd. Большинство из них состоит из линий формы library_soname => /path/to/library_file.

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

Среди библиотек мы видим нечто, что не является общей библиотекой: это программа, которая загружает общие библиотеки. Программа запрашивает /lib/ld-lsb.so.3, но ядро ​​не находит его, поэтому сообщает «Нет такого файла или каталога». Тем lddне менее найти загрузчик, потому чтоldd это скрипт-обертка, который вызывает жестко запрограммированный загрузчик в специальной среде, и загрузчик всегда сообщает свой собственный путь, независимо от того, какой путь загрузчика ожидает программа.

В /lib/ld-linux.so.2вашей системе есть де-факто стандартное расположение загрузчика ELF в системах x86_32 Linux. Программа требует /lib/ld-lsb.so.3, который является стандартным местоположением де-юре .

Установите минимальную поддержку LSB вашего дистрибутива, например lsb-coreпакет в Debian. Если в вашем дистрибутиве этого нет (у большинства есть), создайте символическую ссылку /lib/ld-lsb.so.3 -> ld-linux.so.2. В отчаянии вы можете вызвать загрузчик в явном виде: /lib/ld-linux.so.2 ./xls.


В самом деле, загрузчик - это то, что должна вывести эта строка objdump. Я забыл, что это было на самом деле на lddвыходе. Хороший улов!
Дероберт

Это именно та проблема, которую я видел, с вводящим в заблуждение сообщением об ошибке. Одна из проблем заключается в том, что 'ldd' не будет работать, если динамический загрузчик отсутствует, потому что это (по крайней мере, на centos) скрипт оболочки.
Dajobe

Спасибо за этот самый полезный пост среди множества постов, в которых говорится о пропущенных 32-битных библиотеках в 64-битной системе.
Майкл Берр

readelf -a zls | grep "Requesting program interpreter"распечатает загрузчик.
Кевин Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.