Раздел примечаний к дампу ядра
После моего вопроса осоздание файла дампа ядра вручнуюЯ решил погрузиться в это и запачкать руки.
Я могу построить базовую структуру дампа ядра и получить свою мертвую программу.s память обратно в дамп ядра в большой секции LOAD. При отладке в GDB мои переменные возвращаются, с этим проблем нет. Здесь возникает сложная часть, как мне заставить GDB получить информацию о том, где была программа, когда она потерпела крах.
Я знаю, что раздел примечаний дампа ядра содержит эту информацию (в частности, регистры процессора). Вот чтоobjdump -h дает за "реальный» основной дамп:
core.28339: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 note0 000001e8 00000000 00000000 000000f4 2**0
CONTENTS, READONLY
1 .reg/28339 00000044 00000000 00000000 00000150 2**2
CONTENTS
2 .reg 00000044 00000000 00000000 00000150 2**2
CONTENTS
3 .auxv 000000a0 00000000 00000000 0000023c 2**2
CONTENTS
4 load1a 00001000 08010000 00000000 00001000 2**12
CONTENTS, ALLOC, LOAD, READONLY, CODE
.. other load sections ...
Я разобрался благодаряreadelf что эти разделы .reg содержат данные, отображенные из некоторых структур:
Notes at offset 0x000000f4 with length 0x000001e8:
Owner Data size Description
CORE 0x00000090 NT_PRSTATUS (prstatus structure)
CORE 0x0000007c NT_PRPSINFO (prpsinfo structure)
CORE 0x000000a0 NT_AUXV (auxiliary vector)
Может кто-нибудь дать мне указания о том, как устроен раздел «Заметки»? Я попытался записать эти структуры непосредственно в мой файл, это не сработало, и я явно что-то здесь упускаю. Я посмотрел наКод Google Coredumper и взял несколько кусочков, но написание заметок не так просто, и приветствуется любая подробная информация о том, что именно в ней содержится, и о ее формате.
Изменить № 1: после 1-го комментария
Я понял, что мой файл Elf должен быть структурирован следующим образом:
Elf header ElfW (Ehdr)Заголовки программы (Ehdr.e_phnum times ElfW (Phdr)), здесь я в основном использовал один заголовок PT_NOTE и один заголовок PT_LOADПримечание разделы:Раздел'заголовок s (ElfW (Nhdr))Раздел'имя (длинное имя .n_namesz)Раздел'данные (длиной .n_descsz)Раздел программы, содержащий всю мою программупамятьЗатем мне нужно будет поставить 3 записи, один дляprstatusодин дляprpsinfo и один длявспомогательный вектор.
Кажется, это правильный путьreadelf дает мне такой же вывод, как то, что я получил выше с реальным дампом ядра.
Правка № 2: после получения правильной структуры
Сейчас я борюсь с различными структурами, составляющими записи заметок.
Вот что я получаю при запускеeu-readelf - Примечания на моем дампе ядра:
Note segment of 540 bytes at offset 0x74:
Owner Data size Type
CORE 336 PRSTATUS
CORE 136 PRPSINFO
CORE 8 AUXV
NULL
Вот что я получаю, выполняя ту же команду на реальном дампе ядра:
Note segment of 488 bytes at offset 0xf4:
Owner Data size Type
CORE 144 PRSTATUS
info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
sigpend:
sighold:
pid: 28339, ppid: 41446, pgrp: 28339, sid: 41446
utime: 0.000000, stime: 0.000000, cutime: 0.000000, cstime: 0.000000
orig_eax: -1, fpvalid: 0
ebx: -1 ecx: 0 edx: 0
esi: 0 edi: 0 ebp: 0xffb9fcbc
eax: -1 eip: 0x08014b26 eflags: 0x00010286
esp: 0xffb9fcb4
ds: 0x002b es: 0x002b fs: 0x0000 gs: 0x0000 cs: 0x0023 ss: 0x002b
CORE 124 PRPSINFO
state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400400
uid: 9432, gid: 6246, pid: 28339, ppid: 41446, pgrp: 28339, sid: 41446
fname: pikeos_app, psargs: ./pikeos_app
CORE 160 AUXV
SYSINFO: 0xf7768420
SYSINFO_EHDR: 0xf7768000
HWCAP: 0xbfebfbff
PAGESZ: 4096
CLKTCK: 100
PHDR: 0x8010034
PHENT: 32
PHNUM: 2
BASE: 0
FLAGS: 0
ENTRY: 0x80100be
UID: 9432
EUID: 9432
GID: 6246
EGID: 6246
SECURE: 0
RANDOM: 0xffb9ffab
EXECFN: 0xffba1feb
PLATFORM: 0xffb9ffbb
NULL
Есть ли у кого-нибудь какие-либо подсказки или объяснения, почему мои записи заметок не читаются должным образом? Я думал, что это может быть связано с неправильными смещениями, но тогда почему записи будут правильно перечислены?
Спасибо !