Я имею в виду, может ли gcc вставлять некоторую версию инфоректора исходного кода в двоичную форму ELF в виде раздела или что-то подобное. Я не хочу менять исходный файл, но добавьте некоторую информацию с опцией gcc в Makefile.
Есть ли у gcc какие-либо опции для добавления информации о версии в двоичный файл ELF?
Ответ 1
Вы можете отправить информацию о своей версии в текстовый файл, а затем превратить этот текстовый файл в файл объекта, который затем статически ссылается на ваш исполняемый файл.
Первый шаг прост, но вам нужно написать код: a script или что-то, чтобы написать информацию о вашей версии в любом формате, который вам нравится, в виде текстового файла. Затем напишите правило makefile, чтобы произвести say version.o из версии .txt, используя objcopy. Теперь у вас будет объектный файл с двумя полезными символами, определенными в нем: начало и конец информации текстовой версии. Добавьте этот сгенерированный объект к вашему исполняемому файлу, и вы сможете получить доступ к версии двумя способами: запустив strings
в двоичном формате или написав код в приложении для печати строки версии (вам нужно будет объявить начальный и конечный символы в качестве переменных в каком-либо файле заголовка).
Ответ 2
Если вы не возражаете изменить исходный файл только один раз, добавьте что-то вроде этого:
const volatile static char version[] = VERSION;
и скомпилируйте с помощью:
gcc -c -DVERSION='"1.2.3"'
volatile
держит gcc от удаления строки на более высоких уровнях оптимизации.
Как написано, это не будет компилироваться, если вы забудете опцию -D
, которая может быть хорошей или плохой в зависимости от ваших требований.
Ответ 3
Даже если у вас больше нет доступа к вашему источнику, вы можете связать объект с этой опцией:
gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
Вы можете проверить его с помощью hexdump -C prog | less
и найти VERSION
Добавьте это в свой makefile
и не забудьте всегда знать, когда была скомпилирована программа:
BUILD = $(shell date +"%Y%m%d_%H%M%S")
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0
Ответ 4
С компоновщиком GNU ld Вы можете использовать
--version-script=version-scriptfile
Подробнее о параметрах командной строки читайте в: Использование LD, компоновщик GNU - Параметры
Подробнее о создании скриптов версии: Использование LD, компоновщик GNU - Версия Script
Позвольте мне предупредить вас, что это не для слабонервных!