Содержание статьи

Файлы формата ELF (Executable and Linkable Format) используются в Linux и других UNIX-подобных системах для хранения исполняемых программ, библиотек и объектных файлов. Время их создания может понадобиться для проверки версии сборки, аудита безопасности или анализа обновлений программного обеспечения.
Метаданные ELF-файлов хранятся не только в файловой системе, но и внутри самого файла. Команды ls и stat позволяют увидеть дату изменения и доступа, но точное время компиляции указывается в заголовках ELF или в секциях вроде .comment. Для извлечения этой информации используют утилиты readelf и objdump.
Практическая проверка начинается с анализа заголовка ELF через readelf -h, где отображаются тип файла, архитектура и дата сборки, если она встроена компилятором. Дополнительно секция .comment может содержать текстовую информацию о версии компилятора и времени сборки, которую можно извлечь вручную или через скрипты на Python.
Использование этих методов позволяет точно определить момент создания ELF-файла, сопоставить его с системными журналами и обеспечить контроль версий программ. Такой подход особенно полезен для системных администраторов, разработчиков и специалистов по безопасности.
Как узнать время создания ELF файла
Для точного определения времени создания ELF-файла необходимо учитывать различие между временем создания на файловой системе и временем сборки, указанным внутри самого файла.
Основные методы получения информации:
- Команда stat отображает метки файловой системы:
- Birth или Creation – если файловая система поддерживает время создания.
- Modify – дата последнего изменения содержимого.
- Change – время изменения метаданных.
- Команда ls -l —time=birth в современных системах показывает время создания файла при поддержке файловой системы.
- Readelf позволяет изучить заголовки ELF:
- readelf -h filename – отображает тип ELF, архитектуру, версии и секции.
- Секция .comment часто содержит информацию о компиляторе и времени сборки.
- Objdump предоставляет возможность анализа секций и символов:
- Скрипты на Python или Bash могут автоматизировать извлечение временных меток из секции .comment и заголовков ELF.
Для систем, где файловая система не сохраняет время создания, единственным надежным способом будет анализ внутренних секций ELF. Комбинация stat, readelf и objdump позволяет получить максимально точную информацию о дате сборки и времени создания файла на диске.
Проверка метаданных файла с помощью ls

Команда ls позволяет быстро получить базовую информацию о файле, включая время его создания и модификации, если файловая система поддерживает эти метки.
Основные варианты использования:
- ls -lc filename – показывает время изменения метаданных (Change), включая права и владельца.
- ls -lu filename – отображает время последнего доступа (Access).
Для точного анализа времени создания ELF-файла рекомендуется комбинировать ls с командой stat, чтобы убедиться в правильности меток, особенно на системах с файловыми системами, не поддерживающими время создания.
Использование команды stat для отображения времени
Команда stat предоставляет подробные сведения о файле, включая несколько типов временных меток. Для ELF-файлов это позволяет определить как время последней модификации, так и возможное время создания.
Пример базового использования:
stat filename
| Метрика | Описание |
|---|---|
| Access | Дата и время последнего обращения к файлу |
| Modify | Дата и время изменения содержимого файла |
| Change | Дата и время изменения метаданных (права, владелец) |
| Birth (Creation) | Дата и время создания файла, если файловая система поддерживает |
stat -c %w filename
Если файловая система не поддерживает метку создания, поле Birth будет пустым, и в этом случае нужно обратиться к внутренним заголовкам ELF через readelf или objdump.
Чтение заголовков ELF через readelf

Команда readelf позволяет получить структурированную информацию о внутреннем устройстве ELF-файла, включая тип файла, архитектуру, версии и секции. Эти данные помогают определить момент сборки и выявить встроенные временные метки.
Основные команды:
- readelf -h filename – отображает заголовок ELF:
- Class – 32-битный или 64-битный ELF.
- Data – порядок байтов (little-endian или big-endian).
- Version – версия ELF.
- Type – тип файла (исполняемый, объектный, библиотека).
- Секция .comment может содержать данные компилятора и время сборки.
- Секции .text и .data дают представление о структуре и размере исполняемого кода.
Для анализа времени создания ELF-файла изучайте секцию .comment и сравнивайте полученные данные с системными метками, полученными через stat. Это позволяет выявить точный момент компиляции даже на файловых системах, не сохраняющих дату создания.
Применение objdump для анализа времени сборки
Утилита objdump предоставляет возможность детально изучить содержимое ELF-файла, включая секции и символы, что позволяет выявить информацию о времени сборки, встроенную компилятором.
Основные команды для анализа:
- objdump -s -j .comment filename – отображает содержимое секции .comment, где компилятор может оставлять метки версии и времени сборки.
- objdump -x filename – показывает расширенные заголовки и символы, полезные для сопоставления времени сборки с конкретными объектными файлами.
Пример анализа секции .comment:
| Секция | Содержание |
|---|---|
| .comment | GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0, возможное время сборки встроено как текстовая метка |
Использование objdump позволяет точно идентифицировать дату сборки ELF-файла на уровне компилятора, что особенно важно, если файловая система не сохраняет время создания.
Использование утилиты file для базовой информации

Утилита file позволяет определить тип ELF-файла и основные характеристики без глубокого анализа содержимого. Это полезно для первичной проверки перед более детальными методами.
Основные команды и параметры:
- file filename – отображает тип файла, архитектуру и формат (например, ELF 64-bit LSB executable).
- ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0
Хотя file не предоставляет точное время создания ELF-файла, оно помогает подтвердить формат и архитектуру перед использованием readelf или objdump для анализа временных меток.
Извлечение времени сборки из секции.comment

