Как внедрить информацию о версии в разделяемую библиотеку и бинарный файл? - PullRequest
7 голосов
/ 23 июля 2010

В Linux, есть ли способ встроить информацию о версии в двоичный файл ELF? Я хотел бы внедрить эту информацию во время компиляции, чтобы потом ее можно было извлечь, используя скрипт позже. Хакерским способом было бы внедрить что-то, что можно извлечь с помощью команды strings. Существует ли более традиционный метод, подобный тому, как информация о версии Visual Studio для Windows DLL (обратите внимание на вкладку версии в свойствах DLL)?

Ответы [ 4 ]

9 голосов
/ 23 июля 2010

Один из способов сделать это, если вы используете cvs или subversion, это иметь специальную строку идентификатора, отформатированную специально в вашем исходном файле.Затем добавьте хук предварительной фиксации в cvs или svn, который обновляет эту специальную переменную новой версией файла, когда изменение фиксируется.Затем, когда двоичный файл собран, вы можете использовать идент для извлечения этой информации.Например:

Добавьте что-то вроде этого в ваш cpp-файл:

static char fileid[] = "$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $";

И, если запустить идент (который вы можете найти, установив rcs) в программе, должна показать информацию о файлах, которыев них есть строка идентификатора.

ident program
program:
    $Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $

Примечание Как уже упоминалось в комментариях, эта техника архаична.Система управления исходным кодом автоматически меняет ваш исходный код, и это ужасно, и тот факт, что контроль версий улучшился со времен, когда cvs был единственным вариантом, означает, что вы можете найти лучший способ достижения тех же целей.

3 голосов
/ 29 июля 2015

Чтобы расширить ответ @sashang, избегая проблем "$ Id: $", упомянутых @ cdunn2001, ...

Вы можете добавить файл "version_info.h" в свой проект, который имеет только:

#define VERSION_MAJOR "1"
#define VERSION_MINOR "0"
#define VERSION_PATCH "0"
#define VERSION_BUILD "0"

И в вашем файле main.c есть строка:

static char version[] = VERSION_MAJOR "." VERSION_MINOR "." VERSION_PATCH "." VERSION_BUILD;
static char timestamp[] = __DATE__ " " __TIME__;

(или как вы хотите использовать эти значения в вашей программе)

Тогдаустановите шаг предварительной сборки, который считывает файл version_info.h, соответствующим образом увеличивает числа и снова записывает его.Ежедневная сборка просто повысила бы номер VERSION_BUILD, в то время как более серьезная версия повлияла бы на другие числа.

Если ваш make-файл перечисляет это в списке предварительных требований вашего объекта, то сборка будет перекомпилировать то, что ему нужно.

1 голос
/ 23 июля 2010

Если вы объявляете переменную с именем program_version или аналогичную, вы можете узнать, по какому адресу хранится переменная, а затем продолжить извлекать ее значение.Например,

objdump -t --demangle /tmp/libtest.so | grep program_version
0000000000600a24 g     O .data  0000000000000004              program_version

говорит мне, что program_version находится по адресу 0000000000600a24 и имеет размер 4. Затем просто прочитайте значение по этому адресу в файле.

Или вы можете простонаписать простую программу, которая связывает библиотеку в вопросах и печатает версию, определенную либо как экспортируемая переменная, либо как функция.

1 голос
/ 23 июля 2010

Компиляторы Intel Fortran и C ++, безусловно, могут это делать, используя опцию -sox.Так что да, есть способ.Я не знаю ни одного распространенного соглашения для встраивания такой информации в двоичный файл, и я обычно использую Emacs в hexl-режиме для чтения встроенной информации, что довольно хакерски.параметры, используемые для создания исполняемого файла, что очень полезно.

...