C ++ 프로그램을 작성하고이를 준수하여 a.out 파일을 생성했습니다. 그러나 실행할 때마다 권한이 거부됩니다. 우리가 sudo를 사용할 수 있다는 것을 읽었지만 제대로 작동하지는 않습니다. sudo "./a.out" 과 같은 것을 사용 하지만 작동하지 않습니다.
편집 :
다음은 "./a.out"을 시도 할 때 나타나는 메시지입니다.
bash: ./a.out: Permission denied
C ++ 프로그램을 작성하고이를 준수하여 a.out 파일을 생성했습니다. 그러나 실행할 때마다 권한이 거부됩니다. 우리가 sudo를 사용할 수 있다는 것을 읽었지만 제대로 작동하지는 않습니다. sudo "./a.out" 과 같은 것을 사용 하지만 작동하지 않습니다.
편집 :
다음은 "./a.out"을 시도 할 때 나타나는 메시지입니다.
bash: ./a.out: Permission denied
답변:
일반적으로 g++
작성된 파일 실행 권한을 제공합니다. -o
옵션을 전달하지 않으면 파일 이름이으로 지정 a.out
됩니다.
솔루션에 파일에 실행 비트 세트가없는 두 가지 이유는 다음과 같습니다.
의 umask 값 함으로써 집합으로서의에서 실행 비트 방지 0133과 같은 값으로 설정된다. 솔루션 : 권한을 명시 적으로 설정하십시오.
chmod 755 a.out
fmask=0022
또는 umask=0022
(생략 fmask
). 자세한 내용은 마운트 매뉴얼 페이지의 지방 장착 옵션 섹션 을 참조하십시오.실행 비트가 설정되지 않은 bash 스크립트의 경우을 실행할 수 있습니다 bash file.sh
. 이러한 기능은 실행 가능 컨텐츠가있는 모든 파일 (컴파일 된 파일 및 shebang 라인 #!/path/to/interpreter
세트 가있는 파일 )에 존재합니다. 실행 비트 세트없이 파일을 실행하려면 특수 파일 /lib/ld-linux.so.2
(또는 /lib/ld-linux-x86-64.so.2
64 비트 응용 프로그램)을 사용하여 이러한 프로그램을 실행하십시오.
/lib/ld-linux-x86-64.so.2 a.out
C:\Ubuntu
작성되었습니다). 우분투 설치가 아닌 "C :"에 파일을 넣지 않으면 문제가되지 않습니다. Windows를 사용하지 않거나 디스크 공간이 충분한 경우 전용 파티션에 Ubuntu를 설치하는 것이 좋습니다. 그리고 다시, NTFS / FAT32는 실행할 수 있도록, 리눅스 권한을 지원하지 않습니다 sudo chown user file
, chmod 755 file
그것은 작동하지 않습니다. 이를 위해서는 EXT 파일 시스템이 필요합니다.
~
만들고 ~/projects
그 안에 넣습니다. 같은 일을 할 수 있습니다.
.out은 특이한 확장명입니다. 일반적으로 이것은 "추적 출력"파일을 의미합니다.
컴파일하는 데 사용하는 구문을 확인하십시오.
예 :
gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename
아니면
g++ myfile.cpp -lm -o outputfilename
실행 비트가 파일에 설정되어 있는지 확인해야합니다.
ls -l a.out
또는 그냥 실행 비트를 강제 할 수 있습니다
chmod +x a.out
그런 다음 파일을 실행할 수 있습니다
./a.out
또는 단순히
a.out
출력 파일이 바이너리로 올바르게 작성되었는지 확인해야 할 수도 있습니다.
즉
file a.out
파일 형식이 무엇인지보고합니다 (스크립트 또는 이진).
실행 파일을 실행할 수있는 사람을 제한하지 않으면 루트로 실행할 필요가 거의 없습니다.
루트로 컴파일했거나 (예 : sudo make) 실행 파일을 루트로 설치 한 Makefile이있는 경우 사용자가 로그인 할 때 권한을 다시 얻는 것이 좋습니다
즉
sudo chown fred:fred a.out
즉 "fred"를 사용자 ID로 바꿉니다.
첫 번째 답변에서 FAT 파일 시스템에 대한 해결 방법
"파일을 FAT32 형식의 플래시 드라이브에 저장하는 경우에 해당 될 수 있습니다. 해결책 : (...) fmask = 0022 또는 umask = 0022 (fmask 생략)로 드라이브를 마운트하십시오."
일반적으로 작동하지 않습니다. umask의 기본값은 대부분 0022이므로 아무 것도 변경하지 않습니다.
그러나 다른 마운트 매개 변수의 기본값은 특히 FAT 파일 시스템이 루트가 아닌 사용자로 마운트 된 경우 바이너리 실행을 효과적으로 허용하지 않습니다. noexec
따라서 exec
다음과 같은 옵션으로 FAT 형식의 드라이브를 마운트하십시오 .
sudo mount -o exec /dev/sd.. /mountpoint
(이는 일반적으로 루트로 수행되므로 "스도") 바이너리를 직접 실행할 수 있어야합니다.
마치 프로그램이 'main ()'함수를 가지고 있지 않은 것처럼 컴파일러가 .out을 실행 가능하게 만들었습니다. 지금은 코드로 가득 찬 객체 파일이지만 진입 점이 없습니다. main ()은 C 또는 C ++의 특수 함수 이름으로, 컴파일러는 프로그램이나 라이브러리에 링크 될 수있는 객체 파일이 아닌 프로그램을 작성하도록 지시합니다.
GNU GCC의 c ++ 컴파일러 인 g ++가 주 함수를 사용하지 않고 간단한 프로그램을 만들 수 없기 때문에이 파일을 생성하는 데 사용한 명령 줄을 알고 싶습니다.
#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
그러나 'void no_main'을 'int main'으로 변경하면 작동합니다.
$ g++ hello.cc
$ ./a.out
Hello World