Секция .comment в ELF-файле предназначена для хранения текстовых данных, часто включающих информацию о сборке, компиляторе и версии. Она не обязательна, но компиляторы вроде GCC и Clang автоматически записывают туда строки с датой и временем компиляции при использовании определённых опций.
Для просмотра содержимого секции .comment используется команда:
readelf -p .comment имя_файла
GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 2021-06-15
В данном примере 2021-06-15 указывает на дату сборки. Времени сборки (часы и минуты) секция обычно не содержит, фиксируется только дата.
Для автоматического извлечения даты сборки можно использовать команду:
readelf -p .comment имя_файла | grep -oE ‘[0-9]{4}-[0-9]{2}-[0-9]{2}’
Она выведет только строку с датой, игнорируя остальные данные компилятора.
Если секция .comment отсутствует, извлечение времени сборки через этот метод невозможно. В таких случаях стоит проверять другие источники, например, символы отладки или контрольные суммы файлов.
Скрипты на Python для автоматического чтения времени

Для автоматического извлечения даты сборки ELF-файла можно использовать модуль subprocess для вызова утилиты readelf и парсинга секции .comment. Пример скрипта:
import subprocess
def get_build_date(elf_file):
output = subprocess.check_output([‘readelf’, ‘-p’, ‘.comment’, elf_file], text=True)
import re
match = re.search(r’\d{4}-\d{2}-\d{2}’, output)
return match.group(0) if match else None
date = get_build_date(‘example.elf’)
print(date)
Скрипт возвращает дату в формате YYYY-MM-DD. Если секция .comment отсутствует или дата не указана, возвращается None.
Для массовой обработки нескольких ELF-файлов можно использовать цикл:
files = [‘file1.elf’, ‘file2.elf’]
for f in files:
print(f, get_build_date(f))
Альтернативно, можно использовать модуль pyelftools для прямого чтения секций ELF без внешних утилит:
from elftools.elf.elffile import ELFFile
def get_comment_section_date(elf_path):
with open(elf_path, ‘rb’) as f:
elf = ELFFile(f)
section = elf.get_section_by_name(‘.comment’)
if section:
import re
match = re.search(rb’\d{4}-\d{2}-\d{2}’, section.data())
return match.group(0).decode(‘utf-8’) if match else None
return None
Этот подход исключает зависимость от внешних утилит и позволяет интегрировать чтение времени сборки напрямую в Python-скрипты.
Сравнение временных меток на разных системах

ELF-файлы могут иметь разные временные метки в зависимости от файловой системы и платформы. На Linux и Unix-подобных системах дата создания файла обычно не хранится; доступны только mtime (время последней модификации), ctime (время изменения метаданных) и atime (время последнего доступа). На системах с файловыми системами типа ext4, Btrfs и XFS cуществуют дополнительные атрибуты, позволяющие хранить более точные временные метки, но стандартные утилиты их не показывают.
На Windows через файловую систему NTFS сохраняются Creation Time, Last Modified и Last Access. При переносе ELF-файла с Linux на NTFS Creation Time будет установлен временем копирования, а не сборки.
Для точного определения времени сборки ELF рекомендуется использовать внутренние метки компилятора в секции .comment или встроенные строки с датой в бинарном коде. Сравнивая временные метки на разных системах, важно учитывать, что системные атрибуты файлов часто отражают операции с файлом, а не реальную дату компиляции.
Для автоматизированного анализа можно использовать Python-скрипты, которые считывают дату из секции .comment независимо от платформы, обеспечивая корректное сравнение сборок между Linux, macOS и Windows.
Вопрос-ответ:
Можно ли узнать точное время сборки ELF-файла по его метаданным в Linux?
В Linux стандартные файловые метаданные показывают только время последнего изменения (mtime), изменения метаданных (ctime) и последнего доступа (atime). Дата сборки не хранится. Для точного определения времени сборки нужно проверять внутренние данные ELF, например, секцию .comment, где компилятор может записывать дату сборки.
Как автоматически извлечь дату сборки из ELF-файла с помощью Python?
Можно использовать модуль subprocess для вызова утилиты readelf и регулярные выражения для поиска даты в секции .comment. Альтернативно, модуль pyelftools позволяет напрямую читать секции ELF без внешних утилит. Скрипт открывает файл, ищет секцию .comment, извлекает строки с датой в формате YYYY-MM-DD и возвращает их. Если секция отсутствует, возвращается None.
Почему временные метки ELF-файла отличаются на Linux и Windows?
На Linux большинство файловых систем не сохраняют дату создания файла; доступны только mtime, ctime и atime. На NTFS Windows хранит отдельную метку Creation Time. При копировании ELF-файла с Linux на Windows Creation Time устанавливается моментом копирования, а не временем сборки, поэтому системные атрибуты файлов не отражают реальную дату компиляции.
Можно ли использовать секцию .comment для всех ELF-файлов?
Секция .comment не обязательна и присутствует только если компилятор добавил её автоматически. GCC и Clang часто включают туда информацию о версии компилятора и дату сборки. Если секция отсутствует, извлечь дату сборки этим методом нельзя. В таких случаях приходится анализировать строки, встроенные в бинарный код, или символы отладки, если они присутствуют.
