2015-09-22 3 views
1

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

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

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

ответ

0

Вот быстрый solution.String литералы в программе 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, эта излишняя строка оптимизирована, так что он не хранится вообще в данных ро. Основываясь на той же идее, вы можете обмануть gcc:

#include <stdio.h> 

void main() { 

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

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

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

+0

, что вы могу спросить, я хочу сделать это, потому что мне нужно восстановить версию каждого исходного файла, содержащегося в исполняемом файле, чтобы облегчить отладку, когда есть разные версии. И я пробовал свой путь, он не работает :( –

+0

Уверены ли вы, что вы не делали никаких опечаток в команде grep? Можете ли вы вставить выходные данные команды strings? Какая ОС, с которой вы работаете? Я полагаю? – sestus

+0

Я работаю над AIX, проблема с вашим методом заключается в том, что слишком сложно для неопытных парней в C, чтобы применить это внутри каждого исходного файла, действительно, мое решение было проще просто поместить комментарий в каждый файл, но если у нас есть для изменения функции внутри кода (кто должен быть вызван и объявлен и т. д.) вы можете видеть, что мой вариант был проще. Вот почему я спросил, существует ли эквивалент в gcc. –

0

Другим способом поместить определенную информацию в исполняемом файле, используя 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)) 

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

UPDATE: для НКУ

См ответ на user2079303 по адресу: gcc equivalent of #pragma comment

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

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

UPDATE: для AIX НКУ

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

__asm__(".csect .comment[RO]\n\t" 
     ".string \"Hello World\"\n\t" 
     ".csect .text[PR]"); 
Смежные вопросы