2016-02-07 44 views
1

我正在尝试编写基于它的ELF头文件来计算Linux核心转储文件大小的C代码。这是需要的,因为我将它传递给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

我想编写基于它的ELF头部计算Linux核心转储文件大小的C代码。

这是不可能做到的,因为

  • 与动态链接,你有许多不同ELF头,并且每个共享库将有助于最终core文件大小和
  • 动态分配的内存(通常是最重要的核心转储的一部分)没有被描述为ELF在所有,并且可以是10,1比可执行文件中的任何.data大00或1000倍。

然而,可以确定核心尺寸如果您已成功地阻止可执行访问其/proc/$pid/maps:在google userspace coredumper正是这么做的。