インターネットからバイナリをダウンロードすると実行権限は設定されませんが、gccを使用してバイナリをビルドすると実行権限が設定されるのはなぜですか?

インターネットからバイナリをダウンロードすると実行権限は設定されませんが、gccを使用してバイナリをビルドすると実行権限が設定されるのはなぜですか?

たとえば、hello.cファイルがある場合は、次のようになります。

int main() {
   printf("Hello world");
   return 0;
}

gccでビルドgcc hello.c -o helloして実行できました./hello

ただし、たとえば、Webからバイナリをダウンロードする場合は、curl実行する前にまずchmodを使用して権限を設定する必要があります。理由がありますか? gccおよび/またはカールがファイルに対するいくつかのデフォルト権限を設定しますか?

答え1

curlファイルが実行可能であることをどうやって知ることができますか?技術的には内容を確認できますが、これは意図したcurlものよりはるかに優れています。

基本権限はumaskhttp://en.wikipedia.org/wiki/Umaskumask)と実行可能ビットは、プログラムから派生した権限の上に追加できます(またはまったく異なる権限を使用できます)。たとえば、gcc実行ファイルを作成していることを知って実行ビットを設定します。一方、curl実行可能ファイルは作成する意図がないため、デフォルトの権限のみが使用されます。

答え2

HTTP経由でファイルをダウンロードすると、作成日、権限などのメタデータではなく、ファイルの内容のみが受信されます。

このメタ情報を含む他のプロトコルを使用するか、サーバーにアクセスできる場合は、メタデータ情報を含むコンテナ(tarファイルなど)にファイルを提供してください。

curlこれが重大に繰り返される苦情なら、正しい権限を推測し、ダウンロードが完了したときに権限を設定するラッパーを作成することもできます(ヒント:fileファイル形式の推測)。

答え3

Unix システムでファイルが実行可能かどうかは、名前や内容ではなく権限によってのみ決定されます。 (該当するファイル形式が有効な実行可能ファイルでない場合、システムはそのファイルを実行しようとし、プログラムの実行時に発生する可能性のあるエラーやリソースの不足、ライブラリの欠落などのいずれかとして処理します。)

Webからダウンロードするほとんどのファイルは実行可能ではないため、カールはファイルを実行可能にしようとしません。ファイルが実行される予定であっても、今実行したくない場合があります。たとえば、ファイルを確認してレビューに合格した場合にのみ、ファイルを実行可能にしたい場合があります。

一方、gccや他のコンパイラは実行可能なプログラムを生成するように設計されているので、必要な手順を実行することは驚くべきことではありません。 gccの場合、これはコンパイルプロセスの最後のステップの1つです。あなたはそれを観察することができますストレス:

$ 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

  1. 「バイナリ」は「実行可能」と同じではありません。ファイルを「バイナリ」として指定するのは経験的な方法に過ぎず、これは通常ファイルの内容を読み取ることができないことを意味します。ファイルを「実行可能」と指定することは、そのファイルに「実行」できる一種のプログラムが含まれていることを意味します(シェルスクリプトのようなバイナリではない形式でも)。多くのバイナリ形式はデータのコンテナにすぎません。
  2. コマンドで生成されたバイナリはgcc次のとおりです。いつも主に実行ファイルとして使用されるファイルです。
  3. インターネット上のファイルは信頼できません。ファイルが実行可能であるべきかどうかを推測しようとしないでください。散文でさえシェルスクリプトとして使用することができ、curl他のプログラムが単に適用されるので、とにかく不可能です。umaskgun.shoot(self.foot)すべてのコンテンツはユーザーに任せてください。

関連情報