Подтвердить что ты не робот

Есть ли у gcc какие-либо опции для добавления информации о версии в двоичный файл ELF?

Я имею в виду, может ли gcc вставлять некоторую версию инфоректора исходного кода в двоичную форму ELF в виде раздела или что-то подобное. Я не хочу менять исходный файл, но добавьте некоторую информацию с опцией gcc в Makefile.

4b9b3361

Ответ 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

Позвольте мне предупредить вас, что это не для слабонервных!