从头文件计算linux核心文件大小

时间:2016-02-07 12:10:01

标签: linux elf coredump

我试图编写将根据它的ELF标头计算Linux核心转储文件大小的C代码。这是必需的,因为我将它传送到STDIN并需要传递它,首先指定它的大小,而不是实际将其写入文件。将整个文件读入内存也不是一种选择。

首先,我正在研究核心转储标题:

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字节。我错过了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

我正在尝试编写将根据其ELF标头计算Linux核心转储文件大小的C代码。

这是不可能的,因为

  • 通过动态关联,您有多个不同的ELF标头,每个共享库都会对最终的core文件大小做出贡献,并且
  • 动态分配的内存(通常是核心转储中最重要的部分)并未在ELF标题所有中描述,并且可以是10,比可执行文件中的任何.data大100或1000倍。

但是, 可以确定核心大小,如果您已设法停止可执行文件并且可以访问其{{1} }:google userspace coredumper正是这样做的。