GCC записывает свою версию в разделе .comment
(по крайней мере, для целей, которые ее поддерживают - например, для ELF). Вы можете что-то скомпилировать и проверить с помощью objdump -s -j .comment a.out
.
-frecord-gcc-switches
(см. Руководство и этот ответ )
-grecord-gcc-switches
Обычно, когда вы просите компилятор выдавать отладочную информацию (семейство опций -g*
), может быть выдано много мета-информации. Мне известны теги DW_AT_producer
(информация об имени и версии компилятора / ассемблера, а также переключатели командной строки) и теги DW_AT_comp_dir
(каталог компиляции).
Есть также -fverbose-asm
, но он генерирует только комментарии в сборке; они не доходят даже до объектных файлов, не говоря уже о исполняемых файлах.
Также имейте в виду, что компилятор не создает исполняемые файлы. Он просто создает код ассемблера (команда gcc
- это драйвер компилятора , который вызывает собственно компилятор , затем ассемблер, затем компоновщик). Компоновщик может решить, что делать с разделами .comment
и т.п. при объединении объектных файлов в исполняемый файл / библиотеку. Я думаю, что «нормальным» поведением является их катинизация, хотя отказ от них на этом этапе или позже (например, с strip
) никого не должен удивлять.
Как сознательно вставить метаданные в исполняемый файл?
Обычно для этого используются секции SHT_NOTE
(если мы говорим на ELF). Здесь объединение и сохранение до конца гарантированы, потому что они не просто комментарии; они используются набором инструментов для хранения некоторых свойств программ (см. man elf
, grep для «примечания»).
Другой (хакерский) способ - определение абсолютных символов. Вы можете закодировать информацию в названии символа. Это можно сделать на любом этапе. Например. в исходной программе или в сборке. Или на этапе соединения с ld --defsym
. Или вы можете изменить полученный исполняемый файл с помощью objcopy --add-symbol
- о, это работает и для разделов (objcopy --add-section
).