Bash não pode iniciar um programa que está lá e tem todas as permissões certas

4

Este é um servidor gentoo. Existe um programa prog que não pode ser executado. (Sim a permissão de execução está definida)

Sobre o arquivo

$ 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

Eu tenho uma fantasia a menos, para mostrar que é um executável real, aqui estão mais alguns dados:

$ 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  ........@...@...

e

$ 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)         = ?

Sobre o servidor

FTR o servidor é um xen domU, e o programa é um aplicativo linux de código fechado. Essa VM é uma cópia de outra VM que tenha o mesmo sistema de arquivos raiz (incluindo este programa), que funciona bem.

Eu tentei todos os itens acima como raiz e mesmo problema.

Eu mencionei que o sistema de arquivos raiz está montado sobre o NFS. No entanto, é montado 'defaults, nosuid', que deve incluir executar. Também sou capaz de executar muitos outros programas a partir dessa unidade montada

/ 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:

Exemplo de um arquivo que posso executar

Eu posso executar outros programas nesse sistema de arquivos montado nesse servidor. Por exemplo:

$ 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
    
por Rory 04.08.2009 / 18:21

8 respostas

10

O sinal lm no seu /proc/cpuinfo indica que seu servidor tem uma CPU de 64 bits.

A informação de file prog indica que o programa é compilado para arquiteturas de 32 bits. Tente instalar as 32 bibliotecas. Eu não estou familiarizado com como fazer isso no Gentoo, mas talvez este artigo wiki do Gentoo possa ajudar.

Eu tive um problema similar (bash reportando o arquivo não ser encontrado) ao tentar executar o Android Debug Bridge em uma instalação de 64 bits do Ubuntu, porque ele é compilado para 32 bits.

    
por 04.08.2009 / 18:36
3

Tente o seguinte:

ldd /usr/local/bin/prog

Ou execute-o em strace :

strace /usr/local/bin/prog

Eu acho que o programa está ligado a uma biblioteca compartilhada que está faltando ou compilada para a arquitetura errada. Dado que é fechado, é possível.

    
por 04.08.2009 / 18:32
2

Que tal configurar o sinalizador exec na montagem do sistema de arquivos?

mount -o remount,exec server:/path /mntpoint

Se o sinalizador exec não estiver definido para um sistema de arquivos, nenhum executável poderá ser executado a partir desse sistema de arquivos.

    
por 04.08.2009 / 21:55
1

Você pode obter os resultados para

  • which prog
  • cat /proc/cpuinfo - suponho que você tenha /proc

Pequenos ponteiros,

  1. Você pode executar algum outro executável com êxito que também mostre 32 bits?
    • Você pode executar algum outro executável também sobre o ponto de montagem? (você pode copiar um lá na máquina do servidor, deve aparecer sobre a montagem após a cópia)
por 04.08.2009 / 18:40
1

O arquivo pode não ser realmente chamado de 'prog'. O Unix permite usar qualquer caractere em um nome de arquivo, incluindo backspace, espaço, etc. Por exemplo, o arquivo pode ser chamado de 'p ^ Hprog' e tudo o que você vê é "prog". Desde que você tem o bash, você pode aproveitar o autocomplete:

> ls ./[TAB] # where [TAB] means you hit the tab key

se isso corresponder a alguma coisa, você poderia

> mv ./[TAB]

Se você está escrevendo código, você deseja listar todos os arquivos no diretório e mostrar valores hexadecimais para cada caractere no nome do arquivo.

    
por 04.08.2009 / 21:29
1
$ 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)

Isso é suspeito (a menos que você tenha um LESSPIPE avançado) ... você pode fazer

ls -l prog

(para tamanho)

xxd prog | head

(para conteúdo real)

Além disso, tente renomeá-lo para myprog e, em seguida, executar ./myprog

    
por 04.08.2009 / 21:51
1

Sim, percebo que essa pergunta tem dois anos. Mas aqui está uma resposta possível:

execve () retorna ENOENT quando não consegue encontrar o interpretador ELF. No meu caso, eu precisava de um symlink de /lib/ld_lsb.so.3 - > ld_linux.so.2. Este é o local especificado da Base Padrão do Linux para o interpretador ELF. Pode haver um pacote em sua distribuição que forneça esse link simbólico, provavelmente chamado de algo como 'lsb'.

    
por 16.06.2011 / 20:31
0

Eu encontrei este petisco enterrado dentro de um PDF:

Para instalar o suporte de tempo de execução de 32 bits, execute os seguintes comandos:

  • $ sudo apt-get update
  • $ sudo apt-get instala ia32-libs

Observe que isso instala mais de 200 pacotes e leva vários minutos para ser concluído.

Isso permitiu que eu corresse no Linux de 64 bits: ldd para funcionar, assim como, por exemplo, o binário NVIDIA nvflash ...

    
por 16.06.2012 / 03:52