Когда я запускаю gcc с параметром -g, это позволяет мне видеть некоторый код c, когда я запускаю исполняемый файл с помощью objdump.Параметры отладки GCC, не соответствующие препроцессору #if при просмотре с objdump
У меня есть программа, которая имеет разделы кода в #if-блоках. Когда я запускаю gcc с -g и запускаю objdump, он отображает c-код из #if, который не должен быть включен.
Например со следующим кодом гр:
#define ENABLED 0
#if ENABLED
startSomething();
#endif
При компиляции с gcc -g
, вызов функции startSomething входит в objdump выход.
Секция objdump выхода:
261c: 1c19 adds r1, r3, #0
261e: f7fe f9a1 bl 964 <init>
}
startSomething();
#else
Это ожидаемое поведение? Я бы подумал, что если вызов startSomething() и фактическое определение функции startSomething завернут в #if ENABLED
, тогда он не должен быть включен, и gcc должен просто вырезать это.
Есть ли способ для gcc/objdump уделять больше внимания препроцессору #ifs, поэтому я не получаю код в objdump, который никогда не будет выполнен?
Благодарим за помощь.
EDIT: Кроме того, я знаю, что эта функция не выполняется при фактическом запуске кода. Поэтому я знаю, что я еще не установил ENABLED.
EDIT 2: Хорошее наблюдение заключается в том, что objdump фактически не выводит никаких инструкций asm, связанных с вызовом функции. Таким образом, это просто неверно, включая блок вызова функции c, связанный с вызовом функции.
Как показано в вашем примере, gcc не будет компилировать вызов 'startSomething()'. (Определенно нет.) Однако, что вы можете видеть в objdump, это прототипирование или реализация этой функции (в противовес ее вызову). Чтобы доказать это, потребуется полная выборка. – Scheff
@Scheff Спасибо за ответ. Реализация также завершается хешем, если, кроме того, это вызов, который я могу видеть в objdump. –
Я ничего не знаю об objdump. Однако, если вы хотите увидеть, как компилятор компилирует ваш код после вызова макроса, пожалуйста, «скомпилируйте» с помощью '-E'. Это покажет вам исходный код C после вызова макроса. – Scheff