2016-02-07 2 views
1

Я пытаюсь написать код C, который будет вычислять размер файла дампа ядра Linux на основе его заголовка ELF. Это необходимо, так как я получаю его в STDIN и ему нужно его передать, указав его размер сначала, не записывая его в файл. Чтение всего файла в память также не является вариантом.Вычисление размера файла ядра linux из заголовков

Прежде всего, я ищу в заголовок дампа памяти:

ELF Header: 
    Magic: 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, big endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        CORE (Core file) 
    Machine:       MIPS R3000 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   0 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   257 
    Size of section headers:   0 (bytes) 
    Number of section headers:   0 
    Section header string table index: 0 

There are no sections in this file. 

There are no sections to group in this file. 

Далее я читаю заголовки программ в цикле и принимая сумму всех полей FileSiz. Мое предположение состояло в том, что (размер заголовка ELF) + (размер заголовка программы) * (количество заголовков программ) + (сумма всех размеров сортировки) даст мне общий размер файла. Однако, это не так. В моем случае я получаю фактический файл размером 729088000 байт, в то время как приведенная выше математика дает мне 729054616 байт. Что мне не хватает?

ответ

1

Устранено проблема. Общий размер файла можно вычислить, взяв заголовок программы с наибольшим смещением и добавив к нему размер файла, поскольку основной файл состоит только из заголовков и сегментов.

E.g. если вы читаете заголовки программ по readelf, и вы посмотрите на последние записи:

LOAD   0x00000000287d0000 0x000000557d5c0000 0x0000000000000000 
       0x0000000002730000 0x0000000002730000 RW  10000 
    LOAD   0x000000002af00000 0x000000557fcf0000 0x0000000000000000 
       0x0000000000010000 0x0000000000010000   10000 
    LOAD   0x000000002af10000 0x000000557fd00000 0x0000000000000000 
       0x00000000007f0000 0x00000000007f0000 RWE 10000 
    LOAD   0x000000002b710000 0x000000ffffe70000 0x0000000000000000 
       0x0000000000040000 0x0000000000040000 RW  10000 

Затем размер файла или дамп на самом деле будет 0x2b710000 + 0x40000

+0

Этот ответ полностью * неправильный, и предпосылка вопроса ложна. –

0

Пытаюсь написать код C, который будет вычислять размер файла дампа ядра Linux на основе его заголовка ELF.

Это невозможно сделать, потому что

  • с динамической компоновкой, у вас есть много различных ELF заголовков, и каждая общая библиотека будет способствовать окончательному core размера файла и
  • динамически выделенная память (обычно наиболее важная часть основного дампа) не описывается ELF заголовком вообще и может быть 10, 1 00 или 1000 раз больше любого .data от исполняемого файла.

Однако является можно определить размер ядра если вам удалось остановить исполняемый и имеет доступ к своему /proc/$pid/maps: google userspace coredumper делает именно это.