Não é possível executar arquivos .out, obtendo permissão negada

10

Eu escrevi um programa em C ++ e o cumpri para produzir um arquivo .out. No entanto, sempre que tento executá-lo, recebo Permission Denied. Eu li que podemos usar o sudo, mas não consigo fazê-lo funcionar. Eu uso algo como sudo "./a.out" mas isso também não funciona.

Editar :

Aqui está a mensagem que recebo quando tento "./a.out".

bash: ./a.out: Permission denied
    
por Shamim Hafiz 23.05.2011 / 14:24

5 respostas

15

Geralmente, g++ fornece as permissões de execução do arquivo criado. Se você não passar a opção -o , o arquivo será nomeado a.out .

Duas razões possíveis para o seu arquivo não ter o conjunto de bits de execução, com suas soluções:

  1. O valor de umask é definido como um valor como 0133, evitando assim que o bit de execução seja definido. Solução: defina as permissões explicitamente:

    chmod 755 a.out

  2. O sistema de arquivos em que você está trabalhando não suporta permissões do Linux. Este poderia ser o caso se você estiver colocando arquivos em uma unidade flash formatada em FAT32. Solução: faça o backup dos arquivos e formate-o para ext2 ou monte a unidade com fmask=0022 ou umask=0022 (omitindo fmask ). Veja a seção Opções de montagem para gordura na página de manual de montagem para mais detalhes.

Para scripts bash que não possuem o bit de execução definido, você pode executar bash file.sh . Tal recurso existe para todos os arquivos com conteúdo executável (arquivos compilados e arquivos com uma linha shebang #!/path/to/interpreter set). Para executar arquivos sem o conjunto de bits de execução, use o arquivo especial /lib/ld-linux.so.2 (ou /lib/ld-linux-x86-64.so.2 para aplicativos de 64 bits) para executar esse programa:

/lib/ld-linux-x86-64.so.2 a.out
    
por Lekensteyn 23.05.2011 / 20:06
5

.out é uma extensão incomum. Normalmente, isso normalmente significaria um arquivo de "saída de rastreamento".

Verifique sua sintaxe que você está usando para compilar

por exemplo,

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

ou talvez

g++ myfile.cpp -lm -o outputfilename

Você pode examinar para ver se o bit executável está definido no arquivo

ls -l a.out

ou você pode apenas forçar o bit executável

chmod +x a.out

então você pode executar o seu arquivo

./a.out

ou simplesmente

a.out

Você também deve verificar se o arquivo de saída foi escrito corretamente como um binário

ou seja,

file a.out

Isso informará o formato do arquivo - um script ou um binário

Você raramente precisa executar como root, a menos que tenha restringido quem deve ser capaz de executar o executável.

Se você compilou como root (por exemplo, sudo make), ou tem um Makefile que instalou o executável como root, então eu sugiro que você recupere a permissão quando o usuário logar

ou seja,

sudo chown fred:fred a.out

i.e. substitua "fred" pelo seu ID de usuário.

    
por fossfreedom 23.05.2011 / 14:29
4

apenas copie a pasta para sua pasta pessoal e ela funcionará. Você provavelmente está tentando executá-lo em uma unidade externa ou algo assim.

    
por user65868 24.05.2012 / 17:36
0

A solução alternativa para sistemas de arquivos FAT na primeira resposta

"Este pode ser o caso se você estiver colocando arquivos em uma unidade flash formatada em FAT32. Solução: (...) monte a unidade com fmask = 0022 ou umask = 0022 (omitindo fmask)."

normalmente não funciona - o padrão para umask é principalmente 0022, então isso não muda nada.

No entanto, outro padrão de parâmetro de montagem não permite a execução de binários, especialmente se o sistema de arquivos FAT estiver montado como usuário não raiz: noexec

Portanto, monte unidades formatadas em FAT com a opção exec da seguinte forma:

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

(isso normalmente deve ser feito como root, daí o "sudo") e você deve ser capaz de executar binários diretamente de lá.

    
por wolfy 29.05.2013 / 03:24
-1

Eu apostaria que seu programa não tem uma função 'main ()', como se fizesse isso, seu compilador teria feito um executável a.out. No momento, é apenas um arquivo de objeto cheio de código, mas não há ponto de entrada. main () é um nome de função especial em C e C ++ que informa ao compilador para criar um programa em vez de apenas arquivos de objeto que podem ser vinculados a um programa ou biblioteca.

Eu estaria interessado em saber qual linha de comando você usou para produzir este arquivo, pois o compilador c ++ do GNU GCC, g + +, não me permitirá criar um programa simples sem uma função principal:

#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

No entanto, se eu fizer alteração 'void no_main' para 'int main', funciona:

$ g++ hello.cc
$ ./a.out
Hello World
    
por SpamapS 23.05.2011 / 14:52