2017-02-21 9 views
0

Когда я запускаю 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, связанный с вызовом функции.

+2

Как показано в вашем примере, gcc не будет компилировать вызов 'startSomething()'. (Определенно нет.) Однако, что вы можете видеть в objdump, это прототипирование или реализация этой функции (в противовес ее вызову). Чтобы доказать это, потребуется полная выборка. – Scheff

+0

@Scheff Спасибо за ответ. Реализация также завершается хешем, если, кроме того, это вызов, который я могу видеть в objdump. –

+0

Я ничего не знаю об objdump. Однако, если вы хотите увидеть, как компилятор компилирует ваш код после вызова макроса, пожалуйста, «скомпилируйте» с помощью '-E'. Это покажет вам исходный код C после вызова макроса. – Scheff

ответ

4

Objdump не имеет ни малейшего представления о C или gcc или препроцессоре. Он имеет информацию о форме «инструкция в адресном диапазоне S-E, взятой из инструкции на линии L». Учитывая два смежных блока команд, которые соответствуют строкам L1 и L2, он может отображать все строки между L1 и L2.

Это похоже на отладчик. Вы не ожидаете, что gdb пропустит комментарии, или, если бы вы указали части кода или пустые строки в этом списке, в листинге.

+0

Хм, может быть, я использую objdump. Для меня это было довольно запутанным, чтобы увидеть код, который не был частью исполняемого файла. Спасибо за объяснение, хотя :) –

Смежные вопросы