コンパイル日を取得する

コンパイル日を取得する

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 形式には日付が含まれていないため、保存できるのはファイルの変更タイムスタンプのみとなります。

参考文献:

関連情報