Основний дамп - це лише дамп пам'яті програми вашої програми, якщо ви знаєте, де все було, то можете просто використовувати це.
Ви використовуєте виконуваний файл, оскільки він пояснює, де (з точки зору логічних адрес) речі знаходяться в пам'яті, тобто основний файл.
Якщо ви використовуєте команду, objdump
вона скидає метадані про виконуваний об’єкт, який ви досліджуєте. Використання виконавчого об'єкта з ім'ям a.out в якості прикладу.
objdump -h a.out
скидає лише інформацію заголовка, ви побачите розділи, названі напр. .data або .bss або .text (є ще багато). Вони інформують завантажувач ядра, де в об'єкті можуть бути знайдені різні розділи та де в адресному просторі процесу розділ повинен бути завантажений, а для деяких розділів (наприклад, .data .text), що слід завантажувати. (.bss розділ не містить жодних даних у файлі, але він стосується обсягу пам'яті, який потрібно резервувати в процесі неініціалізованих даних, він заповнюється нулями).
Макет виконавчого об'єктного файлу відповідає стандарту, ELF.
objdump -x a.out
- скидає все
Якщо виконуваний об'єкт все ще містить таблиці символів (він не був знятий - man strip
і ви використовували -g
для генерації налагодження до gcc
припущення компіляції джерела змінного струму), то ви можете вивчити основний вміст за іменами символів, наприклад, якщо у вас була змінна / буфер названий inputLine у своєму вихідному коді, ви можете використовувати це ім'я gdb
для перегляду його вмісту. тобто gdb
знає зміщення від початку ваших програм ініціалізованого сегмента даних, де починається inputLine та довжина цієї змінної.
Подальше читання Article1 ,
стаття 2 , і вошивий піщаний Виконувані і Linking Format (ELF) специфікації .
Оновлення після коментаря @mirabilos нижче.
Але якщо використовувати таблицю символів як в
$ gdb --batch -s a.out -c core -q -ex "x buf1"
Виробляє
0x601060 <buf1>: 0x72617453
а потім не використовувати таблицю символів та досліджувати адресу безпосередньо в,
$ gdb --batch -c core -q -ex "x 0x601060"
Виробляє
0x601060: 0x72617453
Я вивчив пам'ять безпосередньо, не використовуючи таблицю символів у 2-й команді.
Я також бачу, що відповідь @ user580082 додає додаткові пояснення, і буде голосувати під голосом.