Проверка переменной в исполняемом файле - PullRequest
2 голосов
/ 16 апреля 2010

Есть ли способ узнать, определена ли переменная, посмотрев на исполняемый файл.

Допустим, я заявляю

int i;

в основной функции. При компиляции и компоновке я получаю исполняемый файл my_program.exe.

Теперь, заглянув внутрь my_program.exe, могу ли я сказать, имеет ли она переменную int eger i ?

Ответы [ 4 ]

3 голосов
/ 16 апреля 2010

Нет, если вы не компилируете с включенной отладкой.

2 голосов
/ 16 апреля 2010

Как говорили другие, отладочная информация покажет это. Более конкретно, для файлов ELF:

readelf -w binary-name

будет иметь такую ​​запись, как:

<2><58>: Abbrev Number: 4 (DW_TAG_variable)
 <59>     DW_AT_name        : i 
 <5b>     DW_AT_decl_file   : 1 
 <5c>     DW_AT_decl_line   : 2 
 <5d>     DW_AT_type        : <73>  
 <61>     DW_AT_location    : 2 byte block: 91 6c   (DW_OP_fbreg: -20)

Без отладочной информации местные жители не сохраняют свои имена. Если переменная глобальная, на нее будет указывать символ:

objdump -t binary-name

0804a010 g     O .data  00000004              i

Тип информации там теряется, но вы можете увидеть размер 4

1 голос
/ 16 апреля 2010

Если вы компилируете символы отладки (например, gcc -g), вы можете использовать отладчик, чтобы увидеть практически все.

0 голосов
/ 16 апреля 2010

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

...