Как записать информацию, необходимую в исполняемом файле
Я хотел знать, знаете ли вы команду или способ записи в виде комментария или строки внутри исполняемого файла. Действительно, я уже сделал это, с компилятором 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]");