Linux コマンド (または cpp でもかまいません) からコンパイル日付を抽出しようとしています。使用しているのは以下です。
stat -c %z ./myProgram.bin
ただし、たとえば ssh 経由で別の場所にコピーする場合myProgram.bin
、stat コマンドは基本的にコピーの日付を表示します。
実際のコンパイル日を取得するにはどうすればいいですか? ありがとうございます。
答え1
トーマス・ディッキーの回答この問題全般を、あらゆる(ELF)バイナリについて取り上げています。質問の言い回しからすると、__DATE__
および__TIME__
定義済みマクロ便利です。プログラム内でコンパイル日時を参照できます (そのため、プログラムは自身のコンパイル日時を知ることができます)。
簡単な例を以下に示します。
#include <stdio.h>
int main(int argc, char **argv) {
printf("This program was compiled on %s at %s.\n", __DATE__, __TIME__);
return 0;
}
答え2
stat -c %z
ファイルの最終作成/更新時間を表示しますが、これは変更または保存できません。したがって、ファイルを他の場所にコピーすると、常に新しい作成時間になります。探しているのはstat -c %y
、ファイルとディレクトリを処理するほとんどのツールによって通常保存される最終変更時間を表示する です。
答え3
変更時刻を保持したままコピーすることができます。例:
cp --preserve=timestamps source destination
または(より一般的には:モード、所有そしてタイムスタンプ)
cp -p source destination
ただし、場合によっては所有望まれていない。
-p
同様に、scp のオプションを使用してリモート システムにコピーすることもできます。
scp -p source remote:destination
ただしscp
、モードなどの個別のオプションはありません。指定されたリモート権限はありますが、リモート所有権を同時に設定する機能はありません。これらの制限があるため、tar
できるだけ多くの情報を保持しながら、リモート システムで抽出するアーカイブを作成するために使用することをお勧めします。
バイナリ ファイルに使用される ELF 形式には日付が含まれていないため、保存できるのはファイルの変更タイムスタンプのみとなります。
参考文献: