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

从头文件计算linux核心文件大小,linux,elf,coredump,Linux,Elf,Coredump,我正在尝试编写C代码,根据它的ELF头计算Linux核心转储文件的大小。这是必需的,因为我要将它通过管道传输到STDIN,并且需要传递它,首先指定它的大小,而不实际将它写入文件。将整个文件读取到内存中也不是一个选项 首先,我要查看核心转储标题: ELF Header: Magic: 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data:

我正在尝试编写C代码,根据它的ELF头计算Linux核心转储文件的大小。这是必需的,因为我要将它通过管道传输到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字节。我遗漏了什么?

设法解决了这个问题。由于核心文件仅由头和段组成,因此可以通过获取偏移量最大的程序头并向其添加文件大小来计算总体文件大小

例如,如果您通过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

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

这是不可能的,因为

  • 通过动态链接,您有许多不同的
    ELF
    标题,每个共享库都会影响最终的
    core
    文件大小,以及
  • 动态分配的内存(通常是核心转储的最重要部分)根本不由
    ELF
    头描述,可以比可执行文件中的任何
    数据大10、100或1000倍
但是,如果您已成功停止可执行文件并有权访问其
/proc/$pid/maps
,则可以确定核心大小:这个答案完全错误,问题的前提是错误的。