2016-02-11 2 views
0

Если моя программа делаетПостоянные символы в бинарных

#ifdef USE_REL_DEF 
# define MAX_NUM_REL 10 
#else 
# define MAX_NUM_REL 5 
#endif 

Можно ли проверить сгенерированный двоичный файл, чтобы знать, окончательное значение MAX_NUM_REL? У меня нет возможности помещать журнал/печать в программу, но у меня есть сгенерированные двоичные файлы.

Я пробовал с nm и objdump, но не повезло найти значение символа.

+2

#define сам по себе не дает прямой трассировки в двоичный файл. Определения заменяются соответствующими значениями (10 или 5), где они отображаются в коде во время компиляции. –

+1

Эти символы уходят еще до начала компиляции на фазе предварительной обработки. –

+2

Вы _might_ найдете это в отладочных символах, в зависимости от вашей среды и настроек сборки. – Olaf

ответ

0

Это не символ. Если вы пытались найти MAX_NUM_REL, это не хорошо, так как это #define, что означает, что это даже не переменная, потому что вся работа выполняется препроцессором (так что это точное имя не входит в двоичный файл).

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

2

Это не возможно, чтобы проверить окончательное значение MAX_NUM_REL таким образом: это не переменная, а заполнитель, который будет заменен на значение, указанное непосредственно перед фактической компиляции кода (во время предварительной обработки фазы).

Единственное, что вы можете контролировать, является следствием его использования:

Например, вы должны иметь следующую строку где-то в коде C:

int myIntegerVariable = MAX_NUM_REL; 
  • Вы можете увидеть значение, которое фактически используется при запуске препроцессора (только препроцессора, а не компилятора) вашего кода: это приведет к созданию другого файла C с MAX_NUM_REL, замененным его фактическим значением (int myIntegerVariable = 5;). Вы должны обратиться к документации используемого компилятора, чтобы узнать, как запустить препроцессор в файле.

  • или вы можете разобрать свой скомпилированный код, чтобы определить, были ли использованы 10 или 5 в этом месте. Это нелегко.

    • Символ myIntegerVariable не будет отображаться как таковой в двоичном коде. Это символ, который вы сможете отслеживать только в том случае, если вы скомпилировали свою программу с помощью опции debug, которая хранит таблицу символов в двоичном формате.

    • И даже с таблицей символов это не то, что вы можете обнаружить на первый взгляд, для этого требуется некоторая работа.

  • И, наконец, даже если вы не можете произвести журнал, вы можете сделать шаг за шагом отладки кода в обычном режиме. Это позволяет вам проверять параметры или параметры функции, которые установлены в вашем коде MAX_NUM_REL.

2

Можно ли проверить сгенерированный двоичный файл, чтобы знать, окончательное значение MAX_NUM_REL?

Нет, по крайней мере, не напрямую.MAX_NUM_REL - макрос, а не переменная. Препроцессор заменяет имя макроса своим расширением (в зависимости от того, что это такое) во всем мире, что он отображается как токен предварительной обработки в рамках определения макроса. Если он появляется где угодно, где он не является полным токеном предварительной обработки, это не может быть как имя объекта.

Если случилось быть переменной файл-Scope где-то в двоичном, который инициализируется со значением MAX_NUM_REL, такие как ...

int num_rel = MAX_NUM_REL; 

... то вы можете найти начальное значение этот символ в двоичном выражении и вывести выбранное значение MAX_NUM_REL.

Возможно также использовать препроцессор, чтобы сформулировать обоснованное предположение о том, какое определение используется. Предположим, что файл, содержащий эти определения, - mysource.c. Если вы можете вызвать препроцессор все те же параметры, которые используются для фактической компиляции, то предварительная обработка этого источника ...

include "mysource.c" 

int the_value = MAX_NUM_REL; 

... с теми же параметрами * будет (возможно) производить кучу предварительно обработанного источника C оканчивающийся либо

int the_value = 5; 

или

int the_value = 10; 

Знайте, что это может не дать вам й правильный ответ, если MAX_NUM_REL переопределяется где-то в источнике, но это то, что вы можете проверить достаточно легко.

Как вы используете только препроцессор, зависит от вашей системы. Если вы используете gcc, вы можете использовать gcc -E.

* Возможно, вам понадобится дополнительная опция, чтобы гарантировать, что mysource.c находится в пути поиска.