예를 들어 hello.c 파일이 있으면 다음만 포함됩니다.
int main() {
printf("Hello world");
return 0;
}
gcc로 빌드 gcc hello.c -o hello
한 다음 실행할 수 있었습니다 ./hello
.
그러나 예를 들어 웹에서 바이너리를 다운로드하려는 경우 curl
실행하기 전에 먼저 chmod를 사용하여 권한을 설정해야 합니다. 이유가 있나요? gcc 및/또는 컬이 파일에 대한 일부 기본 권한을 설정합니까?
답변1
curl
파일이 실행 가능하다는 것을 어떻게 알 수 있나요 ? 기술적으로는 내용을 확인할 수 있지만 이는 curl
의도한 것보다 훨씬 뛰어납니다.
기본 권한은 umask
(http://en.wikipedia.org/wiki/Umaskumask
) 및 실행 가능 비트는 프로그램에서 파생된 권한 위에 추가될 수 있습니다(또는 완전히 다른 권한을 사용할 수 있음). 예를 들어, gcc
실행 파일을 작성하고 있다는 것을 알고 실행 비트를 설정합니다. 반면 curl
실행 파일은 생성할 의도가 없으므로 기본 권한만 사용됩니다.
답변2
HTTP를 통해 파일을 다운로드하면 생성 날짜, 권한 등과 같은 메타데이터가 아닌 파일의 내용만 받게 됩니다.
이 메타정보가 포함된 다른 프로토콜을 사용하거나, 서버에 액세스할 수 있는 경우 메타데이터 정보가 포함된 컨테이너(예: tar 파일)에 파일을 제공하세요.
curl
이것이 심각하게 반복되는 불만이라면 올바른 권한을 추측하고 다운로드가 완료될 때 권한을 설정하는 래퍼를 작성할 수도 있습니다 (힌트: file
파일 형식 추측).
답변3
Unix 시스템에서 파일이 실행 가능한지 여부는 이름이나 내용이 아닌 권한에 의해서만 결정됩니다. (해당 파일 형식이 유효한 실행 파일이 아닌 경우 시스템은 해당 파일을 실행하려고 시도하며, 이를 프로그램 실행 시 발생할 수 있는 오류 및 리소스 부족, 라이브러리 누락 등의 하나로 처리합니다.)
웹에서 다운로드하는 대부분의 파일은 실행 가능하지 않으므로 컬은 파일을 실행 가능하게 만들려고 시도하지 않습니다. 파일이 실행될 예정이더라도 지금 실행하고 싶지 않을 수 있습니다. 예를 들어 파일을 검토하고 검토를 통과한 경우에만 파일을 실행 가능하게 만들고 싶을 수 있습니다.
반면, gcc나 다른 컴파일러는 실행 가능한 프로그램을 생성하도록 설계되었으므로 필요한 단계를 수행한다는 것은 놀라운 일이 아닙니다. gcc의 경우 이는 컴파일 프로세스의 마지막 단계 중 하나입니다. 당신은 그것을 관찰할 수 있습니다스트레스:
$ strace -f gcc a.c
…
23429 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_i386", "--hash-style=both", "-dynamic-linker", "/lib/ld-linux.so.2", "-z", "relro", "/usr/lib/gcc/i486-linux-gnu/4.3."..., "/usr/lib/gcc/i486-linux-gnu/4.3."..., "/usr/lib/gcc/i486-linux-gnu/4.3."..., "-L/usr/lib/gcc/i486-linux-gnu/4."..., "-L/usr/lib/gcc/i486-linux-gnu/4."..., "-L/usr/lib/gcc/i486-linux-gnu/4."..., "-L/lib/../lib", ...], [/* 82 vars */]) = 0
…
23429 chmod("a.out", 0755) = 0
23429 exit_group(0) = ?
…
다시 말해서,링커, 이는 컴파일의 마지막 단계이며 실행 파일을 생성합니다. 마지막 단계에서는 출력 파일의 권한을 실행 파일로 변경하기 때문입니다.
답변4
- "바이너리"는 "실행 가능"과 동일하지 않습니다.파일을 "바이너리"로 지정하는 것은 경험적 방법일 뿐이며, 이는 일반적으로 파일의 내용을 읽을 수 없음을 의미합니다. 파일을 "실행 가능"으로 지정한다는 것은 해당 파일에 "실행"할 수 있는 일종의 프로그램이 포함되어 있음을 의미합니다(셸 스크립트와 같은 바이너리가 아닌 형식에서도). 수많은 바이너리 형식은 데이터의 컨테이너일 뿐입니다.
- 명령으로 생성된 바이너리는
gcc
다음과 같습니다.언제나주로 실행 파일로 사용되는 파일입니다. - 인터넷의 파일은 신뢰할 수 없습니다.파일이 실행 가능해야 하는지 추측하려고 하지 마십시오. 산문조차도 쉘 스크립트로 사용될 수 있고
curl
다른 프로그램이 간단히 적용되기 때문에 어쨌든 불가능합니다.umask
gun.shoot(self.foot)
모든 콘텐츠는 사용자 에게 맡기세요 .