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

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

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

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

2 ответа

Решение

Вот быстрое решение. Строковые литералы в программе a 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 системных вызова, но, надеюсь, вы справитесь с этим.

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

Другой способ поместить некоторую конкретную информацию в исполняемый файл с помощью семейства компиляторов xlC_r в AIX - это

#pragma comment(copyright, "whatever")

Если вы хотите, чтобы какой стиль строки, то я рекомендую:

// 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

Использование встроенного ассемблера для добавления строки в раздел .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]");
Другие вопросы по тегам