Раздел примечаний к дампу ядра

После моего вопроса осоздание файла дампа ядра вручнуюЯ решил погрузиться в это и запачкать руки.

Я могу построить базовую структуру дампа ядра и получить свою мертвую программу.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

Есть ли у кого-нибудь какие-либо подсказки или объяснения, почему мои записи заметок не читаются должным образом? Я думал, что это может быть связано с неправильными смещениями, но тогда почему записи будут правильно перечислены?

Спасибо !

Ответы на вопрос(3)

Ваш ответ на вопрос