Размер переменной в файле ELF отличается от размера, сообщаемого GDB?

#gdb #elf

#gdb #elf

Вопрос:

Таблица ELF symtab сообщает, что моя переменная имеет размер 16. В частности, после запуска readelf -s mybinary я вижу следующий вывод:

 Num:    Value  Size Type    Bind   Vis      Ndx Name
83: 0804a718    16 OBJECT  LOCAL  DEFAULT   25 myVar
  

Однако, когда я открываю GDB для проверки размера myVar, я вижу следующий вывод:

 print sizeof(myVar)
$1 = 4
  

Я не уверен, откуда возникает это несоответствие. Для некоторого фона я использую x86-32, и у меня нет доступа к исходному файлу, поэтому я не знаю фактического типа myVar.

Комментарии:

1. Выяснение того, о чем знает GDB myVar , должно быть вашим первым шагом. Что делать whatis myVar и ptype myVar говорить?

2. Я уже пробовал это. Ни один из них не дает никакой дополнительной информации: <data variable, no debug info>

Ответ №1:

У вас должна быть старая версия GDB (старше 8.1).

Из файла новостей GDB:

 *** Changes in GDB 8.1
...
  GDB no longer assumes functions with no debug information return
  'int'.
...
  Similarly, GDB no longer assumes that global variables with no debug
  info have type 'int', and refuses to print the variable's value
  unless you tell it the variable's type:

    (gdb) p var
    'var' has unknown type; cast it to its declared type
    (gdb) p (float) var
    $3 = 3.14
  

Как говорится в тексте, до 8.1 GDB обрабатывала любую переменную без отладочной информации как имеющую int тип и sizeof(int) равную 4 в вашей системе.

В онлайн-версии НОВОСТИ текст немного отличается:

 GDB no longer makes assumptions about the type of symbols without
debugging information to avoid producing erroneous and often confusing results;

  

PS

Я уже пробовал это. Ни один из них не дает никакой дополнительной информации

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

Указание версии GDB, которую вы используете, также помогло бы.