Как записать информацию, необходимую в исполняемый файл

Я хотел знать, знаете ли вы команду или способ записи в виде комментария или строки внутри исполняемого файла. Действительно, я уже сделал это с компилятором XLC, я сделал это с #pragma comment(user, "string"), однако теперь мне нужно перейти на GCC, но есть проблема с GCC этот #pragma не распознается.

Мой вопрос: знаете ли вы другого #pragma, который может сделать это под gcc, или просто другой способ обработки для восстановления информации, записанной в исполняемый файл, когда я компилирую.

Спасибо, Эжекиль


person Ežekiel    schedule 22.09.2015    source источник


Ответы (2)


Вот быстрое решение. Строковые литералы в программе c/c++ обычно помещаются в сегмент файла ELF, доступный только для чтения.

Предполагая, что ваш комментарий следует шаблону:

My_Comment: .... 

вы можете добавить некоторые определения строк в свою программу:

#include <stdio.h>

void main() {

    char* a = "My Comment: ...";
}

скомпилировать:

$ gcc test.c

а затем найдите свой шаблон комментария в исполняемом файле:

$ strings a.out | grep Comment
My Comment: ...

могу я спросить, каков вариант использования встраивания комментариев в исполняемый файл?

Следовать за:

Если вы компилируете с флагом -O3, эта неиспользуемая строка оптимизируется, поэтому она вообще не сохраняется в данных ro. Основываясь на той же идее, вы можете обмануть gcc:

#include <stdio.h>

void main() {

    FILE* comment = fopen("/dev/null", "w");
    fprintf(comment, "My Comment:");
}

Затем найдите свой комментарий. Конечно, вы получаете накладные расходы на 2 или 3 системных вызова, но, надеюсь, вы сможете с этим смириться.

Дайте мне знать, если это сработает!

person sestus    schedule 22.09.2015
comment
Конечно, вы можете спросить, я хочу сделать это, потому что мне нужно восстановить версию каждого исходного файла, содержащегося в исполняемом файле, чтобы облегчить отладку, когда есть разные версии. А я попробовал твой способ, не работает :( - person Ežekiel; 22.09.2015
comment
Вы уверены, что не сделали опечатку в команде grep? Можете ли вы вставить вывод команды strings? С какой ОС вы работаете? Какой-то дистрибутив Linux, я полагаю? - person sestus; 22.09.2015
comment
Я работаю над AIX, проблема с вашим методом в том, что он слишком сложен для неопытных парней в C, чтобы применить это внутри каждого исходного файла, действительно, мое решение было проще, просто поместив комментарий в каждый файл, но если нам нужно изменить функцию внутри кода (кто должен быть вызван и объявлен и т. д.) вы можете видеть, что мой вариант был проще. Вот почему я спросил, существует ли эквивалент в gcc. - person Ežekiel; 22.09.2015
comment
В конце концов я остановился на объявлении вроде: cont char*test=:My text version:; который будет находиться в заголовке каждого исходного файла, и я анализирую двоичный файл с помощью cat -v, затем с помощью tr ':' '\n', чтобы вырезать строки вывода там, где есть ':', чтобы изолировать шаблон, который я, наконец, grep (Мой текст например здесь). Спасибо - person Ežekiel; 23.09.2015
comment
@Ežekiel - подробности см. в команде AIX man what, но const char* ver = "@(#) version details"; - это именно то, что ищет программа what, отображая все после строки префикса @(#). Первоначально команда SCCS get использовалась для вставки этой строки в исходные файлы по мере их извлечения из базы данных управления версиями. - person Jesse Chisholm; 09.12.2015

Еще один способ поместить определенную информацию в исполняемый файл с помощью семейства компиляторов xlC_r в AIX:

#pragma comment(copyright, "whatever")

Если вам нужна строка в стиле what, я рекомендую:

// the Q(S) macro uses ANSI token pasting to get the _value_
// of the macro argument as a string.
#define Q(S) Q_(S)
#define Q_(S) #S
// breaking up the "@(" and "#)" prevent `what` from finding this source file.
#define WHAT(MODULE,VERSION) "@(" "#) " Q(VERSION) " " Q(MODULE) " " __DATE__ " " __TIME__
#pragma comment(copyright, WHAT(ThisProgram,1.2.3.4))

Или любую специальную строку, которую вы встраиваете.

ОБНОВЛЕНИЕ: для gcc

См. ответ пользователя 2079303 по адресу: эквивалент gcc комментария #pragma

Чтобы использовать встроенный ассемблер для добавления строки в раздел .comment

__asm__(".section .comment\n\t"
        ".string \"Hello World\"\n\t"
        ".section .text");

ОБНОВЛЕНИЕ: для AIX gcc

Кажется, это работает лучше на встроенном ассемблере AIX gcc, чтобы добавить строку в раздел .comment

__asm__(".csect .comment[RO]\n\t"
        ".string \"Hello World\"\n\t"
        ".csect .text[PR]");
person Jesse Chisholm    schedule 18.11.2015