Переменная языка C в исполняемом файле - PullRequest
0 голосов
/ 22 сентября 2018

Простое кодирование C-файла, как показано ниже:

int main()
{
    int a = 999;
    return 0;
}

после компиляции и ссылки с использованием gcc, создаст исполняемый файл (например, .exe, .out)

Но когда я открою(НЕ ВЫПОЛНЯЯ) исполняемый файл с каким-то редактором, я не могу найти значение переменной 'a', число 999, которое в шестнадцатеричном формате 0x3E7.

Мой вопрос:

  • Существует ли переменная номер 999 в исполняемом файле?
  • Если нет, где хранится номер переменной?Как исполняемый файл получает номер переменной при запуске?

PS: у меня есть немного знаний о разделе памяти, таких как .data .bss .text .etc и язык ассемблера.Ровно не могу найти его с помощью ollydbg.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Одной из важных функций оптимизации является удаление неиспользуемых вещей.Поведение программы вообще не зависит от 999, а a не volatile, поэтому назначение не является частью какого-либо видимого побочного эффекта, и программа в точности эквивалентна int main(){return 0;}

Гораздо проще взглянуть на вывод компилятора в форме asm.

В проводнике компилятора Godbolt вы можете настроить его так, чтобы вы могли видеть вывод asm для gcc -O0 и gcc -O1 одновременно, в разных панелях.https://godbolt.org/z/wNHEnN.

mov DWORD PTR [rbp-4], 999 там в -O0 вместе с пухом настройки кадра стека.Таким образом, вывод -O0 будет иметь 999 в качестве непосредственного операнда dword к инструкции mov.Переменная является локальной, поэтому вы не найдете для нее записи в таблице символов в разделах .data или .rdata (как если бы вы использовали глобальную переменную со статическим инициализатором).

См. Также Как убрать "шум" из вывода сборки GCC / clang? для получения дополнительной информации о выводе компилятора.

0 голосов
/ 22 сентября 2018

Компилятору нет смысла помещать значение 999 в любом месте, поскольку оно нигде не используется.Программа имеет одинаковое наблюдаемое поведение независимо от того, находится 999 где-то в памяти или нет.

ИСО / МЭК 9899: TC2 - 5.1.2.3 Выполнение программы:

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