Linux ne peut pas trouver le fichier qui existe

9

J'essaie de faire fonctionner le langage Dart de Google, mais cela génère des erreurs lors de l'exécution de dart2js. J'utilise Arch linux et j'ai installé dart-sdk depuis AUR. Certaines sorties terminales pertinentes se trouvent ci-dessous.

% dart2js main.dart   
/usr/local/bin/dart2js: line 7: /usr/local/bin/dart: No such file or directory

% cat /usr/local/bin/dart2js
#!/bin/sh
# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

BIN_DIR=`dirname $0`
exec $BIN_DIR/dart --allow_string_plus=false $BIN_DIR/../lib/dart2js/lib/compiler/implementation/dart2js.dart "$@"

% file /usr/local/bin/dart                                                                                          
/usr/local/bin/dart: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
BuildID[sha1]=0x27fe166ca015c1adfeaf3a6f9c018e7d7af46d9f, stripped

% ls -alh /usr/local/bin
total 4.9M
drwxr-xr-x  2 root root 4.0K Jun 10 22:51 .
drwxr-xr-x 12 root root 4.0K Jun 10 22:51 ..
-rwxr-xr-x  1 root root 422K May 10 22:41 cargo
-rwxr-xr-x  1 root root 2.7M Jun 10 22:50 dart
-rwxr-xr-x  1 root root  360 Jun  6 16:20 dart2js
-rwxr-xr-x  1 root root  176 Jun  6 16:20 pub
-rwxr-xr-x  1 root root 166K May 10 22:41 rustc
-rwxr-xr-x  1 root root 1.6M May 10 22:41 rustdoc

% uname -rm
3.3.7-1-ARCH x86_64

Serait-ce parce que j'utilise un système d'exploitation 64 bits et que le binaire dart est de 32 bits?

Joe
la source

Réponses:

19

Afin d'exécuter un ELF binaire, linux doit démarrer un programme qui décode ELF, charge des bibliothèques dynamiques, etc. Ce programme est appelé interprète de programme . Le nom et le chemin complet de l'interpréteur de programme sont écrits dans l'ELF lui-même

Par exemple

 $ file /usr/bin/cheese 
 /usr/bin/cheese: ELF 32-bit LSB executable, Intel 80386

 $ readelf -l /usr/bin/cheese  
 Elf file type is EXEC (Executable file)
 ...
 Program Headers:
 ...
 INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
  [Requesting program interpreter: /lib/ld-linux.so.2]
 ...

Si l'interpréteur de programme demandé par l'ELF est introuvable, BASH obtient l'erreur de fichier non trouvé et signale "Aucun fichier ou répertoire de ce type".

Comme @poige l'a dit ci-dessus, vous devez installer un support de base pour exécuter des applications 32 bits.

Dmitri Chubarov
la source
4

Oui, Arch x86_64 n'est pas fourni par défaut avec la prise en charge des applications 32 bits. Regarde ça:

«… Puis-je exécuter des applications 32 bits dans Arch64? […] Vous pouvez installer les bibliothèques lib32- * à partir du référentiel multilib… »

poige
la source