Это сервер Gentoo. Есть программа prog
это не может быть выполнено. (Да, разрешение на выполнение установлено)
$ ls
prog
$ ./prog
bash: ./prog: No such file or directory
$ file prog
prog: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
$ pwd
/usr/local/bin
$ /usr/local/bin/prog
bash: /usr/local/bin/prog: No such file or directory
$ less prog | head
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
У меня есть меньше фантазий, чтобы показать, что это настоящий исполняемый файл, вот еще несколько данных:
$ xxd prog |head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 0300 0100 0000 c092 0408 3400 0000 ............4...
0000020: 0401 0a00 0000 0000 3400 2000 0700 2800 ........4. ...(.
0000030: 2600 2300 0600 0000 3400 0000 3480 0408 &.#.....4...4...
0000040: 3480 0408 e000 0000 e000 0000 0500 0000 4...............
0000050: 0400 0000 0300 0000 1401 0000 1481 0408 ................
0000060: 1481 0408 1300 0000 1300 0000 0400 0000 ................
0000070: 0100 0000 0100 0000 0000 0000 0080 0408 ................
0000080: 0080 0408 21f1 0500 21f1 0500 0500 0000 ....!...!.......
0000090: 0010 0000 0100 0000 40f1 0500 4081 0a08 ........@...@...
и
$ ls -l prog
-rwxrwxr-x 1 1000 devs 725706 Aug 6 2007 prog
$ ldd prog
not a dynamic executable
$ strace ./prog
1249403877.639076 execve("./prog", ["./prog"], [/* 27 vars */]) = -1 ENOENT (No such file or directory)
1249403877.640645 dup(2) = 3
1249403877.640875 fcntl(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
1249403877.641143 fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
1249403877.641484 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b3b8954a000
1249403877.641747 lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
1249403877.642045 write(3, "strace: exec: No such file or dir"..., 40strace: exec: No such file or directory
) = 40
1249403877.642324 close(3) = 0
1249403877.642531 munmap(0x2b3b8954a000, 4096) = 0
1249403877.642735 exit_group(1) = ?
FTR сервер - это xen domU, а программа - это приложение linux с закрытым исходным кодом. Эта виртуальная машина является копией другой виртуальной машины с такой же корневой файловой системой (включая эту программу), которая работает нормально.
Я пробовал все вышеперечисленное как root и с той же проблемой.
Я уже упоминал, что корневая файловая система монтируется через NFS. Однако он смонтирован по умолчанию, nosuid, который должен включать execute. Также я могу запускать многие другие программы с этого смонтированного диска.
/ proc / cpuinfo:
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 1
cpu MHz : 2992.692
cache size : 1024 KB
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
bogmips : 5989.55
clflush size : 64
cache_alignment : 128
address sizes : 36 bits physical, 48 bits virtual
power management:
Я могу запускать другие программы в этой смонтированной файловой системе на этом сервере. Например:
$ ls -l ls
-rwxr-xr-x 1 root root 105576 Jul 25 17:14 ls
$ file ls
ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
$ ./ls
attr cat cut echo getfacl ln more
... (you get the idea) ...
rmdir sort tty
$ less ls | head
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
В lm
флаг в вашем /proc/cpuinfo
указывает, что ваш сервер имеет 64-битный процессор.
Информация из file prog
указывает, что программа скомпилирована для 32-битных архитектур. Попробуйте установить 32 библиотеки. Я не знаком с тем, как это сделать в Gentoo, но, возможно, это Статья вики Gentoo может помочь.
У меня была аналогичная проблема (bash сообщает, что файл не найден) при попытке запустить Android Debug Bridge на 64-битной установке Ubuntu, потому что он скомпилирован для 32-битной версии.
Попробуйте следующее:
ldd /usr/local/bin/prog
Или запустить под strace
:
strace /usr/local/bin/prog
Я предполагаю, что программа связана с общей библиотекой, которая либо отсутствует, либо скомпилирована для неправильной архитектуры. Учитывая, что это закрытый исходный код, оба варианта возможны.
Как насчет установки флага exec при монтировании файловой системы?
mount -o remount,exec server:/path /mntpoint
Если флаг exec не установлен для файловой системы, ни один исполняемый файл не может быть запущен из этой файловой системы.
На самом деле файл может называться не «prog». Unix позволяет вам использовать любой символ в имени файла, включая пробел, пробел и т. Д. Например, файл может называться 'p ^ Hprog' и все, что вы увидите, это «prog». Поскольку у вас есть bash, вы можете воспользоваться автозаполнением:
> ls ./[TAB] # where [TAB] means you hit the tab key
если это что-то соответствует, вы можете
> mv ./[TAB]
Если вы пишете код, вам нужно перечислить все файлы в каталоге и показать шестнадцатеричные значения для каждого символа в имени файла.
Можете ли вы получить результаты,
which prog
cat /proc/cpuinfo
- я полагаю, у вас есть /proc
Маленькие указатели,
$ less prog | head
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
Это подозрительно (если у вас нет продвинутого LESSPIPE) ... вы можете сделать
ls -l prog
(по размеру)
xxd prog | head
(для фактического содержания)
Также попробуйте переименовать его в myprog, а затем запустить ./myprog
Да, я понимаю, что этому вопросу два года. Но вот возможный ответ:
execve () возвращает ENOENT, если не может найти интерпретатор ELF. В моем случае мне нужна была символическая ссылка из /lib/ld_lsb.so.3 -> ld_linux.so.2. Это указанное в стандартной базе Linux расположение для интерпретатора ELF. В вашем дистрибутиве может быть пакет, который предоставляет эту символическую ссылку, вероятно, названный чем-то вроде lsb.
Я нашел этот лакомый кусочек внутри PDF-файла:
Чтобы установить поддержку 32-разрядной среды выполнения, выполните следующие команды:
Обратите внимание, что это устанавливает более 200 пакетов и занимает несколько минут.
Это позволило мне работать под 64-битным Linux:ldd
работать, как, например, NVIDIA nvflash
двоичный ...