Дамп ядра - это просто дамп памяти вашей программы, если вы знаете, где все было, вы можете просто использовать это.
Вы используете исполняемый файл, потому что он объясняет, где (в терминах логических адресов) вещи находятся в памяти, то есть в файле ядра.
Если вы используете команду, 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 дополняет объяснение и будет способствовать голосованию.