12 votes

Impossible d'exécuter les fichiers .out, permission refusée.

J'ai écrit un programme C++ et l'ai compilé pour produire un fichier .out. Cependant, chaque fois que j'essaie de l'exécuter, j'obtiens un refus d'autorisation. J'ai lu qu'on pouvait utiliser sudo, mais je n'arrive pas à le faire fonctionner. J'utilise quelque chose comme, sudo "./a.out" mais cela aussi ne fonctionne pas.

Modifier :

Voici le message que j'obtiens lorsque j'essaie "./a.out".

bash: ./a.out: Permission denied

20voto

Lekensteyn Points 162346

Habituellement, g++ donne au fichier créé les droits d'exécution. Si vous ne passez pas l'option -o le fichier sera nommé a.out .

Deux raisons possibles pour lesquelles votre fichier n'a pas le bit d'exécution activé, avec leurs solutions :

  1. Le site valeur de l'umask est fixé à une valeur telle que 0133, empêchant ainsi le bit d'exécution d'être fixé. Solution : définissez les permissions explicitement :

    chmod 755 a.out
  2. Le système de fichiers sur lequel vous travaillez ne prend pas en charge les permissions Linux. Cela peut être le cas si vous placez des fichiers sur une clé USB formatée en FAT32. Solution : sauvegardez les fichiers et formatez le disque en ext2 ou montez le disque à l'aide de la commande fmask=0022 o umask=0022 (en omettant fmask ). Voir le Options de montage pour la graisse section sur le page du manuel de montage pour plus de détails.

Pour les scripts de bash qui n'ont pas le bit d'exécution activé, vous pourriez exécuter bash file.sh . Une telle fonctionnalité existe pour tous les fichiers dont le contenu est exécutable (fichiers compilés et fichiers avec une ligne shebang). #!/path/to/interpreter ensemble). Pour exécuter des fichiers sans le bit execute activé, utilisez le fichier spécial /lib/ld-linux.so.2 (ou /lib/ld-linux-x86-64.so.2 pour les applications 64 bits) pour exécuter un tel programme :

/lib/ld-linux-x86-64.so.2 a.out

5voto

Paul Beckingham Points 7460

.out est une extension inhabituelle. Normalement, cela signifie un fichier de "sortie de trace".

Vérifiez votre syntaxe que vous utilisez pour compiler

par exemple

gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename

ou peut-être

g++ myfile.cpp -lm -o outputfilename

Vous pouvez examiner si le bit exécutable est activé sur le fichier

ls -l a.out

ou vous pouvez simplement forcer le bit exécutable

chmod +x a.out

alors vous pouvez exécuter votre fichier

./a.out

ou simplement

a.out

Vous devriez peut-être aussi vérifier que le fichier de sortie a été écrit correctement en tant que fichier binaire.

c'est-à-dire

file a.out

Ceci rapportera le format du fichier - soit un script ou un binaire.

Vous avez rarement besoin d'exécuter en tant que root, à moins que vous n'ayez restreint les personnes autorisées à exécuter l'exécutable.

Si vous avez compilé en tant que root (par exemple sudo make), ou si vous avez un Makefile qui a installé l'exécutable en tant que root, je vous suggère de récupérer la permission en tant qu'utilisateur connecté.

c'est-à-dire

sudo chown fred:fred a.out

c.-à-d. remplacez "fred" par votre identifiant d'utilisateur.

5voto

TofuBeer Points 32441

Il suffit de copier le dossier dans votre dossier personnel pour qu'il fonctionne. Vous essayez probablement de l'exécuter sur un disque externe ou autre.

0voto

wolfy Points 1

La solution de contournement pour les systèmes de fichiers FAT dans la première réponse

"Cela peut être le cas si vous mettez des fichiers sur un lecteur flash formaté en FAT32. Solution : (...) montez le lecteur avec fmask=0022 ou umask=0022 (en omettant fmask)."

ne fonctionne normalement pas - la valeur par défaut de umask est généralement 0022 de toute façon, donc cela ne change rien.

La valeur par défaut d'un autre paramètre de montage, cependant, interdit effectivement l'exécution de binaires, en particulier si le système de fichiers FAT est monté en tant que non-utilisateur racine : noexec

Il suffit donc de monter les disques formatés en FAT avec l'option exec comme ça :

sudo mount -o exec /dev/sd.. /mountpoint

(ceci doit normalement être fait en tant que root, d'où le "sudo") et vous devriez être en mesure d'exécuter les binaires directement à partir de là.

-2voto

Jeremy Ruten Points 59989

Je parierais que votre programme n'a pas de fonction 'main()', car s'il en avait une, votre compilateur aurait fait un exécutable .out. Pour l'instant, c'est juste un fichier objet rempli de code, mais il n'y a pas de point d'entrée. main() est un nom de fonction spécial en C et C++ qui indique au compilateur de créer un programme plutôt que de simples fichiers objets qui peuvent être liés à un programme ou une bibliothèque.

Je serais intéressé de savoir quelle ligne de commande vous avez utilisée pour produire ce fichier, car le compilateur c++ de GNU GCC, g++, ne me permet pas de créer un programme simple sans fonction principale :

#include <iostream>

using namespace std;

void no_main()
{
  cout << "Hello World" << endl;
}

$ g++ hello.cc
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 21
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

Cependant, si je remplace 'void no_main' par 'int main', cela fonctionne :

$ g++ hello.cc
$ ./a.out
Hello World

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X