На Linux, там способ встроить информацию о версии в двоичный файл ELF? Я хотел бы встроить эту информацию во время компиляции, таким образом, это может затем быть извлечение это с помощью сценария позже. hackish путь состоял бы в том, чтобы посадить что-то, что может быть извлечено с помощью strings
команда. Существует ли более условный метод, подобный тому, как информация о версии завода Visual Studio для Windows DLLs (отмечают вкладку версии в свойствах DLL)?
Один из способов сделать это при использовании cvs или subversion - иметь специальную строку id, специально отформатированную в вашем исходном файле. Затем добавьте в cvs или svn хук предварительной коммисии, который обновляет эту специальную переменную новой версией файла при фиксации изменений. Затем, когда бинарный файл будет собран, вы можете использовать ident для извлечения этой информации. Например:
Добавьте что-то вроде этого в ваш cpp файл:
static char fileid[] = "$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $";
И запуск ident (который вы можете найти, установив rcs) на программе должен показать информацию о файлах, в которых есть строка id.
ident program
program:
$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $
Примечание Как люди уже упоминали в комментариях, эта техника архаична. Заставлять систему контроля исходных текстов автоматически изменять ваш исходный код некрасиво, и тот факт, что контроль исходных текстов улучшился с тех времен, когда cvs был единственным вариантом, означает, что вы можете найти лучший способ достичь тех же целей.
Если вы объявляете переменную с именем program_version
или аналогичную, вы можете узнать, по какому адресу хранится переменная, а затем перейти к извлечению ее значения. Например.
objdump -t --demangle /tmp/libtest.so | grep program_version
0000000000600a24 g O .data 0000000000000004 program_version
сообщает мне, что версия_программы
находится по адресу 0000000000600a24
и имеет размер 4. Затем просто прочтите значение по этому адресу в файле.
Или вы можете просто написать простую программу, которая связывает библиотеку в вопросах и печатает версию, определенную либо как экспортированную переменную, либо как функцию.
Компиляторы Intel Fortran и C ++, безусловно, могут это сделать, используйте параметр -sox
. Так что да, способ есть. Я не знаю какого-либо широко распространенного соглашения для встраивания такой информации в двоичный файл, и я обычно использую Emacs в шестнадцатеричном режиме для чтения встроенной информации, что довольно хакерски.
'- sox' также включает параметры компилятора, используемые для создания исполняемого файла, что очень полезно.