Есть много способов сделать это; Выбор лучшего будет зависеть от таких вещей, как гибкость вашей системы управления версиями и то, насколько много неприятностей вы хотите избежать.
Одна возможность: я не знаком с GIT, но могу поспорить, что вы приложите некоторые усилия, чтобы вы могли настроить систему таким образом, чтобы при проверке версии кода и файла сборки вы также создавали небольшой файл, содержащий номер версии ( или удостоверение личности или что-то). Приложив немного больше усилий, вы могли бы записать номер версии в make-файл для защиты от потерянного / замененного файла версии (хотя это было бы концептуально негигиенично, так как в этом случае make-файл не был бы идентичен тому, который находится под контролем исходного кода). Исполняемый файл прочитает файл и добавит номер версии к данным. (Опять же, число может быть включено в исполняемый файл, если хотите, что сделает библиотеку автономной сущностью и защитит от подкачанного файла makefile / versionfile, но вызовет недовольство ваших сотрудников QA.)
Другой способ: использовать контрольные суммы. Makefile вычисляет свою собственную контрольную сумму и записывает ее в небольшой файл, который исполняемый файл использует / включает и добавляет к данным. Исполняемый файл также вычисляет свою собственную контрольную сумму (с оговорками для неопределенности компилятора) и добавляет это тоже. Небольшая база данных контрольных сумм, легко создаваемая при необходимости, служит таблицей поиска для индекса обратно в хранилище.