Как встроить информацию о версии в общую библиотеку и двоичный файл?

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

8
задан jww 3 June 2019 в 04:14
поделиться

3 ответа

Один из способов сделать это при использовании 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 был единственным вариантом, означает, что вы можете найти лучший способ достичь тех же целей.

10
ответ дан 5 December 2019 в 10:00
поделиться

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

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

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

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

1
ответ дан 5 December 2019 в 10:00
поделиться

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

'- sox' также включает параметры компилятора, используемые для создания исполняемого файла, что очень полезно.

1
ответ дан 5 December 2019 в 10:00
поделиться