Я пытаюсь извлечь дату компиляции из команды linux (или cpp тоже подойдет). Я использую:
stat -c %z ./myProgram.bin
Однако если я копирую myProgram.bin
в другое место, например, через ssh, команда 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
хотя в некоторых случаях, сохранениевладениене востребован.
Аналогично вы можете копировать на удаленные системы, используя опцию scp -p
:
scp -p source remote:destination
но scp
не имеет отдельных опций для режима и т.д. Так как он работает с заданнымудаленныйразрешения, он не имеет функции для установки удаленного владения в то же время. Из-за этих ограничений вы можете захотеть использовать tar
для создания архива, который вы извлекаете на удаленной системе, сохраняя как можно больше информации.
Формат ELF, используемый для двоичных файлов, не включает дату, поэтому все, что вы можете сохранить, — это временная метка изменения файла.
Дальнейшее чтение: